Escribe una memoria parche con el ejemplo de lenguaje ensamblador de 32 bits

  Hoy blog es para revisar el contenido antes de mirar.

  Hay una gran cantidad de software agrietada en la red, originalmente una orden de pago y deben descifrar el software después de que se convierte en hermano mayor no puede tener el dinero. El proceso de la grieta es ciertamente muy difícil, algunos de los bombardeos el proceso inverso es evidente. Y aquí acabo de escribir un nivel hola worid del programa y, a continuación, es la introducción de cómo utilizar ReadProcessMemory función y WriteProcessMemory funciones para leer y operaciones de escritura del espacio de direcciones de memoria de un proceso.

  Para llevar a cabo diversas acciones en un proceso, entonces, ciertamente, la más básica es conseguir primero una manija en el proceso. Hay muchos proceso de obtención de un mango manera, se puede CreateProcess función, puede también obtiene el identificador de la ventana por el nombre de la clase y el título de las ventanas abiertas proceso de destino, y luego sacar el proceso de apertura de Identificación de la ventana a través de la manija de la ventana, y luego a través de la Identificación conseguir una manija en el proceso. (La buena problemas ah) Otra forma es obtener una instantánea de la función instantánea del sistema de proceso actual, y luego encontrar el proceso de destino.

  Estos tres métodos anteriores, el primero es nuestra función para abrir el proceso de destino con su propio proceso, entonces la función devuelve el identificador del proceso de destino. Ese proceso se ha convertido en el proceso hijo objetivo de nuestro propio proceso. Ambos métodos están detrás del proceso ya existe, entonces vamos a conseguir una manija. Pero la combinación que desee simular un software sub-sub-agrietamiento. Queremos ser es abrir nuestro parche, y luego el programa automáticamente nos ayudará a sentar el parche, y luego abrir el programa de destino. Si el proceso ha estado en existencia, entonces podemos ir a problemas de parches, ya que algunos pueden haber sido parcheado para funcionar otra vez, y ya hay por lo general el primero en poner una cosa volver a ejecutar. El CreateProcess después de la función dentro de los parámetros se puede especificar para crear el proceso, el hilo principal del proceso en un estado de suspensión, y esta vez podemos parche lleva a cabo la operación. Por lo que utilizar CreateProcess función para crear el proceso de destino.

  Hola mundo aquí para dar a este nivel de código fuente del programa

1              . 386 
2              .model plana, stdcall
 3              casemap opción: ninguno
 4 ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 5  incluir windows.inc
 6  incluyen user32.inc
 7  INCLUDELIB User32.lib
 8  incluir kernel32.inc
 9  INCLUDELIB kernel32.lib
 10 ; >>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> 11              . const 
12 szErr db         ' 对不起,你使用的是盗版软件', 0 
13 szOK db         ' Gracias por el uso de software legítimo ' , 0 
14 db szCaption         ' gracias ' , 0 
15              .code
 16  Inicio:
 17          xor eax, eax
 18          o EAX, EAX
 19          je @F
 20          la invocación de mensaje, NULL, addr szOK , \
 21                  addr szCaption, MB_OK
 22          JMP loc_1
 23          @@:
 24-          la Invoke MessageBox, NULL, addr szErr, NULL, \
 25                 MB_OK o MB_ICONSTOP
 26          loc_1:
 27          invoke ExitProcess, NULL
 28 Inicio Fin

   El programa determina si después de despejado 0 EAX EAX es 0, si no se visualiza 0 ventana "piratas", no en la ventana de visualización utilizando genuina. Así que aquí está la ventana mostrará la piratería. Entonces tenemos que hacer es usar esas dos funciones para leer y espacio de direcciones de proceso de escritura, dijo antes de que el espacio de direcciones del proceso de código alterado, deje que se vea ventana verdadero.

  Ahora queremos determinar dónde se cambia el código. Debido a que esas dos funciones para leer y escribir a la dirección en el proceso de destino para leer y escribir las instrucciones de uso, por lo que tenemos que conocer la dirección del código en el proceso de destino.

  ¿Qué partes de los cambios en el código, el bien está decidido (para este programa es). Podemos saltar directamente que la línea 19 se cambió para saltar a la aplicación de una verdadera ventana local de abajo, o directamente a la instrucción retirado, es sustituido por nop. O por otros medios, aquí la selección nop lleno, ya que es relativamente simple.

  Pues bien, ahora determinar cuál de código ha sido modificado, y el resto es para determinar la dirección que desea modificar el código. Así que vamos a cambiar el programa de desmontarlo:

 

   Esto está muy por encima del programa después del desmontaje. Podemos ver el comando que desea modificar la dirección es: 00401004 , y las instrucciones son de 16 bits, y nop 8 bits (código de máquina nop es 90h), por lo que nosotros queremos llenar dos nop. Aquí debemos señalar que esta dirección es la dirección lineal, no un programa en el que la dirección de memoria real, cada vez que se ejecuta el programa que esta dirección lineal, por lo que no se preocupe por la dirección puede cambiar. Pero si la DLL no es lo mismo. Debido a que un programa que se puede cargar en una serie de DLL, el DLL puede ser cargado dirección de esta sugerencia, pero es hora de buscar otro DLL cargado se ha cargado en él, y que sólo puede cambiar la dirección. Este tiempo se puede se puede ver observando la posición de carga de mesa DLL de la importación del archivo real de PE, pero en realidad no hay suficiente luz para ver, esto sólo puede obtener la dirección de la función dentro de la DLL, que tiene la cabeza en las proximidades de la función de exploración de esta DLL, es un archivo PE cabecera, y luego para determinar la ubicación.

  Utilizamos las dos funciones es la dirección lineal, a fin de utilizar la dirección de desmontar la pantalla no es ningún problema. Luego nos dicen sobre el uso de estas dos funciones.

  

invoke ReadProcessMemory, hProcess, lpBaseAddress, lpBuffer, dwSize, lpNumberOfBytesRead 
invocación WriteProcessMemory , hProcess, lpBaseAddress, lpBuffer, dwSize, lpNumberOfBytesRead

 

  Esta función lee la memoria del proceso. La función tiene éxito y devuelve un valor no cero, los parámetros se definen de la siguiente manera:

  • hProcess : Este parámetro especifica el identificador del proceso de destino.
  • lpBaseAddress : en el proceso de destino para escribir la dirección de inicio lineal (por ReadProcessMemory) o la dirección de inicio de la rosca (para WriteProcessMemory) en el proceso de destino para ser escrito.
  • la lpBuffer : Este parámetro apunta a una memoria intermedia para recibir datos de lectura en el proceso de destino (por ReadProcessMemory). Puntos a un tampón, tampón de datos que ha de ser escrita (por WriteProcessMemory).
  • dwSize : número de bytes a leer o escribir.
  • lpNumberOfBytesRead : Este parámetro hace referencia a una variable de palabra doble, la función devolverá el número de bytes realmente leer y escribir en él, puede ser especificado como datos NULL si no se preocupa por esto.

  A continuación, usted notará es que utilizamos CreateProcess cuando el proceso de creación de una función, para especificar PROCESS_VM_READ y PROCESS_VM_WRITE parámetros, por lo que podemos leer y escribir en el espacio de direcciones del proceso.

  Y después de que el trabajo preparatorio de la anterior para escribir un programa simple que mucho más fácil. El flujo del programa es probablemente el primer uso CreateProcess para crear una función de nuestro proceso objetivo y los parámetros dentro de los parámetros dwFlags para especificar el proceso que acaba de crear serán los principales cuelga del hilo, a continuación, utilizar la función ReadProcessMemory lee los datos, y luego prueba para ver si somos un dato que cambió, esta versión del programa es prevenir la misma situación no se plantea, por supuesto, en este procedimiento no sería problema de este tipo a. Finalmente, si no hay error, utilice la función WriteProcessMemory para datos de escritura, entonces el hilo principal del proceso de recuperación. De lo contrario, parar el proceso y muestra un mensaje de error.

  Aquí está el código para este simple trozo de programa simple:

1                  . 386 
2                  .model plana, stdcall
 3                  casemap opción: ninguno
 4 ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>
 5  ; Incluir
 6 ; >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>
     >>>>>>>>>>>> 15 PATCH_POSITION 00401004h equ
 16 ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>
 17                  .data?
18 dbOldBytes db         2 dup (? );读取的数据存放的缓冲区
 19 <?> StStartUp STARTUPINFO
                   . Const 
22  dbPatch db 74h, 15H
 23  dbPatched 90H db, 90H
 24- szExecFilename db         ' test.exe ' , 0 
25 szErrExec db         ' No se puede cargar el archivo ejecutable! ' , 0 
26 szErrVersion db         ' versión del archivo ejecutable no es correcto, no se puede arreglar! ' , 0 
27 ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 28                  .code
 29  inicio:
 30; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>
 31  ;创建进程
 32 ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>> 33  invocación GetStartupInfo, addr stStartUp, obtener la información actual ventana de proceso
 34  de la invocación CreateProcess, offset szExecFilename, NULL, NULL, NULL, \; crear un proceso, el hilo principal del proceso de inicio un estado pendiente, impidiendo que el parche para modificar el código para ser interrumpido cuando las ventanas
 35          NULL, o NORMAL_PRIORITY_CLASS CREATE_SUSPENDED, 0 , 0 , \ 36          compensar stStartUp, offset stProcInfo 37 [ . IF         EAX 38 esEl hilo principal para crear un proceso, el proceso de comenzar a colgar, para evitar que el parche cuando se modifica el código para ser interrumpido VENTANAS 35 NULL, NORMAL_PRIORITY_CLASS o CREATE_SUSPENDED, 0 , 0 , \ 36 desplazamiento stStartUp, offset stProcInfo 37 . SI EAX 38El hilo principal para crear un proceso, el proceso de comenzar a colgar, para evitar que el parche cuando se modifica el código para ser interrumpido VENTANAS 35 NULL, NORMAL_PRIORITY_CLASS o CREATE_SUSPENDED, 0 , 0 , \
 36 desplazamiento stStartUp, offset stProcInfo
 37 . SI EAX
 38; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>
 39  ;读进程内存并验证内容是否正确
 40 ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>
>>>>>>>>>>>>>> 41 es          invocación ReadProcessMemory, stProcInfo.hProcess, \; la posición inicial de leer 4 bytes desde la entrada del programa, es decir donde el comando de salto
 42 es                  PATCH_POSITION, addr dbOldBytes, 2 , NULL 43 es          . IF         EAX 44 es                  MOV AX, PTR dbOldBytes Palabra 45                  . IF         AX == Palabra PTR dbPatch; verificar la información de versión2 , NULL 43 es . IF EAX 44 es MOV AX, PTR dbOldBytes Palabra 45 . IF AX == Palabra PTR dbPatch; verificar la información de versión2 , NULL
 43 es . IF EAX
 44 es MOV AX, PTR dbOldBytes Palabra
 45 . IF AX == Palabra PTR dbPatch; verificar la información de versión
46 se                          Invoke WriteProcessMemory, stProcInfo.hProcess, \
 47                                  PATCH_POSITION, addr dbPatched, 2 , NULL; código modificado para ser escrito
 48                          Invoke para ResumeThread, stProcInfo.hThread; proceso de recuperación en el hilo principal
 49                  . El otro 
50                          Invoke la TerminateProcess, stProcInfo.hProcess, - 1     ; si una versión incorrecta del proceso de terminación
 51                          del Invoke MessageBox, NULL, addr szErrVersion, \
 52                                  NULL, MB_OK o MB_ICONSTOP
 53                  .endif
 54          .endif
 55; ************************************************* ************************************************** *******
 56          la Invoke la CloseHandle, stProcInfo.hProcess
 57          la Invoke la CloseHandle, stProcInfo.hThread; cerrada y la manija proceso abierto su mango de rosca
 58 . el otro 
59          la Invoke MessageBox, NULL, addr szErrExec, NULL, \
 60                  MB_OK o MB_ICONSTOP
 61 es  .endif
 62 es  invocar la ExitProcess, NULL
 63 es  
64 Fin Inicio

   Los dos programas son compilados y enlazados para ejecutar el programa de destino:

 

  Claro, información en pantalla la piratería. A continuación, se corre directamente parche:

 

   OK, el éxito. Pero debemos prestar atención para modificar el archivo de datos en la memoria, y no modifica el archivo de datos en sí, por lo que la próxima vez que aún se llevará a cabo directamente ventana de la piratería.

 

Supongo que te gusta

Origin www.cnblogs.com/hznhh/p/12589223.html
Recomendado
Clasificación