El OllyDBG y los accesos al registro de windows

Iniciado por TaU, 16 Marzo 2010, 02:59 AM

0 Miembros y 2 Visitantes están viendo este tema.

TaU

Hola,

Estoy trasteando con un programa que usa varios módulos. El módulo que en teoria valida el serial-requestcode-autorizecode lo he parcheado sin demasiados problemas para que llegue al punto deseado sea lo que sea que se le meta como autorizecode, de manera que saca la ventanita de codigo correcto y te dice que reinicies el programa para que funcione sin limitaciones.

El problema es que cuando lo reinicio el programa me vuelve a pedir el serial-request-autorize como si no lo hubiera metido antes.

Mientras estaba traceando he visto que los códigos que se generan a partir del serial (los de request-autorize) se van metiendo en el registro de windows en una clave concreta. Supongo que lo que pasa es que cuando se inicia el programa al cargarse alguno de los otros módulos se realiza otra vez el proceso de comprobación de las claves de registro, ahi se de cuenta de que no son legítimas y resetea el proceso de autorizacion.

Para pillar el módulo que hace esa segunda comprobación necesitaría averiguar alguna manera de decirle al Olly que meta un BP cuando se intente acceder a esa clave en concreto del registro, pero... ¿se puede hacer algo asi?


Un saludo.
"Si no se vive como se piensa, se acabará pensando como se vive", Pep Figueres
Revolucionario / Presidente de Costa Rica / Primer jefe de estado de la historia en abolir el ejército / Catalán.
www.wadalbertia.org  -<|¡^P

bizco

Bueno yo te explico mi forma de hacerlo, luego tu la adaptas a otra que te sea mas comoda o haces lo que necesites. yo pongo un bp en la api en cuestion, y miro en la pila los parametros para ver si los datos que me interesan son obtenidos en esa llamada, si no son F9, si son los datos miro el call stack y voy justo a la zona donde se llamo a esa funcion. despues de aqui puedes hacer mil cosas, desde depurar poco a poco o poner un hbp en el buffer que contiene los datos (on access). espro que te de una idea :).

TaU

#2
Hola ctlon,

Gracias por las ideas :)

El problema de hacerlo con un hbp on access es que al principio los datos todavía no están ahi, por lo tanto eso tendría que hacerse una vez ya se han cargado, con lo que probablemente ya sea demasiado tarde...

Lo de hacerlo por la api es la manera que estoy intentando desde hace un rato, pero hay muchos modulos posibles y en cada uno hay que poner los BPs de las apis a mano, y ademas se accede al registro en multitud de ocasiones con lo cual igual me tiro dandole al F9 tres dias seguidos :P

Alguien sabe si eso se puede hacer con algún script o algún plugin para Olly?
(me refiero a meter un BP automáticamente cuando se acceda a una clave de registro determinada y conocida)
"Si no se vive como se piensa, se acabará pensando como se vive", Pep Figueres
Revolucionario / Presidente de Costa Rica / Primer jefe de estado de la historia en abolir el ejército / Catalán.
www.wadalbertia.org  -<|¡^P

bizco

#3
No me entendiste, metelo no en el codigo de los modulos, directamente en la api y ves desde donde se a llamado, ahi veras la direccion del buffer donde se contendran los datos justo despues de la llamada, tiralo al dump y veras el buffer vacio o con basura, no importa. ves justo a la siguiente instruccion desde donde se llamo y le das a F2 (bp), dale a F9 y en el dump (donde tienes justo el buffer donde se guardan los datos) tienes que ver los datos leidos, ahora es el momento de poner el HBP.

de todos modos, un momento y te subo unas imagenes para que entiendas bien el proceso.

Primer paso, perdon por la calidad de la imagen pero no tengo nada mejor ahora mismo. es para orientar, no es real. es la calculadora de win.



Segundo:



Tercero:



Yo uso el cmdline para poner los bp por comodidad, pero puedes ir directamente a la direccion de la api y darle a F2 asi interceptas todas las llamadas a esa funcion en el proceso que estas depurando. fijate los recuadros que te marco en rojo, ahi se ve lo que te intente explicar en el primer post. cualquier duda ya sabes.

TaU

#4
Otia!! juas.... ahora que me has iluminado me parece increíble que no se me hubiera ocurrido antes... como suele pasar con todas las buenas soluciones :D

No creo que hagan falta las capturas de pantalla, pero gracias de todos modos ctlon.

edit:
Cuando publiqué el post vi que ya habías subido las capturas, gracias de nuevo ^_^!
"Si no se vive como se piensa, se acabará pensando como se vive", Pep Figueres
Revolucionario / Presidente de Costa Rica / Primer jefe de estado de la historia en abolir el ejército / Catalán.
www.wadalbertia.org  -<|¡^P

tena

o tambien podrias poner un bp conditional log en esa api para que pare cuando se cumpla tal condicion.

slds

TaU

Hola tena,

Emmm... Un BP condicional log en la api?
Podrías ponerme un ejemplo?
"Si no se vive como se piensa, se acabará pensando como se vive", Pep Figueres
Revolucionario / Presidente de Costa Rica / Primer jefe de estado de la historia en abolir el ejército / Catalán.
www.wadalbertia.org  -<|¡^P

MCKSys Argentina

De la ayuda de Olly:

- Conditional breakpoint (shortcut Shift+F2) is an ordinary INT3 breakpoint with associated expression. Each time Debugger encounters this breakpoint, it estimates expression and, if result is non-zero or expression is invalid, stops debugged program. Of course, the overhead caused by false conditional breakpoint is very high (mostly due to latencies of the operational system). On PII/450 under Windows NT OllyDbg processes up to 2500 false conditional breakpoints per second. An important case of conditional breakpoint is break on Windows message (like WM_PAINT). For this purpose you can use pseudovariable MSG together with proper interpretation of arguments. If window is active, consider message breakpoint described below.

- Conditional logging breakpoint (Shift+F4) is a conditional breakpoint with the option to log the value of some expression or arguments of known function each time the breakpoint is encountered or when condition is met. For example, you can set logging breakpoint to some window procedure and list all calls to this procedure, or only identifiers of received WM_COMMAND messages, or set it to the call to CreateFile and log names of the files opened for read-only access etc. Logging breakpoints are as fast as conditional, and of course it's much easier to look through several hundred messages in the log window than to press F9 several hundred times. You can select one of several predefined interpretations to your expression.

You may set pass count – a counter that decrements each time the pause condition is met. If pass count before decrement is not zero, OllyDbg will continue execution. Consider a loop that executes 100. (decimal) times. Place breakpoint in the middle and set pass count to 99. (decimal). OllyDbg will break on the last iteration.

Additionally, conditional logging breakpoint allows you to pass one or several commands to plugins. For example, this may be a request for command-line plugin to change contents of register and continue.


Saludos!
MCKSys Argentina

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


TaU

Gracias por pastearme la ayuda MCKSys Argentina, como estoy en el Vista x64 no puedo abrir directamente el archivo de ayuda del Olly, dice que está en un formato obsoleto :P
"Si no se vive como se piensa, se acabará pensando como se vive", Pep Figueres
Revolucionario / Presidente de Costa Rica / Primer jefe de estado de la historia en abolir el ejército / Catalán.
www.wadalbertia.org  -<|¡^P

tena

Bueno por ejemplo si queres parar cuando GetModuleHandleA quiere sacar la base del kernel.. pues te fijas asi..



Haces follow en $+4 y tenes la cadena en el dump, buscas los bytes que correspondan a la palabra kernel, y lo tenemos en $+1c...

Ahora armamos nuestro Bp Conditional Log. Reinicias y loo pones.



Luego das run y caera cuando intenta sacar la base del kernel.


slds