Hola! Como va, estoy desarrollando un programa y me gustaría saber si es posible hacer que todas las llamadas estáticas a APIs se conviertan en dinámicas, es decir, poder cargarlas en tiempo de ejecución. La razón es que quiero obfuscar las apis para que no aparezcan adentro del ejecutable si uno lo abriese con un editor hexadecimal. Hay alguna manera de hacer esto que no sea manualmente hacer todas las llamadas en el código??
Un abrazo
APOKLIPTICO.
Si es posible... hay varios metodos de obtener la direccion base del Kernel, luego de esto obtener GetProcAddress y LoadLibrary; despues de eso simplemente es obtener las APIs que necesitas.
Sisi, obvio, pero mi pregunta es si hay alguna manera de automáticamente modificar en el código los linkeos estáticos por dinámicos, de esta manera se pueden obfuscar las llamadas para que no se puedan leer fácilmente si uno abre el ejecutable con un visor hexadecimal.
UPX (http://upx.sourceforge.net/).
Mi idea es que no sea tan fácilmente visible. Aparte no me gusta mucho trabajar con UPX porque hace saltar falsos positivos en algunos AV. Lo que quiero es obfuscarlos en tiempo de diseño y desobfuscarlos cuando arranque el programa sólo para cargar las funciones necesarias.
Hola APOKLIPTICO, no se si usás Visual Studio, pero te muestro una imagen del Visual C++ 6.0 que lo tengo para algunas cosas, en verdad uso el 2010 por supuesto. pero te muestro algo, más la explicación de la msdn
(http://img839.imageshack.us/img839/9433/multia.png) (http://imageshack.us/photo/my-images/839/multia.png/)
http://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.80).aspx (http://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.80).aspx)
http://msdn.microsoft.com/en-us/library/aa278396(v=vs.60).aspx (http://msdn.microsoft.com/en-us/library/aa278396(v=vs.60).aspx)
en mi caso usé ese modo obviamente para el tamaño del ejecutable en cuestión, pero vos sabrás usar ese modo para tu conveniencia..
espero haberte ayudado
Pero .... es al pedo, estás cambiando de donde hay que fijarse que APIs usás.
No lo estás ni ocultando ni ofuscando.
Saludos.
¿En que consiste UPX?
Gracias
Cita de: тαптяαпсє en 6 Agosto 2012, 10:09 AM
¿En que consiste UPX?
Gracias
Fijate aca:UPX (http://lmgtfy.com/?q=upx&l=1).
Cita de: Eternal Idol en 6 Agosto 2012, 10:20 AM
Fijate aca:UPX (http://lmgtfy.com/?q=upx&l=1).
¿Gracias?
Cita de: тαптяαпсє en 6 Agosto 2012, 12:44 PM
¿Gracias?
Si la proxima vez buscas antes de preguntar de nada ;)
Cita de: Alex Mtx en 6 Agosto 2012, 03:20 AM
Pero .... es al pedo, estás cambiando de donde hay que fijarse que APIs usás.
No lo estás ni ocultando ni ofuscando.
Saludos.
Si en vez de cargarlas en tiempo de diseño las APIs, lo cual se puede ver con depends o algún otro programa que vea las funciones que importa el programa, se cargan dinámicamente en tiempo de ejecución, estos ya no aparecen. Si uno abre con un editor hexadecimal el ejecutable, va a haber en la parte de los strings las apis. Si uno lo cifra y luego lo descifra en tiempo de ejecución, sólo se va a poder saber esto si se debuggea el programa, si uno evita que el programa se pueda debuggear o emular, no hay manera de saber qué APIs se cargan.
Cita de: APOKLIPTICO en 7 Agosto 2012, 02:58 AM
Si en vez de cargarlas en tiempo de diseño las APIs, lo cual se puede ver con depends o algún otro programa que vea las funciones que importa el programa, se cargan dinámicamente en tiempo de ejecución, estos ya no aparecen. Si uno abre con un editor hexadecimal el ejecutable, va a haber en la parte de los strings las apis. Si uno lo cifra y luego lo descifra en tiempo de ejecución, sólo se va a poder saber esto si se debuggea el programa, si uno evita que el programa se pueda debuggear o emular, no hay manera de saber qué APIs se cargan.
Tanto baile .... para hookear un par de funciones (o más fácil? correr el binario sobre wine con APIs modificadas, menos drama), y saltearse todo el asunto del depurador ... Apenas se vea LoadLibrary() y GetProcAddress() en la tabla y "garbage" en el editor, unx sabe en dónde esperar la versión descifrada de ese garbage.
Saludos.
P.S → Lo del cifrado no lo habías mencionado, aún así sigue siendo al pedo.
Bueno, pero eso sumado a técnicas anti emulacion, evita que sea detectado.
Cita de: APOKLIPTICO en 7 Agosto 2012, 17:46 PM
Bueno, pero eso sumado a técnicas anti emulacion, evita que sea detectado.
Seguís dependiendo de lo que hay debajo de tus pies para sustentar todo el boliche (mi mensaje sigue siendo válido para esto que acabas de acotar), pero como gustes ... se vé que no aprendimos nada de la industria de los videojuegos. Eso o queremos un mejor marketing :D
La idea de obfuscar las llamadas a las API es para que no se pueda rápidamente saber qué APIs están siendo cargadas. Es para evitar heurística y firmas.
Cita de: APOKLIPTICO en 7 Agosto 2012, 17:58 PM
La idea de obfuscar las llamadas a las API es para que no se pueda rápidamente saber qué APIs están siendo cargadas. Es para evitar heurística y firmas.
esta idea es para considerar APOKLIPTICO, resolvería el tema de los imports
Cita de: [L]ord [R]NA en 29 Julio 2012, 15:27 PM
Si es posible... hay varios metodos de obtener la direccion base del Kernel, luego de esto obtener GetProcAddress y LoadLibrary; despues de eso simplemente es obtener las APIs que necesitas.
Cita de: APOKLIPTICO en 7 Agosto 2012, 02:58 AM
Si en vez de cargarlas en tiempo de diseño las APIs, lo cual se puede ver con depends o algún otro programa que vea las funciones que importa el programa, se cargan dinámicamente en tiempo de ejecución, estos ya no aparecen. Si uno abre con un editor hexadecimal el ejecutable, va a haber en la parte de los strings las apis. Si uno lo cifra y luego lo descifra en tiempo de ejecución, sólo se va a poder saber esto si se debuggea el programa, si uno evita que el programa se pueda debuggear o emular, no hay manera de saber qué APIs se cargan.
sobre eso que te dijeron de usar apis modificadas, podés usar tu propia GetProcAddress y tu propia LoadLibrary.
y recordá que programas que actuén en modo ring 0 pueden igualmente detectar o determinar si creás un hilo remoto o si cargás una dll, no necesitan solamente spoofear tus llamadas a apis a nivel usuario
Hola,
Creo que automáticamente no puedes hacerlo pero sí a mano, debes definir punteros a funciones de cada API a cargar dinámicamente y luego asignarle la dirección de la función que debes obtener bien con GetModuleHandle, GetProcAddress, EAT, etc.
Un saludo,
Iván Portilla.
http://foro.elhacker.net/analisis_y_diseno_de_malware/clase_encryptapi_haz_tus_codigos_indetectables_facilmente-t255039.0.html
Saludos