elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: karmany, .:UND3R:., MCKSys Argentina)
| | |-+  Como comprobar si mi código asm ha cambiado?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Como comprobar si mi código asm ha cambiado?  (Leído 7,337 veces)
Mad Antrax
Colaborador
***
Desconectado Desconectado

Mensajes: 2.164


Cheats y Trainers para todos!


Ver Perfil WWW
Como comprobar si mi código asm ha cambiado?
« en: 27 Febrero 2013, 12:03 pm »

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 Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Como comprobar si mi código asm ha cambiado?
« Respuesta #1 en: 27 Febrero 2013, 13:31 pm »

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
Colaborador
***
Desconectado Desconectado

Mensajes: 2.164


Cheats y Trainers para todos!


Ver Perfil WWW
Re: Como comprobar si mi código asm ha cambiado?
« Respuesta #2 en: 27 Febrero 2013, 14:34 pm »

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 :D

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
Colaborador
***
Desconectado Desconectado

Mensajes: 2.164


Cheats y Trainers para todos!


Ver Perfil WWW
Re: Como comprobar si mi código asm ha cambiado?
« Respuesta #3 en: 27 Febrero 2013, 17:16 pm »

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 Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Como comprobar si mi código asm ha cambiado?
« Respuesta #4 en: 27 Febrero 2013, 17:58 pm »

Código
  1. Option Explicit
  2.  
  3. 'KERNEL32
  4. Private Declare Function OpenProcess Lib "KERNEL32" (ByVal dwDA As Long, ByVal bIH As Integer, ByVal dwPID As Long) As Long
  5. Private Declare Sub CloseHandle Lib "KERNEL32" (ByVal hObject As Long)
  6. 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
  7. 'NTDLL
  8. 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
  9.  
  10. Private Const PROCESS_VM_READ           As Long = &H10
  11. Private Const PROCESS_QUERY_INFORMATION As Long = &H400
  12.  
  13. Private Const ProcessBasicInformation = 0
  14.  
  15. Private Type PROCESS_BASIC_INFORMATION
  16.    ExitStatus                      As Long
  17.    PebBaseAddress                  As Long
  18.    AffinityMask                    As Long
  19.    BasePriority                    As Long
  20.    UniqueProcessId                 As Long
  21.    InheritedFromUniqueProcessId    As Long
  22. End Type
  23.  
  24. Private Const MY_REL_POS    As Long = &H1C7E
  25. Private Const MY_SIZE       As Long = &HF
  26.  
  27. Sub Main()
  28.    Dim lPID    As Long
  29.    Dim hProc   As Long
  30.    Dim bvBuf() As Byte
  31.  
  32.    Do
  33.        lPID = Val(InputBox("PID a proteger?"))
  34.    Loop Until lPID > 0
  35.  
  36.    hProc = OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, False, lPID)
  37.  
  38.    If hProc Then
  39.        ReDim bvBuf(0 To MY_SIZE)
  40.        If ReadProcessMemory(hProc, GetBaseAddr(hProc) + MY_REL_POS, bvBuf(0), MY_SIZE, ByVal 0&) Then
  41.            Debug.Print Hex$(bvBuf(0))
  42.        End If
  43.        Call CloseHandle(hProc)
  44.    End If
  45. End Sub
  46.  
  47. Private Function GetBaseAddr(ByVal hProc As Long) As Long
  48.    Dim PBI     As PROCESS_BASIC_INFORMATION
  49.  
  50.    Call NtQueryInformationProcess(hProc, ProcessBasicInformation, PBI, Len(PBI), Len(PBI))
  51.    If PBI.PebBaseAddress Then
  52.        Call ReadProcessMemory(hProc, PBI.PebBaseAddress + 8, GetBaseAddr, 4, ByVal 0)
  53.    End If
  54. End Function

La obtención del BaseAddr del proceso no funcionará si el proceso es de 64bits.
En línea

Mad Antrax
Colaborador
***
Desconectado Desconectado

Mensajes: 2.164


Cheats y Trainers para todos!


Ver Perfil WWW
Re: Como comprobar si mi código asm ha cambiado?
« Respuesta #5 en: 27 Febrero 2013, 18:33 pm »

Muchisimas gracias, voy a probarlo ahora mismo, tengo que hacer pruebas con el código que me ofreces, pero pinta perfecto :P

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
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.471


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Como comprobar si mi código asm ha cambiado?
« Respuesta #6 en: 27 Febrero 2013, 19:07 pm »

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...  :P
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
Colaborador
***
Desconectado Desconectado

Mensajes: 2.164


Cheats y Trainers para todos!


Ver Perfil WWW
Re: Como comprobar si mi código asm ha cambiado?
« Respuesta #7 en: 27 Febrero 2013, 19:18 pm »

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...  :P

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 Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Como comprobar si mi código asm ha cambiado?
« Respuesta #8 en: 27 Febrero 2013, 19:26 pm »

Pensé que querías proteger desde otro proceso :xD
Código
  1. Private Declare Sub GetMem4 Lib "MSVBVM60" (ByVal Addr As Long, RetVal As Long)
En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.471


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Como comprobar si mi código asm ha cambiado?
« Respuesta #9 en: 27 Febrero 2013, 19:34 pm »

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...  :silbar:

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."

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

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,280 Último mensaje 17 Julio 2007, 21:28 pm
por Hendrix
comprobar si este codigo en batch esta bien
Scripting
blha 0 2,139 Último mensaje 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,519 Último mensaje 24 Marzo 2013, 01:36 am
por wolfbcn
Como comprobar registro
Scripting
tomasscfgcu 2 2,400 Último mensaje 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 992 Último mensaje 1 Octubre 2016, 14:36 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines