PDA

Ver la versión completa : Problemilla con Olly



elios48
29-03-2012, 15:05
Estoy estudiando un programa el cual tiene una libreria y sobre ella estoy trabajando. El problema que tengo es saber como grabar una direccion que es dinamica. Por ejemplo, lo que quiero modificar es tal como esto:
092B447C mov eax, LinRot5.092CBC74 (direccion) que no es lo mismo que
092B447C mov eax, 092CBC74 (valor).
Esta direccion cuando vuelva a arrancar el programa no sera la misma pero Olly me lo ha grabado como valor y no como direccion, entonces me gustaria saber como he de escribirlo o grabarlo. Se que si estuviese bien, tanto en el desamblado como en el dump apareceria subrayado, masked fixups creo que se llama.
gracias y un saludo.

chewarrior
30-03-2012, 14:25
Por si te sirve de ayuda, la sintaxis para indicar en una instrucion MOV una dirrecion de memoria es esta MOV [MIDIRECCION] asi no se tomara como un valor.

elios48
31-03-2012, 00:11
No te entiendo muy bien, segun el ejemplo anterior lo que necesito es saber escribir
092B447C mov eax, LinRot5.092CBC74 y no
092B447C mov eax, [092CBC74] porque como todos sabemos no es lo mismo.

chewarrior
31-03-2012, 01:42
Lo q te estoy diciendo es que si quieres tomar el valor que se encuentra en la direccion 092CBC74 se suele escribir entre [], espero no tener que entrar en un debate enterno.

hystd
31-03-2012, 02:43
Si lo que quieres es obtener la dirección de memoria de un objeto (por ejemplo una función o un procedimiento) que se encuentra dentro de una librería dinámica, lo que debes es observar en qué punto se llama a GetModuleHandle() y GetProcAddress(). Esta última recibe el valor devuelto por la primera, y devuelve la dirección de memoria del objeto, que se llama en el código.

Para localizarlo, deberás realizar una traza al código hasta dar con lo que buscas. Una vez localizado, si necesitas "exportar" esa dirección hacia otro sitio, habrá que insertar una instrucción del tipo PUSH EAX (pues en EAX es donde probablemente esté el valor devuelto por la función GetProcAddress), y posteriormente recuperarla en la sección del código con un POP EAX, o con una instrucción MOV EAX, [EBP-x], quedando finalmente en EAX la dirección cargada que buscas, lista para usar en donde desees.

Un saludo.

elios48
02-04-2012, 21:24
Os pongo una lineas del programa original para ver si así me explico mejor.
093F4473 . 6A 15 PUSH 15
093F4475 . 8D8D E0FEFFFF LEA ECX,DWORD PTR SS:[EBP-120]
093F447B . 51 PUSH ECX
093F447C . 68 74BC4009 PUSH LinRot5.0940BC74
093F4481 . FF15 3C943F09 CALL DWORD PTR DS:[<&MSVCR80.strncmp>]
093F4487 83C4 0C ADD ESP,0C
093F448A 85C0 TEST EAX,EAX
imaginemos que yo quiero copiar el push que esta antes de la funcion strncmp, quedaria
093F4487 68 74BC4009 PUSH LinRot5.0940BC74
ahora grabo y reinicio el programa quedando de la siguiente forma
09284475 . 8D8D E0FEFFFF LEA ECX,DWORD PTR SS:[EBP-120]
0928447B . 51 PUSH ECX
0928447C . 68 74BC2909 PUSH LinRot5.0929BC74
09284481 . FF15 3C942809 CALL DWORD PTR DS:[<&MSVCR80.strncmp>]
09284487 68 74BC4009 PUSH 940BC74
y vemos que el ultimo push no ha cogido la direccion que puse antes. Esta version de Olly es 1.09 y aunque el v2.01 me deja escribir Push Offset 0929BC74 el resultado es el mismo.
un saludo.

alana
12-04-2012, 12:50
Hola, elios48.

¿Sería posible saber qué programa es el que estás estudiando?

Gracias, y un saludo.