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 |
Published by Quequero |
|
|
Qualche mio eventuale commento sul tutorial :))) |
...non ha la
ragazza! |
.... |
|
.... |
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...
Introduzione |
Tools usati |
URL o FTP del programma |
Essay |
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 :). .text:0041FC1D |
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.