Uso del Win32Dasm
Para empezar aclarar que le Win32Dasm es un debuger ademas de un desensamblador, personalmente no me gusta el debuger que poseen aunque hay que tener en cuenta que es un lujo toda la informacion que nos proporcionan sobre los registros, DLLs, etc. en esta seccion aprenderemos en manejo basico del Win32Dasm para no perdernos :D
Antes de nada decir que el Win32Dasm con el que yo trabajo en estos momentos esta en su version 8.93, la mas alta hasta el momento (creo) y que usais en el futuro una version posterior puede que en este tutorial no se mencionen ciertas cosas.
Para empezar a trabajar con el Win32Dasm es habitual ejecutarle xDD asi que vamos a ello... Una vez ejecutado con encontraremos con algo como esto:
Habitualmente lo primero que se hace
es desensamblar directamente un programa... asi que vayamos a eso!!! Para ello
debemos entrar en el menu Disassembler y seleccionar
o cliquear en Open file to disassemble... o simplemente
ciquear el icono Despues seleccionaremos
el fichero que deseeis (este programa permite desensamblar multiples tipos de
ficheros como habeis podido comprobar. Estos ficheros pueden ser del tipo: exe,
386, com, cpr, drv, dll, fon, mpd, ocx, vbx, vxd y sys). Tras haber seleccionado
el programa en cuestion,puede tardar mas o menos tiempo en desensamblar, todo
depende del tamaño del mismo y de la velocidad de vuestro procesador.
Os aconsejo que despues de haber
desensamblado, si vais a seguir utilizando el codigo mas adelante, lo guardeis
en el disco duro para no tener que esperar de nuevo el proceso anterior; esto
se hace entrando en el menu Disassembler y Save
Disassembly Text File and create Project File, o mas sencillo cliquear
el segundo icono de la barra de herramientas
Con esto se crearan dos archivos, alf y wpj,
el 1º (alf)contiene el texto desensamblado y el 2º (wpj)lo utiliza
el programa W32Dasm para cargar el 1º (alf)
ATENCION: Aviso que los proyectos guardados ocupan habitualmente mas de 20Mb, mas o menos.
Para poder acceder despues a esos archivos guardados hemos de entrar en Project\Open Project File...
Cuando haya terminado el proceso de desensamblado, os econtrareis algo como esto:
Disassembly of File: Calc.exe <- Nombre del programa desensamblado (he elegido uno pequeñito xD)
Code Offset = 00001000, Code Size = 00012000
Data Offset = 00013000, Data Size = 00001000
Number of Objects = 0003 (dec), Imagebase = 01000000h
Object01: .text RVA: 00001000 Offset: 00001000 Size: 00012000 Flags: 60000020
Object02: .data RVA: 00013000 Offset: 00013000 Size: 00001000 Flags: C0000040
Object03: .rsrc RVA: 00014000 Offset: 00014000 Size: 00003000 Flags: 40000040
[...]
Esto o algo parecido nos encontraremos en todos los programas a desensamblar, de aqui podemos obtener informacion util sobre la cabecera del ejecutable, direcciones, offsets... cosas de esas ya sabeis :)
Lo siguiente que vereis son los datos de los menus del programa desensamblado con las IDs asignadas a cada uno (poco util!!!). Para ver esta informacion mas ordenada, debemos entrar en el menu Refs\Menu References.
+++++++++++++++++++ MENU INFORMATION ++++++++++++++++++
Number of Menus = 2 (decimal)
MenuID_006A
Edición {Popup}
Copiar Ctrl+C [ID=012Ch]
Pegar Ctrl+V [ID=012Dh]
Ver {Popup}
Estándar [ID=0130h]
Científica [ID=012Fh]
[...]
Avanzando veremos la informacion de los dialogos: Caption, IDs, Control Class, etc (yo nunca lo he usado). Al igual que con los menus, tenemos la opcion de ver las referencias a dialogos en el menu Refs\Dialog References.
+++++++++++++++++ DIALOG INFORMATION ++++++++++++++++++
Number of Dialogs = 4 (decimal)
Name: DialogID_0065, # of Controls=000, Caption:"Calculadora", ClassName:":˘˙jSciCalc"
Name: DialogID_0066, # of Controls=000, Caption:"Calculadora", ClassName:"§˙jSciCalc"
Name: DialogID_0067, # of Controls=007, Caption:"Cuadro de estadísticas", ClassName:""
001 - ControlID:0197, Control Class:"LISTBOX" Control Text:""
002 - ControlID:019B, Control Class:"BUTTON" Control Text:"&RET"
[...]
Si continuamos nos encontraremos con las funciones importadas, es decir los dll utilizados por el programa. A veces son utiles para comprobar si un programa utiliza un DLL propio que genere la clave de registro (ver la seccion pertienete):
+++++++++++++++++++ IMPORTED FUNCTIONS ++++++++++++++++++
Number of Imported Modules = 6 (decimal)
Import Module 001: SHELL32.dll
Import Module 002: MSVCRT.dll
Import Module 003: ADVAPI32.dll
Import Module 004: KERNEL32.dll
[...]
Mas adelante veremos los detalles
de los modulos importados y en que DLL se encuentran, junto con otro tipo de
informacion como la direccion en la que se encuentra ese modulo dentro del DLL
(esta informacion es util para injertar codigos adicionales a programas, por
ej. para que se apriete un boton automaticamente como en el Paint Shop Pro).
Esta informacion la podemos ver mas comodamente entrando en el menu Functions\Import
o en el icono
+++++++++++++++++++ IMPORT MODULE DETAILS +++++++++++++++
Import Module 001: SHELL32.dll
Addr:7FCE1666 hint(006E) Name: ShellAboutA
Import Module 002: MSVCRT.dll
Addr:7969B871 hint(00D0) Name: _exit
Addr:796B5CA3 hint(01C5) Name: _strrev
[...]
Y despues de los detalles de los modulos importados, los de los modulos exportados (no muy habitual):
+++++++++++++++++++ EXPORTED FUNCTIONS ++++++++++++++++++
Number of Exported Functions = 0000 (decimal) <- En este caso no hay modulos exportados
Y despues de esta introduccion.... el esperado codigo ensamblador del programa victima!!!
+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++
//********************** Start of Code in Object .text **************
Program Entry Point = 010119E0 (Calc.exe File Offset:000249E0)
:01001000 D114E8 rcl dword ptr [eax+8*ebp], 1
:01001003 BF3415E8BF mov edi, BFE81534
:01001008 44 inc esp
:01001009 16 push ss
:0100100A E8BF000000 call 010010CE
:0100100F 003C51 add byte ptr [ecx+2*edx], bh
:01001012 F2 repnz
:01001013 BF3551F2BF mov edi, BFF25135
:01001018 00000000 BYTE 4 DUP(0)
[...]
Hasta aqui todo bien, no? Ahora explicare un poco como "leer" el codigo asm al que nos enfrentamos a diario, vermos como saltar de una direccion a otra, entrar en un call, como funcionan y se indican salton condicionales e incondicionales, referencia a cadenas, etc
- Entrar en una CALL: Basicamente lo unico que hemos de hacer es situar la linea de color azul sobre la CALL a la que queremos llamar haciendo un doble clic, tras esto, la linea cambiara a verde, esto nos indica que podemos "entrar".
Para poder entrar en la CALL tan
solo debemos entrar en el menu Execute Text\Execute Call
o cliquear el boton Y para salir
de la CALL: Execute Test\Return From Call o cliquear
Esta operacion la podermos concatenar, es decir, que podemos entrar en una CALL y en otra y en otra... volviendo a la ultima CALL.
- Realizar un salto: Debemos hacer lo mismo que en CALL situar la linea sobre el salto en cuestion:
Y para ver el codigo hacia donde
salta entrar en Execute Text\Execute Jump o cliquear
y para volver del salto entrar
en Execute Text\Return From Last Jump o
.
No hace falta decir que podemos concatenar tambien los saltos, al igual que las CALL
- Referencia a Cadenas (Strings References):
Todos los programas poseen cadenas de texto, y estas pueden ser buscadas facilmete
con el W32Dasm entrando en el menu Refs\String Data References
o cliqueando en el icono .
Una vez dentro vermeos todo un juego de cadenas existentes en el programa en
cuestion. Para poder dirigirnos a la direccion que llama a esa cadena hemos
de seleccionarla y despues hacer dobleclic sobre ella; ni decir tiene que puede
haber varias referencias a una misma cadena por lo que si volvemos a hacer dobleclic
sobre ella, puede que aparezca otra direccion diferente. Una vez estemos en
la direccion de la cadena encontraremos algo similar a esto:
* Possible Reference to String Resource ID=00001: "Cadena de texto"
|
:01002A01 6A01 push 00000001
:01002A03 894104 mov dword ptr [ecx+04], eax
[...]
TRUCO: Habitualmente en un programa hay tal cantidad de cadenas que resulta un arduo trabajo buscar una por una la cadena que deseamos, por ello yo utilizo la opcion Copy All que tenemos en un boton que nos copia todas las cadenas. Despues entro en un editor de textos sencillo, como el NotePad, pego las cadenas y, con la opcion buscar, busco la cadena en cuestion.
- Saltos condicionales e incondicionales y CALLs: Volviendo de nuevo a los saltos!!! Cuando yo me encuentro un codigo, y deseo saber si se ha accedido a este codigo a traves de un salto o una llamada, W32DAsm nos lo indica con un codigo como este:
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:010024D2(C), :010024DB(C)
|
:01002A46 83FE60 cmp esi, 00000060
:01002A49 0F8283010000 jb 01002BD2
[...]
Este codigo nos indica que las direcciones 010024D2 y 10024DB accedes a esta parte del codigo a traves de un salto condiconal (C).
* Referenced by a CALL at Address:
|:01005E7B
|
:01005D02 A188320101 mov eax, dword ptr [01013288]
:01005D07 8B0D1C300101 mov ecx, dword ptr [0101301C]
[...]
Y este de aqui nos indica que se accede a la direccion 1005D02 a traves de una CALL en la direccion 01005E7B.
NOTA: Si quereis saber la utilidad que esto tiene en nuestro pricinpal objetivo, cracking, ve a la seccion de Obtencion de Serials
Hemos de observar en la parte inferior del W32DAsmnos encontraremos con algo como esto:
Esta linea proporciona los siguientes datos:
Line: XXX (Linea en la que te encuentras del codigo)
Pg XXX of XXX (Pagina en la que te encuentras y el total de paginas que ocupa el codigo en Asm)
Code Data @: XXXXXXXX @Offset XXXXXXXXh in file: Programa.exe (Data: Direccion en la que estas, Offset: Offset en el que estas, File: Nombre del programa que has desensambado)
Para finalizar mencionar que para
poder acceder a una direccion determinada se puede hacer en el menu Goto\Goto
Code Location o cliquear en el icono
, y donde podeis encontrar alguna otra opcion. Y tambien decir que para poder
buscar una cadena de texto en todo el codigo entrar en Search\Find
Text o cliquear en
.
Hay algunas opciones que me he saltado, pero no he querido extender mas esta seccion ya que ha sobrepasado mis espectativas. Aunque os animo a que investigueis por vuestra cuenta y amplieis este tutorial. Decir tambien que no he explicado el funcionamiento del debugger porque, en mi opninion, no es nada bueno y siquiera se usarlo : \