[Tutorial]Introducción al cracking en P-Code

Iniciado por .:UND3R:., 7 Octubre 2011, 19:39 PM

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

.:UND3R:.

Introducción al cracking de P-Code

Referencia:Capitulo 29 "Introducción al cracking desde 0" por Ricardo Narvaja

Siempre cuando realizamos un previo análisis del ejecutable que nos vamos a enfrentar, cuando sabemos que es un Visual Basic compilado en P-Code intentamos aludirlo
ya que toman su tiempo crackearlo, por eso el motivo de esta introducción, en esta primera parte nos enfocaremos en el capítulo 29 de Ricardo Narvaja, en la segunda entrega nos enfocaremos con más crackmes y empezaremos a utilizar el fomoso WKTVBDE.

Herramientas:
-WKTVBDE
-OllyDbg
-P32Dasm
-exdec

I-¿Qué es P-Code?
Cuando compilados un programa con VB, este nos da la posibilidad de elegir el tipo de compilado diferenciando entre código NATIVO y P-CODE:
el código nativo tiene la gran ventaja que ejecutan el código en la sección code del programa permitiendo esto que sea más "fácil" lograr saltar la seguridad, por otro lado el
P-CODE no posee código de ejecución dentro de la sección code. solo posee una serie de códigos llamados P-Code que son interpretados y ejecutados por la dll de Visual Basic, haciéndonos una tarea más difícil.

II-¿Como saber si es un P-Code?
Los P-Code tienen una grán característica y es el uso de la API: MethCallEngine

Cargamos Clave1 con OllyDBG:


Si subimos un poco veremos que se utiliza la API:


Otra forma de saber que es un P-Code, es el mal análisis de código que realiza OllyDBG a diferencia de un native, si bajamos un poco lo podremos notar:


III-Analizando P-Code con OllyDBG
Para analizar un P-Code bajo OllyDBG debemos usar paralelamente exdec o P32Dasm, estos programas se encargan de encontrar la lista de P-Codes de forma automática. La idea es entender como trabajan estos tipos de programas:

Como sabemos los programas compilados en P-Code no ejecutan su código en la sección code solo executan comandos P-Code's que son interpretados por la dll de Visual Basic por lo que nosotros nos basaremos de eso,encontrar los P-Code de manera manual.

Cargamos clave1.exe en OllyDBG y colocamos un BP en la API MethCallEngine:


Iniciamos el programa con F9 y veremos lo siguiente:


Introducimos un serial cualquiera:


Vemos que se detiene en el BP:


Presionamos Alt+M y colocamos un Memory breakpoint on access en la sección code


Presionamos F9 hasta que se detenga en la siguiente instrucción:

MOV AL,BYTE PTR DS:[ESI]


En este lugar es donde la dll lee el primer P-Code, si miramos arriba del dump veremos de donde proviene:



Comienzan en: 00401BD0, si nos dirigimos ahí desde el dump veremos los P-Code's y sus parámetros:



Presionemos F7,y EAX tomará el valor del primer P-Code:



luego si presionamos F7 nuevamente aumenta ESI, esto lo hace para que ESI apunte a los parámetros del P-Code 04:


Desgraciadamente no existe una lista de P-Code's oficiales pero de todas formas adjunto una.

Para hacernos una idea de que va hacer el programa buscamos el P-Code 04 en la lista:

04    567B 0B8E 2 1 2      Push arg

Osea lo que hará será pushear su argumento,veamos si esto es correcto, luego de INC ESI realiza un JMP:


Presionamos F7 y llegamos aca:


veremos el siguiente comando:MOVSX EAX,WORD PTR DS:[ESI]

"Copies the value of the source operand to the destination register
with the sign extended."

lo que hará será colocar el parámetro de ESI en EAX considerando el signo negativo:



Luego suma EAX con EBP pero EAX por causa del MOVSX quedó en negativo será una resta: FFFFFF74h equivale a -140 decimal(para corroborar se debe hacer doble click en EAX), si 140 lo pasamos a hexadecimal,nos da: 8C por lo que en resumen realizará lo siguiente -8C+0012F4E0:



luego de eso realiza un PUSH EAX:



con eso concluye el P-Code 04 luego de eso realiza un XOR EAX,EAX para limpiar EAX y vuelve a mover el siguiente P-Code a EAX que en este caso es 21:



Luego suma 3 a ESI para apuntar al parámetro del segundo P-Code:



Aquí mueve a EAX el contenido de 0012F4E8 y lo mueve a EAX, luego el contenido de 0012F4E8 que ahora se encuentra en EAX es movido a [EBP-4C] luego de esto realiza un XOR EAX,EAX nuevamente para limpiar EAX y tomar nuevamente el siguiente P-CODE

En resumen la dll realiza lo siguiente:
-Toma el valor de P-Code y lo mueve a EAX: MOV AL,BYTE PTR DS:[ESI]
-Incrementa ESI para apuntar al parámetro del P-Code
-Se dirige al parámetro y ejecuta la operación correspondiente
-Terminada la operación realiza un XOR EAX,EAX para limpiar el registro
-Vuelve nuevamente al primer paso

Todo este análisis manual se puede evitar como comenté anteriormente con programas como exdec o P32Dasm, abrimos exdec y nos aparecerá lo siguiente:



Nos vamos a File->disassemble Prog y elegimos clave1.exe y nos mostrará lo siguiente:



en donde el primer valor es el address(VA) del P-code,el segundo valor es el P-Code mismo, el tercer valor es el nombre del P-Code y el cuarto el parámetro.

Si recordamos el primer P-Code fue 4 y estaba ubicado en el address 401BD0 y lo que realizo fue pushear el valor de EBP-8C, por lo que el programa nos facilita considerablemente la localización de los P-Code junto con sus parámetros

*exdec solo está disponible en fase beta, imposibilitando guardar la lista de P-Code pero de todas formas sigue siendo una herramienta fundamental.

Si abrimos P32Dasm veremos lo parecido que son:


este programa está más avanzado y nos muestra los P-Code de una manera más visible ideal cuando son muchos, También nos facilita la búsqueda de referencias de strings o números:



IV-Crackeando con OllyDBG y exdec

Para crackear de manera básica debemos tener conocimientos de dos P-Codes

1)BranchF=1C
este P-Code es similar a un salto condicional, este salto se realiza si la comprobación anterior es falsa.

2)BranchT=1D
este P-Code es el opuesto a BranchF es decir, este salta cuando la comprobación es verdadera T=True F=false


Una vez entendido como trabajan los programas compilados en P-Code podemos empezar a trabajar, lo primero que haremos será cargar clave1.exe con exdec, bajamos hasta encontrar alguna referencia de texto que sea llamativa:



una vez encontrada la referencia, en este caso:
"Número incorrecto"

debemos subir hasta encontrar algún BranchT o un BranchF. los Branch=1E no los debemos considerar ya que son equivalentes a JMP, es decir saltos incondicionales:



Encontramos un BranchF en 401C2C que si no se cumple la comprobación anterior este saltará a 401C63 vayamos a esa address para ver hacia donde se ubiese dirigido:



Vemos que se dirige a "Número Correcto"

Cargamos clave1.exe desde OllyDBG y nos dirijimos desde el dump a 401C2C (Address del BranchF)



Notaremos que hay un 1C que es equivalente a BranchF, intentemos cambiarlo por BranchT que es 1D y guardamos los cambios:



Iniciamos clave1 modificado, introduzcamos un serial cualquiera y presionamos Registrar:



Nuestro serial es tomado como válido

En esta ocación trabajamos enfocados en OllyDBG, luego trataremos teorias con WKTVBDE,Hasta la Parte II




UND3R

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

.:UND3R:.


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

Иōҳ

#2
Que puedo decir ;-)

Yo soy un simple vago  :-X, y viendo esto me animastes a escribir lo que deje a medias :) (despues de almorzar  :laugh:).

Nox.
Eres adicto a la Ing. Inversa? -> www.noxsoft.net


Maurice_Lupin

#4
modificado, hare un nuevo asunto.
Un error se comete al equivocarse.

apuromafo CLS

Cita de: Maurice_Lupin en  7 Octubre 2011, 21:52 PM
Una consulta, en mi programa pienso comparar el serial del disco duro o usb. Pienso poner el serial previamente obtenido en una variable y comparar en tiempo de ejecución 2 ó 3 veces.

compilo en P-code.
Este método que tan dificil de crackear es? y si tendrían algunas sugerencias para hacerlo más dificil de crackear.

saludos.
creo que idealmente deberia ser un toppic aparte, pero pcode es una forma antigua de codificar, muchos por el año 2003 y 2004, protegieron cosas asi y terminaron crackeadas

a lo mas habia un packer para pcode que alguien cre , pero haciendo aleatorio ciertos bytes con ciertas dudas que rompiera el codigo


pero en general, lo mejor es siempre confiar a no pasar el codigo de fuente a otro


por lo demas el tute de Under , encuentro que esta bien, ya si sigues como serie, en algun dia te enviare un crackme que alguna vez resolvi en pcode, pero que esta lleno de antidebug y anti tool, y no es reconocido por casi ningun p-code como exec ni el otro que es de pcode, solo vtk...lo reconoce..y olly claramente se ve todo..

saludos Apuromafo

.:UND3R:.

Cita de: apuromafo en  7 Octubre 2011, 21:59 PM
creo que idealmente deberia ser un toppic aparte, pero pcode es una forma antigua de codificar, muchos por el año 2003 y 2004, protegieron cosas asi y terminaron crackeadas

a lo mas habia un packer para pcode que alguien cre , pero haciendo aleatorio ciertos bytes con ciertas dudas que rompiera el codigo


pero en general, lo mejor es siempre confiar a no pasar el codigo de fuente a otro


por lo demas el tute de Under , encuentro que esta bien, ya si sigues como serie, en algun dia te enviare un crackme que alguna vez resolvi en pcode, pero que esta lleno de antidebug y anti tool, y no es reconocido por casi ningun p-code como exec ni el otro que es de pcode, solo vtk...lo reconoce..y olly claramente se ve todo..

saludos Apuromafo

Espero el p-code a ver si lo adjuntamos en las otras partes, saludos

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

$Edu$


.:UND3R:.


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

jackgris