OK, keygenerátor je kompletný a lvl6 pokorený. Včera večer som na to po chvíľke do?iel. Ak má niekto stále s ním problémy, čítajte dalej, ak na to chcete prísť, tak tento príspevok ignorujte a poskú?ajte sa ďalej.
V lvl6 je na prvý pohľad zjavné, ?e je pou?itý SEH, antidebugging a tie? antidisassembling. OllyDbg mi prezradil, ?e na 004010C9 je SE handler. Potom som sa haluzne dostal ďalej, sledoval som volania, ktoré sa mi vypísali v stack okne.
Nasleduje nejaká spleť DB definícií (blok 00401711 - 00401897), čo sú v?ak in?trukcie, tak?e po označení celého bloku a zvolení funkcie Analysis - During next... - Command (thx RoboCop) sú čitateľné niektoré volania CALLs, čo dosť napovedá. V?iminite si e?te skok na 0040170C, ten nás presúva na koniec tejto spleti DB. Po men?ej úvahe a spôsobe, resp. poradi volania funkcií GetProcAddress a GetModuleHandleA som si uvedomil, ?e tie in?trukcie sú vlastne otočené, tak?e stačí celý blok otočiť a máme korektný kód. A toto sa deje i na ďal?ích miestach, kde vidno podozrivé DB definície a pred nimi skok na ich koniec.
Následne som na?iel ďal?ie volania, v zásobníku výsledný key (thx Master) a postupne som sa dovtípil, ako sa key generuje.
Tu je výčet jednolivých volaných funkcií.
0040187D GetProcAddress - GetDlgItemTextA (pomocou dynamického linkovania)
00401854 GetVolumeInformationA
call 00402660 - Convert Serial Number to Deciamal String (buggy convert

)
lstrlenA (pomocou dynamického linkovania)
call 0040119B - CRC32
V?imol som si plno volaní call 00401046, čo je vlastne BP check a CC si vypočítava pomocou 48 xor 84.
Konvertovanie Volume Serial čísla na reťazec sa mi zdá, ?e je tro?ku divné, tak?e som musel tento prepis vyu?iť i v mojom keygene, rovnako je na tom jedna funkcia v lvl5.
00401724 call Newbie_1.00401605 je volanie good/bad boy, v prípade úspechu sa zobrazí hlá?ka Goood job a pokiaľ overenie zlyhá, tak sa zatrasie oknom, čo zabezpečujú rutinky Sleep, GetWindowRect a SetWindowPos.
E?te dodám, ?e v OllyDbg mám nastavené v Debuging Options - Exeptions ignorovanie výnimiek.
Podrobnej?í popis spracujem v eseji, teraz je to trochu neucelené, no niektoré časti musím e?te preskúmať. Jedno z nich je i dvojité volanie GetVolumeInformation, atď. Nájde sa tam dosť haluziek, no do kritického bloku sa v?dy podarí ten jeden BP nahodiť.
// added: RoboCop mi poslal tento text, ktorý daný beh ozrejmí viacej.
Výhody kódu be?iaceho pospiatky
Hlavnou výhodou takéhoto kódu je skutočne to, ?e jeho činnosť je relatívne ťa?ko odhaliteľná. Okrem nesprávneho smeru toku programu toti? dĺ?ky in?trukcií, ktoré vkladáme po ka?dom riadku v časti be?iacej pospiatky, spôsobujú, ?e kód nie je správne disassemblovaný.
Debugger (resp. disassembler) toti? nevie, ?e SEH upravuje EIP a v skutočnosti je prvý bajt po ka?dej in?trukcii preskočený. Preto sa sna?í disassemblovať ako in?trukciu aj na?u informáciu o dĺ?ke. Jeho snaha samozrejme spoľahlivo deformuje zvy?ok in?trukcií.
zdroj: http://www.zive.sk/h/TestCentrum/AR.asp?ARI=115163