Autor
|
Tema: Como comprobar si mi código asm ha cambiado? (Leído 7,966 veces)
|
Mad Antrax
|
Hola, vengo con una pregunta un tanto rara.
Me gustaría saber, si existe alguna forma para comprobar X offsets de un ejecutable.
Es decir, un programa que se auto-desensamble y compruebe si parte de su código ha sido modificado o no (una simple comprobación CRC de un array de bytes o comprobar byte por byte, por ejemplo)
Supongamos que conozco exactamente el offset de mi ejecutable que contiene un salto condicional crítico. Dicho offset debería tener un JE, ejemplo:
013B1CE5 74 0C JE SHORT Bioshock.013B1CF3
Que API's debería utilizar para leer el offset 013B1CE5 y comprobar si tiene el byte 74 o 75?
Digamos que la comprobación no la quiero hacer en el propio ejecutable, si no cuando está ejecutándose (en memoria).
|
|
|
En línea
|
No hago hacks/cheats para juegos Online. Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
Lo mejor sería hacer la suma de comprobación del bloque de memoria crítica. Bastaría con leer la memoria del proceso a proteger con ReadProcessMemory() y tras realizar el checksum comparar. En caso de que hubiese discrepancia y pretendieses reparar la zona de memoria lo adecuado sería suspender el hilo de ejecución con SuspendThread() y después de WriteProcessMemory() resumirlo con ResumeThread().
En caso de que sólo quieras proteger la memoria del proceso durante la ejecución puedes meter un breakpoint de escritura en ese zona de memoria.
|
|
|
En línea
|
|
|
|
Mad Antrax
|
Lo mejor sería hacer la suma de comprobación del bloque de memoria crítica. Bastaría con leer la memoria del proceso a proteger con ReadProcessMemory() y tras realizar el checksum comparar. En caso de que hubiese discrepancia y pretendieses reparar la zona de memoria lo adecuado sería suspender el hilo de ejecución con SuspendThread() y después de WriteProcessMemory() resumirlo con ResumeThread().
En caso de que sólo quieras proteger la memoria del proceso durante la ejecución puedes meter un breakpoint de escritura en ese zona de memoria.
Gracias por contestar, vamos por partes: No necesito reparar la zona de memoria modificada, así que el suspendthread y writeprocessmemory no lo necesitaría. Solo quiero leer un bloque de offsets y comprobar, si no coinciden finalizar la ejecución del programa y listo. Ahora mismo estoy fuera, en un par de horas estaré en mi casa. Compilo un ejemplo de código y te digo los offsets que quiero comprobar, a ver si me puedes dar un ejemplo hecho (en VB6), te parece? Por mi parte, ayer estuve haciendo pruebas con ReadProcessMemory, pero no logré objeter los bytes que correspondian al offset, supongo que lo hice mal a la hora de pasar los parámetros a la API, por eso necesito tu ayuda a modo de ejemplo Te envio MP cuando lo tenga
|
|
|
En línea
|
No hago hacks/cheats para juegos Online. Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.
|
|
|
Mad Antrax
|
Vale, ya estoy aqui, te dejo un ejemplo muy sencillo para que pueda aprender. Tras analizar el código en OllyDbg, el offset que quiero proteger es el siguiente: 00401C7E 74 44 JE SHORT ejemplo.00401CC4 Teniendo en cuenta que la Base es 00401000 o a veces es 00403000 puedo deducir que el offset es: BASE+1C7E ¿lo digo bien? Bueno, pues lo que quiero es un simple timer que compruebe el valor del offset BASE+1C7E y verifique si ha cambiado. Suena sencillo, pero me estoy dando hostias contra un muro que no veo, no se hacerlo xD. Luego, para rizar el rizo, como comprobar un grupo de offsets, por ejemplo: 00401C21 7D 12 JGE SHORT ejemplo.00401C35 00401C23 68 A0000000 PUSH 0A0 00401C28 68 101A4000 PUSH ejemplo.00401A10 00401C2D 57 PUSH EDI 00401C2E 50 PUSH EAX 00401C2F FF15 14104000 CALL DWORD PTR DS Puedes ayudarme? Te dejo el link del ejecutable de prueba: http://www.mediafire.com/?jle3dupeb7sbmmw
|
|
|
En línea
|
No hago hacks/cheats para juegos Online. Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
Option Explicit 'KERNEL32 Private Declare Function OpenProcess Lib "KERNEL32" (ByVal dwDA As Long, ByVal bIH As Integer, ByVal dwPID As Long) As Long Private Declare Sub CloseHandle Lib "KERNEL32" (ByVal hObject As Long) Private Declare Function ReadProcessMemory Lib "KERNEL32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long 'NTDLL Private Declare Function NtQueryInformationProcess Lib "NTDLL" (ByVal ProcessHandle As Long, ByVal InformationClass As Long, ByRef ProcessInformation As Any, ByVal ProcessInformationLength As Long, ByRef ReturnLength As Any) As Long Private Const PROCESS_VM_READ As Long = &H10 Private Const PROCESS_QUERY_INFORMATION As Long = &H400 Private Const ProcessBasicInformation = 0 Private Type PROCESS_BASIC_INFORMATION ExitStatus As Long PebBaseAddress As Long AffinityMask As Long BasePriority As Long UniqueProcessId As Long InheritedFromUniqueProcessId As Long End Type Private Const MY_REL_POS As Long = &H1C7E Private Const MY_SIZE As Long = &HF Sub Main() Dim lPID As Long Dim hProc As Long Dim bvBuf() As Byte Do lPID = Val(InputBox("PID a proteger?")) Loop Until lPID > 0 hProc = OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, False, lPID) If hProc Then ReDim bvBuf(0 To MY_SIZE) If ReadProcessMemory(hProc, GetBaseAddr(hProc) + MY_REL_POS, bvBuf(0), MY_SIZE, ByVal 0&) Then Debug.Print Hex$(bvBuf(0)) End If Call CloseHandle(hProc) End If End Sub Private Function GetBaseAddr(ByVal hProc As Long) As Long Dim PBI As PROCESS_BASIC_INFORMATION Call NtQueryInformationProcess(hProc, ProcessBasicInformation, PBI, Len(PBI), Len(PBI)) If PBI.PebBaseAddress Then Call ReadProcessMemory(hProc, PBI.PebBaseAddress + 8, GetBaseAddr, 4, ByVal 0) End If End Function
La obtención del BaseAddr del proceso no funcionará si el proceso es de 64bits.
|
|
|
En línea
|
|
|
|
Mad Antrax
|
Muchisimas gracias, voy a probarlo ahora mismo, tengo que hacer pruebas con el código que me ofreces, pero pinta perfecto Gracias de nuevo
|
|
|
En línea
|
No hago hacks/cheats para juegos Online. Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.
|
|
|
MCKSys Argentina
|
Si no entendí mal, el EXE se comprobaría a si mismo, por lo que ReadProcessMemory no seria necesario. Bastaria con un "GetMem" de la direccion en concreto y listo... O bien, entendí mal...
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
Mad Antrax
|
Si no entendí mal, el EXE se comprobaría a si mismo, por lo que ReadProcessMemory no seria necesario. Bastaria con un "GetMem" de la direccion en concreto y listo... O bien, entendí mal... Sí, el propio EXE se comprueba a si mismo. No conozco la API GetMem...
|
|
|
En línea
|
No hago hacks/cheats para juegos Online. Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
Pensé que querías proteger desde otro proceso Private Declare Sub GetMem4 Lib "MSVBVM60" (ByVal Addr As Long, RetVal As Long)
|
|
|
En línea
|
|
|
|
MCKSys Argentina
|
Bueno, estaba buscando los "hacks" de Karcrack y me doy cuenta que es él quien estaba respondiendo asi que nada que hacer por estos lados... PD @||MadAntrax||: Seguro lo sabes pero te recuerdo que esa "API" lee 4 bytes (1 DWORD). Saludos!
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
¿cómo saber si un documento word ha cambiado?
Programación Visual Basic
|
Ragnarok
|
3
|
5,506
|
17 Julio 2007, 21:28 pm
por Hendrix
|
|
|
comprobar si este codigo en batch esta bien
Scripting
|
blha
|
0
|
2,305
|
11 Septiembre 2008, 16:19 pm
por blha
|
|
|
Del PC clásico a la era móvil: ¿Cómo ha cambiado el precio de los sistemas ....
Noticias
|
wolfbcn
|
0
|
1,808
|
24 Marzo 2013, 01:36 am
por wolfbcn
|
|
|
Como comprobar registro
Scripting
|
tomasscfgcu
|
2
|
2,600
|
3 Mayo 2015, 17:35 pm
por tomasscfgcu
|
|
|
Cómo la tecnología ha cambiado a nuestros abuelos: ¡adiós a la boina y a la ...
Noticias
|
wolfbcn
|
0
|
1,146
|
1 Octubre 2016, 14:36 pm
por wolfbcn
|
|