Sie sind auf Seite 1von 27

ATACANDO UN SOFTWARE PROTEGIDO CON WINLICENSE ABARROTES PDV

FECHA VICTIMA Septiembre 2010 Abarrotes PDV versin 1.75

Version descontinuada.. (actualizaron el software despus de URL este anlisis) DESCARGA PROTECCION Winlicense packer, archivo de licencia .vpv

OBJETIVO DIFICULTAD CRACKER

Demostrar como se podria registrar el software sin una licencia valida. MEDIA ALEJANDRO TORRES (TORRESCRACK)

Reverse Engineering Solutions.

http://www.facebook.com/yo.torrescrack

www.torrescrack.blogspot.com

Anlisis de Seguridad en Software Abarrotes PDV

Septiembre 2010 Alejandro Torres Ramrez

ndice

1.2.3.4.-

Especificaciones4 Introduccin5 Buscando Vulnerabilidades6 Posibles Soluciones25

1.- Especificaciones.

Homepage: http://www.abarrotespuntodeventa.com/ Download: * Software: Abarrotes Punto de venta 1.75 Status: VULNERABLE. Proteccion: Winlicense packer, archivo license.vpv Herramientas utilizadas: ollydbg.exe (Debugger-modificado con plugins, protegido de los mtodos antidebug), RDG Packer Detector (scanner de protecciones de software) Objetivo: Conseguir registrarse sin una licencia valida

2.- Introduccin:

ste software que veremos a continuacin, presenta unos errores bastante comunes en cualquier gnero de la comunidad de Seguridad en Software. Y es que efectivamente, se trata de un fichero compilado en Borland Delphi. Lo que se ver en las siguientes pginas es una vez ms producto de (en ste caso) hacer uso de parcheo en memoria usando herramientas que se utilizan para atacar este tipo de proteccin a lo que facilita el ataque.

3.- Buscando Vulnerabilidades.


Nuestro objetivo a seguir es buscar vulnerabilidades que ayuden al pirata informtico (cracker) a registrarse sin una licencia valida, utilizando algunas herramientas que se utilizan en este tipo de ataques, por ejemplo: Debuggers, scanners, etc. Que son utilizadas para ayudar a modificar el funcionamiento del programa (en este caso) para poder usarlo sin limitaciones como lo hara una licencia valida. Lo primero que cualquier cracker seria buscar que sistemas de proteccin utiliza el software, utilizaremos una herramienta creada para buscar posibles packers o protectores de software (themida, winlicense, armadillo, asprotect,upx etc) llamada RDG packer detector. Veamos: EJEMPLO: Como detectara una aplicacion protegida Winlicense proteccin en con Themida un o

Ahora ya que vimos como el scanner es capaz de detectar protecciones y compiladores, probemos con el software Abarrotes pdv

Vemos que no encontr proteccin alguna ni tampoco el compilador.

Hay 3 opciones de porque no detecto ningn compilador ni proteccin de el software Abarrotes PDV, La primera: es porque el sistema de proteccin es muy nuevo y el scanner no puede reconocerlo. La segunda: es porque el sistema de proteccin utiliza un mtodo para burlar este tipo de scanners. La tercera: es porque no utiliza ningn tipo de proteccin/packer.

Bien ahora, ya vimos que el scanner no nos dio mucha informacin, entonces pasemos a abrir el debugger ollydebugger ( en este caso un debugger modificado para trabajar con los mtodos anti-cracking de winlicense) por ejemplo OLLY SND y asi investigar mas a fondo.

Al intentar abrir el software con nuestro debugger, nos sale un mensaje, avisndonos que el cdigo esta comprimido o contiene errores en la programacin, pero si analizamos, se trata de un software comercial, no puede tener errores graves de este tipo, entonces la nica posibilidad que queda, es que este protegido y necesitamos saber con que esta comprimido o que protector usa, bien por ahora tenemos solo esta informacin: .Utiliza un protector o packer que esquiva los scanners Es suficiente informacin para nosotros, para as poder descartar varios protectores y enfocarse en los que tienen estos mtodos y segn mi experiencia los mas comunes que utilizan estos mtodos por ejemplo Winlicense , Themida , crypters nuevos (comnmente esos son nicamente en malware) descartamos ese , entonces me guiare por mi primer sospecha al correr el software con el debugger buscamos en la memoria del software la string Winlic o Themida en busca de que protector o packer se trata, veamos esto

Al parecer se trata de el protector Winlicense y adems vemos unos bytes mas abajo que nos da el nombre de un archivo llamado licencia.vpv ya con eso es mas que suficiente para que un pirata con suficientes conocimientos logre penetrar el sistema y validar una licencia invalida, supongo que es una nueva versin de Winlicense ya que el scanner no lo detecto. Bien ya tenemos ms informacin: .Utiliza el protector Winlicense

.Tenemos el nombre y extensin del archivo que ocupa para saber si es una licencia valida Ahora nos toca correr el software en el debugger y ver de que forma podran utilizar esa informacin con un mal uso; el software nos manda a una ventana dicindonos que no estamos registrados y que ya caduco el tiempo de evaluacin.

Bien veamos que la Ventana contiene diferentes opciones y una de ellas es seleccionar la licencia para verificar si es valida o no lo es, y como ya sabemos el nombre y extensin del archivo de licencia, creamos un archivo con ese nombre y extensin con contenido basura.

Vemos que al crear el archivo el archivo toma un icono creado por el software, y eso quiere decir que la extensin es la correcta, ahora lo que sigue es investigar donde compara la licencia valida con la incorrecta para poder hacer un seguimiento y ver donde el pirata informtico podra alterar el software y hacer que valide una licencia incorrecta. Seleccionamos la opcin de leer el archivo de licencia.

Al parecer el programa valida la licencia solo cuando va a iniciar el programa, reiniciamos el debugger y veamos que nos muestra al volver a iniciar.

Tenemos el mensaje de que la licencia esta corrupta o tiene algn error, habra que capturar quien llama a ese MessageBox para poder encontrar la comprobacin, reiniciemos pero cuando aparezca la ventana diciendo de que la licencia esta corrupta ponemos pause en el debugger para capturar el messagebox

Al presionar Pause nos dirigimos al botn call stack encerrado en el rectngulo rojo Vemos 3 llamadas a distintos lugares, pero la ultima siempre es la que nos interesa en estos casos, si hacemos doble click en la ultima llamada nos mandara la direccin al stack (pila), veamos

Si bajamos un poco mas en el stack podremos ver esto

En la direccin 0045ACEB, es donde retorna nuestro programa al presionar el botn aceptar del MessageBox, vayamos a esa direccin y pongamos un Break Point (punto

de ruptura) y caeremos hay ,al presionar el botn aceptar, veamos

Bien al parecer hemos cado en el Break Point (punto de ruptura), ahora lo que haremos es seguir traceando instruccin por instruccin hasta que lleguemos al lugar donde podamos averiguar quien nos manda a esta rutina donde sale el messagebox, presionaremos F8 para ir traceando (ose a lnea por lnea) as pasaremos unos 2 minutos traceando hasta que lleguemos aqu:

Al caer aqu solo es cuestin de ver lneas mas arriba un salto muy largo que rebase el lugar donde estamos parados y eso quiere decir que el salto es tomado si la licencia no esta corrupta y no mostrara nunca el messagebox Veamos el salto:

Vemos que es un salto condicional JA significa (Jump if Above), sea que en este caso toma el salto si el registro eax es mas grande que 7, pongamos un Break Point Hardware on execution para que pare al

ejecutar esa lnea, reiniciamos el debugger y esperamos unos segundos a que pare

Vemos que al parar hay, en el registro eax esta el numero 2 y es por eso que el salto condicional no lo toma y hace que nos muestre que la licencia esta corrupta, entonces el salto es tomado si la bandera o Flag Carry esta desaactivada y esta bandera se desactiva cuando hace una comparacin con un numero y este es mayor del numero al que se le compara, pondr un ejemplo Eax==2;
el contenido de eax es un valor devuelto por una serie de algoritmos que usa el programa para validar la licencia. Cmp eax, 4; compara el registro eax con 4 si eax es mayor a 4 la bandera C carry se desactiva Ja registrados; si la bandera carry esta desactivada nos manda a estar registrados

Bien ahora que ya entendimos como funciona el salto, entonces debemos de investigar como modificar las banderas en el debugger veamos:

Vemos que debajo de los registros eax,ebx,ecx,edx,esi,edi, nos encontramos con la banderas y en ellas esta la bandera C Carry activa y si le hacemos doble click encima de ella se desactiva y vemos que el salto ya se puede tomar veamos:

Ahora al poder tomar el salto corremos nuestro debugger con f9 y ahora vemos esto:

Al parecer logramos burlar comprobacin, tomemos nota

la

primera

.La primer direccin donde debemos aplicar el primer parche o modificar en memoria con un loader es la direccin 006C5250 Bien seguimos ponemos los datos correctos ala ventana e intentamos usar el programa haber que otra limitacin tenemos:

Vemos que al seleccionar la opcin de productos, se da cuenta que el programa ya duro ms de 30 das. Bien ya sabemos como burlar el primer salto ahora tendremos que hacer lo mismo de burlar la primera proteccin y desactivar la bandera carry , pero ahora en vez de correr el programa seguimos traceando lnea por lnea hasta encontrar algo que nos sea sospechoso o alguna comprobacin de las fechas que haga que nos muestre ese mensaje:

Traceamos hasta caer aqu

Vemos que luego de pasar el salto JA , dos lneas mas abajo esta esto al parecer hay una llamada y al retornar de ella compara el registro al (parte baja de eax, se utiliza para comprar operandos pequeos) con 1 y si la bandera z Zero esta desactiva a 0 se toma el salto, la bandera Zero se activa a 1 cuando el resultado de una comparacin es falso , por ejemplo Eax=4

Ebx=5 Cmp eax, ebx; JNZ salta

al ser el resultado de esta comparacin un falso, la bandera Z zero se pone a 1 y el salto es tomado.

Bien Ya entendimos como modificar el salto, ahora veremos que hay dentro de la llamada presionando F7 al estar encima de ella y veamos:

Estamos dentro de la llamada, hay que tracear un poco para ver que informacin compara o de donde la saca, etc, traceamos con f8 hasta llegar aqu:

Vemos que hace una comparacin a una direccin de memoria, veamos que compara

Compara que donde esta el byte 0 sea diferente de 0, si es diferente de 0 pasa por donde hay mucho codigo talvez necesita

ser diferente de cero , ahora si recuerdan mas arriba en donde estabamos cuando acababamos de entrar en el call , recordemos

Ya que estemos hay presionemos click derecho y Find referentes to select command veamos

Y veremos esto

Vemos que esta pequea rutina, donde compara la direccin de memoria con 0; es llamada desde 2 distintos lugares, al parecer que es para estar haciendo comprobaciones, pero entonces tenemos que modificar desde esta rutina, para que cuando la llamen siempre piense el programa que en vez de 0 es 1. Modifiquemos algo en memoria solo para probar si esta rutina es parte de la otra proteccin, encima de la comparacin presionemos la barra espaciadora y veremos esto:

Cambiemos un poco el cdigo a lo que veremos a continuacin en la imagen de abajo, ya que cambiemos presionamos ENTER y despus ESCAPE listo, ahora corramos y probemos

Y veremos que la proteccin ha sido vencida y solo modificando unos pocos bytes.

Ahora solo queda crear un loader, para que cuando cargue el programa cambie los bytes en memoria ya que al estar protegido con Winlicense el cdigo se va desencriptando poco a poco y se termina de desencriptar al iniciar el programa dejo a continuacin el cdigo del loader , programado en MASM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
include include include include include windows.inc user32.inc kernel32.inc masm32.inc shell32.inc user32.lib kernel32.lib masm32.lib shell32.lib

includelib includelib includelib includelib

.DATA Escribir DB " Torrescrack-security ",0 Escribir2 DB "",0

Escribir1 DB "@ ",0 Escribir3 DB "",0 DirAct DB 150 DUP (?) Buffer DB 150 DUP (?) Nombre DB "\Abarrotes.exe",0 Nombre1 DB "Abarrotes.exe",0 Uno PROCESSENTRY32<>

.386 .MODEL FLAT,STDCALL OPTION CASEMAP:NONE INCLUDE Loader.inc .CODE Start: INVOKE GetCurrentDirectory,150,ADDR DirAct INVOKE lstrcpy,Addr Buffer,Addr DirAct INVOKE lstrcat,addr DirAct,addr Nombre INVOKE ShellExecute,NULL,NULL,Addr DirAct,NULL,Addr Buffer,SW_SHOWDEFAULT MOV DWORD PTR Uno.dwSize,9999 INVOKE CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,NULL MOV DWORD PTR EBX,EAX INVOKE Process32First,EBX,Addr Uno OTRO: INVOKE Process32Next,EBX,Addr Uno INVOKE lstrcmp,addr Uno.szExeFile,Addr Nombre1 TEST EAX,EAX JZ AKI JMP OTRO

AKI: Invoke OpenProcess,PROCESS_ALL_ACCESS,NULL,Uno.th32Proces sID MOV EBX,EAX Busco: MOV EAX,06C51B8H ; Direccion de comprobacin GetModuleHandle Invoke ReadProcessMemory,EBX,EAX,Addr Buffer,4,NULL cmp DWORD PTR [Buffer],458DD08BH ; Suelen ser siempre la misma jne Busco MOV EAX,06C5250H ; Direccion a Desproteger INVOKE VirtualProtectEx,EBX,EAX,4,PAGE_EXECUTE_READWRITE, Addr Buffer MOV EAX,06C5250H ; Direccion a escribir INVOKE WriteProcessMemory,EBX,EAX,Addr Escribir2,4,NULL

MOV EAX,0075CABDH ; Direccin a Desproteger INVOKE VirtualProtectEx,EBX,EAX,4,PAGE_EXECUTE_READWRITE, Addr Buffer MOV EAX,0075CABDH ; Direccin a escribir INVOKE WriteProcessMemory,EBX,EAX,Addr Escribir1,4,NULL

MOV EAX,0075CAC1H ; Direccin a Desproteger INVOKE VirtualProtectEx,EBX,EAX,1,PAGE_EXECUTE_READWRITE, Addr Buffer MOV EAX,0075CAC1H ; Direccin a escribir INVOKE WriteProcessMemory,EBX,EAX,Addr Escribir3,1,NULL

invoke ExitProcess,NULL End Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

A continuacin veremos los pequeos errores que causan grandes problemas en la seguridad del software

4.- Posibles soluciones.

El resultado de todo el anlisis anterior, es: 1. Que gracias a los mensajes tipo MessageBox logramos capturar las llamadas que hicieron posible romper con la seguridad del software , lo cual se recomienda no aplicar mensajes de ningn tipo al validar la licencia , ya que todo mensaje es manejado por APIS y al enviar los mensajes , solo es cuestin de Buscar la API encargada de mandar cierto

mensaje , ejemplo SetWindowText, MessageBox, etc., y se podra capturar de donde llamaron a la API, 2. Es recomendable sigan usando Winlicense con todas sus funciones anticracking habilitadas (en algunos casos no funciona el software con todas activas , pero prueben) ya que hasta el momento es el mejor sistema anticracking que he conocido, tambin pueden combinarlo con algn otro tipo de protector, eso complicara muchsimo mas las cosas al cracker , todo esto se suma a las mejoras que les comente en el punto numero uno.

Torrecrack248@hotmail.com

Septiembre 2010 Alejandro Torres Ramrez