ATACANDO UN SOFTWARE
PROTEGIDO CON WINLICENSE
“ABARROTES PDV”
FECHA Septiembre 2010
VICTIMA Abarrotes PDV versión 1.75
URL Version descontinuada….. (actualizaron el software después de
DESCARGA este análisis)
PROTECCION Winlicense packer, archivo de licencia .vpv
OBJETIVO Demostrar como se podria registrar el software sin una
licencia valida.
DIFICULTAD MEDIA
CRACKER ALEJANDRO TORRES (TORRESCRACK)
Reverse Engineering Solutions.
http://www.facebook.com/yo.torrescrack
www.torrescrack.blogspot.com
Análisis de Seguridad en
Software
“Abarrotes PDV”
Septiembre 2010
Alejandro Torres Ramírez
Índice
1.- Especificaciones…………………………4
2.- Introducción………………………………………5
3.- Buscando Vulnerabilidades………6
4.- Posibles Soluciones……………………25
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 métodos anti-
debug), RDG Packer Detector (scanner de
protecciones de software)
Objetivo: Conseguir registrarse sin una
licencia valida
2.- Introducción:
Éste software que veremos a continuación,
presenta unos errores bastante comunes en
cualquier género 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 páginas es
una vez más producto de (en éste caso) hacer
uso de parcheo en memoria usando
herramientas que se utilizan para atacar
este tipo de protección a lo que facilita el
ataque.
3.- Buscando Vulnerabilidades.
Nuestro objetivo a seguir es buscar
vulnerabilidades que ayuden al pirata
informático (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 haría una licencia valida.
Lo primero que cualquier cracker seria
buscar que sistemas de protección 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 detectaría una protección en un
aplicacion protegida con Themida o
Winlicense
Ahora ya que vimos como el scanner es capaz
de detectar protecciones y compiladores,
probemos con el software “Abarrotes pdv”
Vemos que no encontró protección alguna ni
tampoco el compilador.
Hay 3 opciones de porque no detecto ningún
compilador ni protección de el software
“Abarrotes PDV”,
La primera: es porque el sistema de
protección es muy nuevo y el scanner no
puede reconocerlo.
La segunda: es porque el sistema de
protección utiliza un método para burlar
este tipo de scanners.
La tercera: es porque no utiliza ningún tipo
de protección/packer.
Bien ahora, ya vimos que el scanner no nos
dio mucha información, entonces pasemos a
abrir el debugger “ollydebugger” ( en este
caso un debugger modificado para trabajar
con los métodos 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, avisándonos
que el código esta comprimido o contiene
errores en la programación, 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 información:
.Utiliza un protector o packer que esquiva
los scanners
Es suficiente información para nosotros,
para así poder descartar varios protectores
y enfocarse en los que tienen estos métodos
y según mi experiencia los mas comunes que
utilizan estos métodos por ejemplo
“Winlicense” , “Themida” , crypters nuevos
(comúnmente 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 además 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 versión de
“Winlicense” ya que el scanner no lo
detecto.
Bien ya tenemos más información:
.Utiliza el protector “Winlicense”
.Tenemos el nombre y extensión 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 podrían utilizar
esa información con un mal uso; el software
nos manda a una ventana diciéndonos que no
estamos registrados y que ya caduco el
tiempo de evaluación.
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 extensión del archivo de licencia,
creamos un archivo con ese nombre y
extensión con contenido basura.
Vemos que al crear el archivo el archivo
toma un icono creado por el software, y eso
quiere decir que la extensión 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 informático podría
alterar el software y hacer que valide una
licencia incorrecta.
Seleccionamos la opción 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 algún error, habría que
capturar quien llama a ese MessageBox para
poder encontrar la comprobación, 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 botón
“call stack” encerrado en el rectángulo 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 dirección al
stack (pila), veamos
Si bajamos un poco mas en el stack podremos
ver esto
En la dirección 0045ACEB, es donde retorna
nuestro programa al presionar el botón
“aceptar” del MessageBox, vayamos a esa
dirección y pongamos un Break Point (punto
de ruptura) y caeremos hay ,al presionar el
botón “aceptar”, veamos
Bien al parecer hemos caído en el Break
Point (punto de ruptura), ahora lo que
haremos es seguir traceando instrucción por
instrucción 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
línea por línea) así pasaremos unos 2
minutos traceando hasta que lleguemos aquí:
Al caer aquí solo es cuestión de ver líneas
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 línea, 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
comparación 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 la primera
comprobación, tomemos nota
.La primer dirección donde debemos aplicar
el primer parche o modificar en memoria con
un loader es la dirección 006C5250
Bien seguimos ponemos los datos correctos
ala ventana e intentamos usar el programa
haber que otra limitación tenemos:
Vemos que al seleccionar la opción de
productos, se da cuenta que el programa ya
duro más de 30 días.
Bien ya sabemos como burlar el primer salto
ahora tendremos que hacer lo mismo de burlar
la primera protección y desactivar la
bandera “carry” , pero ahora en vez de
correr el programa seguimos traceando línea
por línea hasta encontrar algo que nos sea
sospechoso o alguna comprobación de las
fechas que haga que nos muestre ese mensaje:
Traceamos hasta caer aquí
Vemos que luego de pasar el salto JA , dos
líneas 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 pequeños) 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 comparación es
falso , por ejemplo
Eax=4
Ebx=5
Cmp eax, ebx; al ser el resultado de esta comparación
un falso, la bandera Z “zero” se pone a 1 y el salto es
tomado.
JNZ salta
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 información
compara o de donde la saca, etc, traceamos
con f8 hasta llegar aquí:
Vemos que hace una comparación a una
dirección 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 pequeña rutina, donde compara
la dirección 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
protección, encima de la comparación
presionemos la barra espaciadora y veremos
esto:
Cambiemos un poco el código a lo que veremos
a continuación en la imagen de abajo, ya que
cambiemos presionamos “ENTER” y después
“ESCAPE” listo, ahora corramos y probemos
Y veremos que la protección 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 código se va desencriptando
poco a poco y se termina de desencriptar al
iniciar el programa
dejo a continuación el código del loader ,
programado en MASM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
include shell32.inc
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
includelib shell32.lib
.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 comprobación
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 ; Dirección a Desproteger
INVOKE
VirtualProtectEx,EBX,EAX,4,PAGE_EXECUTE_READWRITE,
Addr Buffer
MOV EAX,0075CABDH ; Dirección a escribir
INVOKE WriteProcessMemory,EBX,EAX,Addr
Escribir1,4,NULL
MOV EAX,0075CAC1H ; Dirección a Desproteger
INVOKE
VirtualProtectEx,EBX,EAX,1,PAGE_EXECUTE_READWRITE,
Addr Buffer
MOV EAX,0075CAC1H ; Dirección a escribir
INVOKE WriteProcessMemory,EBX,EAX,Addr
Escribir3,1,NULL
invoke ExitProcess,NULL
End Start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
A continuación veremos los pequeños errores que
causan grandes problemas en la seguridad del
software
4.- Posibles soluciones.
El resultado de todo el análisis 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 ningún tipo al validar la
licencia , ya que todo mensaje es
manejado por APIS y al enviar los
mensajes , solo es cuestión de Buscar
la API encargada de mandar cierto
mensaje , ejemplo SetWindowText,
MessageBox, etc., y se podría
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, también pueden
combinarlo con algún otro tipo de
protector, eso complicara muchísimo mas
las cosas al cracker , todo esto se suma
a las mejoras que les comente en el punto
numero uno.
[email protected]
Septiembre 2010
Alejandro Torres Ramírez