2012-04-26 26 views
12

Realmente no entiendo cómo moverse por IsDebuggerPresent. Creo que se supone que debo encontrar los registros utilizados para la depuración y luego configurarlo en 0 para engañar a IsDebuggerPresent, pero no sé cómo hacerlo. Intenté buscar en Google e incluso intenté algunas soluciones, pero en realidad no funcionó. ¿Podría alguien explicarme cómo debería funcionar esto y cómo evitarlo?¿Cómo eludir IsDebuggerPresent con OllyDbg?

+0

¿Has probado los complementos olly como [Ocultar depurador] (https://tuts4you.com/download.php?view.57) o [Olly Advanced] (https://tuts4you.com/download.php? view.75)? estos son mucho más fáciles de usar en lugar de modificar manualmente el código cada vez. – Arash

Respuesta

21

Hay muchas formas de hacerlo. Como dijiste, es posible parchear el bloque de hilos del programa. Aquí hay un tutorial, cómo moverse IsDebuggerPresent, simplemente remendar esta función por lo que siempre devuelve 0.

1) localizar IsDebuggerPresent

OllyDbg 1

En mi situación, es por lo 7664EFF7, y consisten de solo tres instrucciones + una RET. Lee el bloque de subprocesos (la dirección está en FS: 18) y luego localiza el byte que dice "me están depurando" y lo devuelve. El valor de devoluciones se almacena en EAX (como para la mayoría de las funciones de WINAPI). Si modifico la función para que al final tenga EAX = 0, habrá superado con éxito IsDebuggerPresent.

2) parche

Ahora, la forma más fácil de hacerlo es simplemente hacer la función simplemente hacer una instrucción MOV EAX, 0 y luego un RETN:

OllyDbg 2

Tenga en cuenta que también llena el resto de la función con NOP para evitar cambiar el tamaño de la misma. Probablemente no sea necesario, también puede hacer MOV EAX, 0 y luego solo RETN.

También debe saber que la modificación solo es válida para una ejecución del programa. Cuando lo reinicie, cargará una nueva copia de kernel32.dll (donde se encuentra IsDebuggerPresent) con la función original, y tendrá que volver a aplicar el parche. Si desea que el parche sea permanente, debe modificar el binario de inicio y modificar/eliminar la llamada a esta función. Pero antes de hacerlo, también debe asegurarse de que el binario no se revise a sí mismo para ver si hay modificaciones.

+0

¿Hay alguna manera de buscar el código para "FS"? Además, veo varias instancias de IsDebuggerPresent ... En realidad, ni siquiera estoy realmente seguro de cómo puedo encontrar 'FS' y el lugar correcto para eliminarlo. En todas partes, veo 'MOV DWORD PTR', p. 'MOV DWORD PTR FS: [0], EAX' y' MOV EAX, DWORD PTR DS: [13000] ' – Strawberry

+0

Lo acabo de encontrar siguiendo las llamadas a la función. Además, entendí que IsDebuggerPresent generalmente se usa para agregar basura para desordenar cada idea. ¿Debo guardarlo después de cambiar el 'EAX = 0' y luego volver a abrirlo, para que no cargue basura? No estoy muy seguro de cómo funciona, lo siento! – Strawberry

+1

Solo debe haber un lugar, donde se defina IsDebuggerPresent, dentro de kernel32.dll. Puede haber muchas * llamadas *, pero si aplica la función de parche, todas las llamadas recibirán "0" como respuesta. Debe aplicar el parche antes de ejecutar el programa, y ​​debe aplicarlo cada vez que lo ejecute. – kuba

9

inyectar este código en su proceso:

mov eax,dword ptr fs:[18] 
mov eax,dword ptr ds:[eax+30] 
mov byte ptr ds:[eax+2],0 

Esto le parchear el PEB.BeingDebuggedflag, asegurando IsDebuggerPresent siempre devuelve 0

Al utilizar x64dbg puede ejecutar el comando dbh.

6

si desea que su aplicación nunca comprobarlo hacer esto:

  • Prensa Alt + e o abierta Executable modules ventana.
  • Seleccionar C:\WINDOWS\system32\kernel32.dll y pulse ctrl + N
  • IsDebuggerPresent seleccione y pulse ENTER.
  • presione f2
  • ejecute el programa y espere la interrupción de su programa en este código de operación.
  • presione algunos f8 hasta que regrese a su código.
  • mirando hacia arriba para algo así como TEST EAX,EAX y después de algo como je jnz y etc, tenga cuidado de la salida de IsDebuggerPresent se guarda en EAX.
  • si salta en este código de operación cámbielo a nop y si no lo hace cambie a jmp.
  • guarde su programa. si no sabe cómo guardar el código modificado en ollyDBG, simplemente búsquelo.
Cuestiones relacionadas