A:link { TEXT-DECORATION: underline } A:visited { TEXT-DECORATION: underline } A:active { COLOR: red; TEXT-DECORATION: underline } A:hover { COLOR: #8080ff; TEXT-DECORATION: underline }

AXE 3.2b serial fishing

Data

by Spider

 

02/07/2003

UIC's Home Page

Published by Quequero


Chi fa da sé...

Qualche mio eventuale commento sul tutorial :)))

...non ha la ragazza!
(James Tont)

....


Home page se presente:
http://bigspider.cjb.net
E-mail: spider_xx87 (at) hotmail (dot) com
Nick, canale IRC frequentato: ^Spider^ su irc.azzurra.it, #crack-it e #asm

....

Difficoltà

(X)Demens ()NewBies ( )Intermedio ( )Avanzato ( )Master

 

Da tanto tempo non scrivevo nulla, e, a dire il vero, è da tanto tempo che non reversavo proprio nulla. Il tempo è quello che è, cioè un bastardo che non basta mai...

Oggi un target facilefacile, tanto per riscaldarci un po'... oddio, con il caldo che fa meglio di no... Diciamo per rinfrescare le idee, che è meglio :)
Accendo il ventilatore e iniziamo...


AXE 3.2b
Written by Spider

Introduzione

No, non è un dopobarba... AXE 3.2b è un simpatico hexeditor, anche se vale comunque meno di un pelo, ad esempio, di WinHex.
E' un time trial di 30 giorni che si può ovviamente sbloccare con l'apposita password :)

Tools usati

Tools usati:
- SoftICE (aka IL debugger)
- IDA Pro 4.30 (aka IL disassembler :P)

URL o FTP del programma

Trovate il programma all'indirizzo http://www.jbrowse.com/products/axe

Essay

Apriamo il programma e clicchiamo come al solito su Help-->Register.
Ci compare una bella finestrella con tre campi:

ComputerID:             153503125
Your Name:
Registration Code:

Ovviamente il ComputerID sarà diverso sul vostro PC.

Bene, apriamo SoftICE, settiamo i due classici ma noiosi breakpoint su GetDlgItemTextA e GetWindowTextA, inseriamo un nome ("Spider") e un serial a caso ("123123123"), clicchiamo su OK e... seriale giusto!... No scherzo :)
Softice poppa 2 volte, la prima volta per prelevare il serial inserito, la seconda per prelevare il nome. Al primo breakpoint premiamo F11 per tornare al chiamante e ci ritroviamo su MFC (che rompiscatole 'sti framework!) steppiamo qualche riga con F10 e ci ritroviamo finalmente nel codice del programma che si trova intorno all'indirizzo 0042BBE7. Prendiamo IDA, disassembliamo l'exe (non devo mica spiegarvi come si fa, vero? :)) clicchiamo Jump To Address dal menu Jump, scriviamo 0042BBE7 e clicchiamo OK... Ed ecco il nostro bel codice:

.text:0042BBDA  mov ecx, esi
.text:0042BBDC  push eax
.text:0042BBDD  push 427h
.text:0042BBE2  mov byte ptr [esp+70h], 1
.text:0042BBE7  call ?GetDlgItem@CWnd@@QBEPAV1@H@Z ; CWnd::GetDlgItem(int)
.text:0042BBEC  mov ecx, eax
.text:0042BBEE  call ?GetWindowTextA@CWnd@@QBEXAAVCString@@@Z ; preleva il serial number
.text:0042BBF3  lea ecx, [esp+14h]
.text:0042BBF7  push ecx
.text:0042BBF8  push 1065
.text:0042BBFD  mov ecx, esi
.text:0042BBFF  call ?GetDlgItem@CWnd@@QBEPAV1@H@Z ; CWnd::GetDlgItem(int)
.text:0042BC04  mov ecx, eax
.text:0042BC06  call ?GetWindowTextA@CWnd@@QBEXAAVCString@@@Z ; preleva il nome
.text:0042BC0B  mov edx, [esp+14h]
.text:0042BC0F  push offset aNotfound ; "NOTFOUND"
.text:0042BC14  push edx
.text:0042BC15  call ds:_stricmp
.text:0042BC1B  add esp, 8
.text:0042BC1E  cmp eax, ebx
.text:0042BC20  jnz short loc_42BC2E
.text:0042BC22  push ebx
.text:0042BC23  push ebx
.text:0042BC24  push offset aNoMatchesFound ; "No matches found."
.text:0042BC29  call ?AfxMessageBox@@YGHPBDII@Z ; AfxMessageBox(char const *,uint,uint)
.text:0042BC2E  
.text:0042BC2E  loc_42BC2E:                      ; CODE XREF: .text:0042BC20j
.text:0042BC2E  mov eax, [esp+18h]
.text:0042BC32  lea edi, [esi+64h]
.text:0042BC35  push edi
.text:0042BC36  push offset aLu ; "%lu"
.text:0042BC3B  push eax
.text:0042BC3C  call ds:sscanf
.text:0042BC42  add esp, 0Ch
.text:0042BC45  lea ecx, [esp+14h]
.text:0042BC49  lea ebp, [esi+68h]
.text:0042BC4C  push ecx
.text:0042BC4D  mov ecx, ebp
.text:0042BC4F  call ??4CString@@QAEABV0@ABV0@@Z ; CString::operator=(CString const &)
.text:0042BC54  push ecx
.text:0042BC55  mov ecx, esp
.text:0042BC57  mov [esp+14h], esp
.text:0042BC5B  push ebp
.text:0042BC5C  call ??0CString@@QAE@ABV0@@Z ; CString::CString(CString const &)
.text:0042BC61  mov edx, [edi]
.text:0042BC63  mov eax, [esi+60h]
.text:0042BC66  push edx
.text:0042BC67  push eax
.text:0042BC68  mov byte ptr [esp+74h], 1
.text:0042BC6D  call sub_410A10
.text:0042BC72  mov ecx, eax
.text:0042BC74  call sub_41FBB0
.text:0042BC79  cmp eax, ebx
.text:0042BC7B  jz loc_42BFA9

Qui c'è ben poco da esplorare... preleva nome e serial, e fa poi qualche operazione con le stringhe che non è il caso di analizzare. Interessanti invece le ultime righe. La prima call (call sub_410A10) non contiene nulla di utile. Diverso è per la seconda. Dopo la call infatti abbiamo un cmp eax, ebx e un jz molto sospetti. Infatti ebx è stato azzerato alla riga 0042BBC7 (che non ho riportato per brevità) e poi non è più sato modificato (e siamo sicuri che neppure le varie call non ne alterino il valore perché gli standard impongono alle subroutines di salvare i registri ebx, esi ed edi). D'altronde si vede facilmente da SoftICE che invertendo il jz il programma visualizza la messagebox di registrazione avvenuta... Esploriamo dunque la sub_41FBB0:


.text:0041FBB0 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
.text:0041FBB0  
.text:0041FBB0  
.text:0041FBB0 sub_41FBB0 proc near ; CODE XREF: sub_41F3D0+67Cp
.text:0041FBB0                      ; sub_41FCD0+198p ...
.text:0041FBB0  
.text:0041FBB0 var_C  = dword ptr -0Ch
.text:0041FBB0 var_4  = dword ptr -4
.text:0041FBB0 arg_0  = dword ptr 4
.text:0041FBB0 arg_4  = dword ptr 8
.text:0041FBB0 arg_8  = dword ptr 0Ch
.text:0041FBB0  
.text:0041FBB0  mov eax, large fs:0
.text:0041FBB6  push 0FFFFFFFFh
.text:0041FBB8  push offset loc_4553C8
.text:0041FBBD  push eax
.text:0041FBBE  mov large fs:0, esp
.text:0041FBC5  push ebx
.text:0041FBC6  push esi
.text:0041FBC7  push edi
.text:0041FBC8  mov eax, [esp+18h+arg_8]
.text:0041FBCC  mov [esp+18h+var_4], 0
.text:0041FBD4  mov ecx, [eax-8] ;mette in ecx la lunghezza del seriale inserito
.text:0041FBD7  test ecx, ecx
.text:0041FBD9  jz loc_41FCA6
.text:0041FBDF  mov esi, [esp+18h+arg_4] ;mette in esi il seriale inserito convertito in numero
.text:0041FBE3  test esi, esi
.text:0041FBE5  jz loc_41FCA6
.text:0041FBEB  cmp esi, 2725h ;confronta il seriale inserito con 10021...
.text:0041FBF1  jnz short loc_41FC1D
.text:0041FBF3  lea ecx, [esp+18h+arg_8]
.text:0041FBF7  mov [esp+18h+var_4], 0FFFFFFFFh
.text:0041FBFF  call ??1CString@@QAE@XZ ; CString::~CString(void)
.text:0041FC04  mov eax, 1
.text:0041FC09  mov ecx, [esp+18h+var_C]
.text:0041FC0D  mov large fs:0, ecx
.text:0041FC14  pop edi
.text:0041FC15  pop esi
.text:0041FC16  pop ebx
.text:0041FC17  add esp, 0Ch
.text:0041FC1A  retn 0Ch
.text:0041FC1D  ; ---------------------------------------------------------------------------

Se proviamo a mettere 10021 come seriale, avremo una bella sorpresa... E' un seriale valido!!! Questa key è universale e valida a prescindere da ComputerID e Name :).
Troppo facile, quindi... andiamo alla ricerca del nostro  seriale specifico :)

.text:0041FC1D  
.text:0041FC1D  loc_41FC1D: ; CODE XREF: sub_41FBB0+41j
.text:0041FC1D  cmp ecx, 4
.text:0041FC20  jge short loc_41FC34 ; ecx contiene la lunghezza del nome inserito
.text:0041FC22  push offset aAbcd ; "abcd" ;se il seriale è più piccolo di 4 caratteri
.text:0041FC27  lea ecx, [esp+1Ch+arg_8]   ;aggiunge la stringa "abcd"
.text:0041FC2B  call ??YCString@@QAEABV0@PBD@Z ; CString::operator+=(char const *)
.text:0041FC30  mov eax, [esp+18h+arg_8]
.text:0041FC34  
.text:0041FC34  loc_41FC34: ; CODE XREF: sub_41FBB0+70j
.text:0041FC34  mov ecx, [eax-8] ; ecx contiene la lunghezza del nome inserito
.text:0041FC37  mov bl, [eax+2] ; bl = 3° char del nome
.text:0041FC3A  mov dl, [eax] ; dl = 1° char
.text:0041FC3C  movsx eax, byte ptr [ecx+eax-1] ; ultimo char
.text:0041FC41  movsx edi, bl ; edi = bl = 3° char
.text:0041FC44  movsx edx, dl ; edx = dl = 1° char
.text:0041FC47  add eax, edi
.text:0041FC49  add eax, edx
.text:0041FC4B  imul eax, ecx
.text:0041FC4E  and eax, 8FFFFFFFh
.text:0041FC53  jns short loc_41FC5C ;salta sempre dato che l'and precedente azzera il segno
.text:0041FC55  dec eax
.text:0041FC56  or eax, 0F0000000h
.text:0041FC5B  inc eax
.text:0041FC5C  
.text:0041FC5C  loc_41FC5C: ; CODE XREF: sub_41FBB0+A3j
.text:0041FC5C  cmp esi, 10000000h ;se il serial inserito è maggiore di 268435456...
.text:0041FC62  jbe short loc_41FC6B
.text:0041FC64  add eax, 10000000h ;...aggiunge 268435456 ad eax
.text:0041FC69  jmp short loc_41FC71
.text:0041FC6B  ; ---------------------------------------------------------------------------
.text:0041FC6B  
.text:0041FC6B  loc_41FC6B: ; CODE XREF: sub_41FBB0+B2j
.text:0041FC6B  mov ecx, [esp+18h+arg_0] ;mette in ecx il Computer ID
.text:0041FC6F  add eax, ecx ;e lo aggiunge ad eax
.text:0041FC71 
.text:0041FC71  loc_41FC71: ; CODE XREF: sub_41FBB0+B9j
.text:0041FC71  xor eax, 39A13D7h ;xor con questo bel numerino...
.text:0041FC76  xor edx, edx ;e infine...
.text:0041FC78  cmp esi, eax ;...Il numerino trovato è il nostro seriale (in decimale, ovviamente)!
.text:0041FC7A  lea ecx, [esp+18h+arg_8]
.text:0041FC7E  setz dl
.text:0041FC81  mov esi, edx
.text:0041FC83  mov [esp+18h+var_4], 0FFFFFFFFh
.text:0041FC8B  call ??1CString@@QAE@XZ ; CString::~CString(void)
.text:0041FC90  mov eax, esi
.text:0041FC92  mov ecx, [esp+18h+var_C]
.text:0041FC96  mov large fs:0, ecx
.text:0041FC9D  pop edi
.text:0041FC9E  pop esi
.text:0041FC9F  pop ebx
.text:0041FCA0  add esp, 0Ch
.text:0041FCA3  retn 0Ch
.text:0041FCA6 ; ---------------------------------------------------------------------------
.text:0041FCA6 
.text:0041FCA6  loc_41FCA6: ; CODE XREF: sub_41FBB0+29j
.text:0041FCA6             ; sub_41FBB0+35j
.text:0041FCA6  lea ecx, [esp+18h+arg_8]
.text:0041FCAA  mov [esp+18h+var_4], 0FFFFFFFFh
.text:0041FCB2  call ??1CString@@QAE@XZ ; CString::~CString(void)
.text:0041FCB7  mov ecx, [esp+18h+var_C]
.text:0041FCBB  pop edi
.text:0041FCBC  pop esi
.text:0041FCBD  xor eax, eax
.text:0041FCBF  mov large fs:0, ecx
.text:0041FCC6  pop ebx
.text:0041FCC7  add esp, 0Ch
.text:0041FCCA  retn 0Ch
.text:0041FCCA  sub_41FBB0 endp

Tutto qui, dopo un po' di banali calcoli il programma fa un confronto diretto tra il risultato ed il seriale inserito. Seguendo il codice con softice il valore in eax risultava 0ABC5F7E, cioè, in decimale, 180117374.

Registration Succeeded!


NON vi chiedo di fare il keygen perché sarebbe un'offesa alla vostra intelligenza...

Spider

Note finali

Saluti a AndreaGeddon, Quequero, +Malattia, Yado, [kill3xx], TheMR, Bubbo, Case, albe, _Blackdeath_, ph0b0s, Cieli Sereni, DsE, cHr, True-love, Quake2^AM, CrazyKiwi, _d31m0s_, Ritz, Pbdz, x86, NikDH, Dark-Angel, Dades, CyberPK, Guzura, littleluk, BluDestiny, ntoskrnl, Pincopall, Master Shadow, JEYoNE, ded, Gogetto, PaStOrE, _Rox_, Maranik, ZaiRoN, Tanat0s, tutta la crew di RingZer0, gli studenti dell'UIC e di Itassembly e i frequentatori di #crack-it e #asm

Disclaimer

Vorrei ricordare che il software va comprato e non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione.

Noi reversiamo perché non sappiamo fare nient'altro.


Home