Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: sasske en 1 Marzo 2014, 05:36 am



Título: Ayuda con la API VirtualProtect para protejer un programa
Publicado por: sasske en 1 Marzo 2014, 05:36 am
Hola a todos, primero que todo, pensé en poner este post en el foro de C++ pero como mas que todo lo quiero para proteger el programa no sabia, porque hasta donde investigue (y lo poquito que logre entender) esta API tienen infinidad de usos.

Estaba viendo algunas formas de proteger un programa y la verdad que avance bastante en esto de la protección y yo que se bastante poquito, estoy bastante emocionado y quería saber esto de lograr bloquear los BP, que hasta donde lei se puede hacer con esta API ya que evitamos que se ponga el INT3, pero seguro eso ya lo saben así que voy al caso...

Me podrían ayudar a como usar correctamente esta API, definir sus dimensiones y si se puede algun ejemplo o consejo?, se los agradecería muchísimo porque me encariñe con el tema de proteger una aplicación(va, un CrackMe)

S2 y gracias de ante mano.

PD: Y si me dicen como detectar los HBP esta mas que bueno, mas que todo saque esto del post de karmany y el resto de los métodos los investigue por mi cuenta y los logre utilizar con un muy buen resultado, pero estos 2 no.


Título: Re: Ayuda con la API VirtualProtect para protejer un programa
Publicado por: MCKSys Argentina en 1 Marzo 2014, 05:57 am
Un metodo eficaz para detectar los int3 es hacer un checksum del codigo que quieres proteger.
Luego, puedes crear un thread que realice el checksum y compare el valor obtenido con el original.
Un int3 modificaria el valor calculado.

Con los HBPs es mas complejo, pues (hablando de OllyDbg) los plugines pueden detectar y evitar a la perfeccion el borrado de los registros de debug.

Saludos!


Título: Re: Ayuda con la API VirtualProtect para protejer un programa
Publicado por: sasske en 1 Marzo 2014, 07:01 am
Un metodo eficaz para detectar los int3 es hacer un checksum del codigo que quieres proteger.
Luego, puedes crear un thread que realice el checksum y compare el valor obtenido con el original.
Un int3 modificaria el valor calculado.

Con los HBPs es mas complejo, pues (hablando de OllyDbg) los plugines pueden detectar y evitar a la perfeccion el borrado de los registros de debug.

Saludos!

Me darias un ejemplo de este metodo para C++?

Gracias por la respuesta :)


Título: Re: Ayuda con la API VirtualProtect para protejer un programa
Publicado por: .:UND3R:. en 1 Marzo 2014, 07:56 am
VirtualProtect te serviría específicamente para aludir bp on memory, ya que estos dejan de funcionar cuando se modifica el permiso de una sección. Durante el arranque podrías ir cambiando los permisos, aun así quedan los BP int3 y hardware breakpoint, ahora en sí podrás mitigar el porcentaje de éxito de un ataque a tu aplicación aun así no esperes tener una aplicación incrackeable, es cosa de decir la palaba mágia MCKSys Argentina o Fly y el programa se autocrackea  y te da un keygen  :laugh:

Saludos y suerte


Título: Re: Ayuda con la API VirtualProtect para protejer un programa
Publicado por: MCKSys Argentina en 1 Marzo 2014, 09:26 am
Me darias un ejemplo de este metodo para C++?

Gracias por la respuesta :)

Bueno, no programo en C++ por lo que no podría darte un ejemplo concreto en ese lenguaje.
Por otro lado, lo que puedes hacer es usar, por ej. el algoritmo Adler32 (el de zlib) para calcular el checksum de una parte de tu codigo (digamos, por ej., el sector de codigo que se encarga de comprobar el serial de tu aplicacion.).
Lo que haces es pasarle Adler a los bytes de ese codigo y guardas ese valor en alguna parte (puede ser en un solo DWORD o en varias partes. Mientras mas tedioso sea, mejor.)
Luego haces una función que verifique cada tanto ese codigo con Adler (el trigger lo elijes tu. Podria ser aleatorio.). Como te dije antes, puedes hacer un thread que verifique los bytes y si encuentra una diferencia, puedes setear un flag que haga que el programa se comporte de forma extraña, que haga calculos incorrectos, en fin, que se corrompa de forma "sutil" (eso es mejor a cerrar todo. Si cierras todo, el cracker se dará cuenta de que hay algo mal!)

Otra cosa que puedes usar es codigo automodificable/autoencriptable. Por ej. partes la rutina de registracion/verificacion en partes y cada parte se descifra antes de ejecutarse y la anterior se vuelve a cifrar.

Tambien convendria que no pongas todo el codigo junto. Como te dije antes, mientras mas tedioso, mejor para ti.

Otra idea es que pongas chequeos aleatorios al serial, que no esten en la rutina principal de registracion/verificacion, pero que sean necesarios para la correcta registracion del proggie.

En fin, hay millones de cosas que puedes hacer...  :P

Saludos!


Título: Re: Ayuda con la API VirtualProtect para protejer un programa
Publicado por: sasske en 1 Marzo 2014, 16:43 pm
VirtualProtect te serviría específicamente para aludir bp on memory, ya que estos dejan de funcionar cuando se modifica el permiso de una sección. Durante el arranque podrías ir cambiando los permisos, aun así quedan los BP int3 y hardware breakpoint, ahora en sí podrás mitigar el porcentaje de éxito de un ataque a tu aplicación aun así no esperes tener una aplicación incrackeable, es cosa de decir la palaba mágia MCKSys Argentina o Fly y el programa se autocrackea  y te da un keygen  :laugh:

Saludos y suerte

Pense que para lo que me servia era para bloquear los Int3, y los hadware breackpoints si me quedaban, pero bueno e.e

PD: Ya se que no puede ser incrackeable, en algun momento tengo que checkear la key, y alguien va a sber donde, pero la cosa es hacerlo complejo :p

Bueno, no programo en C++ por lo que no podría darte un ejemplo concreto en ese lenguaje.
Por otro lado, lo que puedes hacer es usar, por ej. el algoritmo Adler32 (el de zlib) para calcular el checksum de una parte de tu codigo (digamos, por ej., el sector de codigo que se encarga de comprobar el serial de tu aplicacion.).
Lo que haces es pasarle Adler a los bytes de ese codigo y guardas ese valor en alguna parte (puede ser en un solo DWORD o en varias partes. Mientras mas tedioso sea, mejor.)
Luego haces una función que verifique cada tanto ese codigo con Adler (el trigger lo elijes tu. Podria ser aleatorio.). Como te dije antes, puedes hacer un thread que verifique los bytes y si encuentra una diferencia, puedes setear un flag que haga que el programa se comporte de forma extraña, que haga calculos incorrectos, en fin, que se corrompa de forma "sutil" (eso es mejor a cerrar todo. Si cierras todo, el cracker se dará cuenta de que hay algo mal!)

Otra cosa que puedes usar es codigo automodificable/autoencriptable. Por ej. partes la rutina de registracion/verificacion en partes y cada parte se descifra antes de ejecutarse y la anterior se vuelve a cifrar.

Tambien convendria que no pongas todo el codigo junto. Como te dije antes, mientras mas tedioso, mejor para ti.

Otra idea es que pongas chequeos aleatorios al serial, que no esten en la rutina principal de registracion/verificacion, pero que sean necesarios para la correcta registracion del proggie.

En fin, hay millones de cosas que puedes hacer...  :P

Saludos!

Muchas gracias por todas las ideas, ire investigando una por una, luego posteare mis resultados de como me fue, muchas gracias a los 2.

S2