Ayuda con una modificación que no funciona

Iniciado por arfgh, 7 Julio 2016, 15:48 PM

0 Miembros y 1 Visitante están viendo este tema.

arfgh

Hola amigos.

Estoy intentando hacer una modificación en un programa, que hace una llamada a la api 'Stretchblt', entonces antes de producirse la llamada he introducido un salto incondicional a una parte vacía al final del código para insertar allí mi asm :P
Evidentemente algo estoy haciendo mal ya que cuando ejecuto el programa, este revienta, también ejecutando paso a paso con el ollydbg no me pasa de una linea.

Mirad el código:



0048D773   .  52            PUSH EDX
0048D774   .  50            PUSH EAX
0048D775   .  E9 CD220200   JMP 004AFA47
0048D77A   .  FF15 90038700 CALL NEAR DWORD PTR DS:[<&GDI32.StretchBlt>]   \GDI32.StretchBlt

ahí podéis ver el salto incondicional, en su lugar estaba el comando Push EAX.


004AFA46   .  00            DB 00
004AFA47   >  50            PUSH EAX
004AFA48   .  A0 46FA4A00   MOV AL,BYTE PTR DS:[4AFA46]
004AFA4D   .  FEC0          INC AL
004AFA4F   .  3C 03         CMP AL,3
004AFA51   .  74 1C         JE SHORT 004AFA6F
004AFA53   .  3C 04         CMP AL,4
004AFA55   .  74 18         JE SHORT 004AFA6F
004AFA57   .  3C 05         CMP AL,5
004AFA59   .  74 14         JE SHORT 004AFA6F
004AFA5B   .  3C 06         CMP AL,6
004AFA5D   .  74 10         JE SHORT 004AFA6F
004AFA5F   .  A2 46FA4A00   MOV BYTE PTR DS:[4AFA46],AL
004AFA64   .  58            POP EAX
004AFA65   .  6A 00         PUSH 0
004AFA67   .  6A 00         PUSH 0
004AFA69   >  51            PUSH ECX
004AFA6A   .^ E9 F6DCFDFF   JMP 0048D765
004AFA6F   >  A2 46FA4A00   MOV BYTE PTR DS:[4AFA46],AL
004AFA74   .  58            POP EAX
004AFA75   .  68 80000000   PUSH 80
004AFA7A   .  68 80000000   PUSH 80
004AFA7F   .^ EB E8         JMP SHORT 004AFA69



Pues bien, cuando intento guardar mi contador con MOV BYTE PTR DS:[4AFA46],AL
pues el ollydbg no pasa de esa linea. Evidentemente entiendo muy poco de asm, y no sé que es lo que me está faltando.

ayuda y gracias.

MCKSys Argentina

Hola!

Por lo que veo, 4AFA46 es el primer byte (DB 00) de tu código.
Ahora, normalmente la sección de código no es escribible y tu estás en ella.
Tienes 2 opciones: o haces la sección de código escribible (con CFFExplorer o la tool de tu preferencia) o bien usas una dirección que esté en la sección data (recomendable cerca del final para evitar que el programa machaque el byte), la cual, normalmente, sí es escribible pero no ejecutable.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


arfgh

esa zona es al final de todo. Estás seguro de que la zona de código no se puede escribir ? entonces  por qué con la api 'writeprocessmemory' si que podemos ?

El asunto es que al llegar el ollydbg a esa posición del MOV, no pasa de ahí a la siguiente instrucción...

tincopasan

la pregunta es
¿porqué querés mover a [4AFA46]? qué es una dirección a la que ya apunta el programa
CitarPues bien, cuando intento guardar mi contador con MOV BYTE PTR DS:[4AFA46],AL
si querés guardar Al deberías hacerlo en una dirección libre, como te indico MCKSys

arfgh

el lugar en dónde quiero guardar AL está libre.

MCKSys Argentina

Cita de: arfgh en  7 Julio 2016, 17:29 PM
esa zona es al final de todo. Estás seguro de que la zona de código no se puede escribir ? entonces  por qué con la api 'writeprocessmemory' si que podemos ?

El asunto es que al llegar el ollydbg a esa posición del MOV, no pasa de ahí a la siguiente instrucción...

Estás mezclando todo. Como te dije, tienes 2 opciones en tu caso: hacer la sección .code/.text writable o escribir en la sección .data (ésta última es la más sencilla, pues sólo debes cambiar la dirección donde quieres escribir).

Por otro lado, WriteProcessMemory se usa desde otro proceso (normalmente) y no discrimina entre secciones de ejecutables, stack, heap, etc. Basta con que la memoria esté mapeada.

Saludos!

PD: Si hubieras completado la intro a Olly de Ricardo Narvaja no tendrías este tipo de problemas.  :P
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


arfgh

ya advertí que no entiendo mucho :P
no obstante para escribir en la sección .data, tiene que haber un lugar para poder meter los bytes que necesitamos. 15 bytes es la zona más grande y vacía que he encontrado allí. No siendo que se pudiese hacer ese código más pequeño...

si es que se puede agrandar alguna sección pues ya me diréis como.....

MCKSys Argentina

Si el código que has colocado es todo el código, entonces sólo necesitas 1 byte de la sección .data.
Toma uno del final de la sección y listo.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


arfgh

Amigos la zona .idata imports también es RW y también tiene mucho espacio vacío. Sería factible usar ese espacio con seguridad ?

Es posible programáticamente hacer una sección .rdata con permisos de escritura ? o cualquier otra que no sea RW.

Y también, es posible programaticamente expandir el espacio de una de las secciones y poder así meter nuestro código ?

saludos

.:UND3R:.

Cita de: arfgh en  8 Julio 2016, 14:59 PM
Amigos la zona .idata imports también es RW y también tiene mucho espacio vacío. Sería factible usar ese espacio con seguridad ?

Es posible programáticamente hacer una sección .rdata con permisos de escritura ? o cualquier otra que no sea RW.

Y también, es posible programaticamente expandir el espacio de una de las secciones y poder así meter nuestro código ?

saludos

si, busca por una app que se llama t0po o topo en la web de ricardo narvaja

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)