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.