Crackme 6 (C) - pokročilý
S/N, zjištění správného sériového čísla, vytvoření keygenu
UPOZORNĚNÍ: TENTO DOKUMENT SLOUŽÍ POUZE KE STUDIJNÍM ÚČELŮM. AUTOR NENESE ŽÁDNOU ZODPOVĚDNOST ZA JEHO ZNEUŽITÍ
UPOZORNĚNÍ: TENTO DOKUMENT SLOUŽÍ POUZE KE STUDIJNÍM ÚČELŮM. AUTOR NENESE ŽÁDNOU ZODPOVĚDNOST ZA JEHO ZNEUŽITÍ
Soubor Serial3.zip
Jako vždy si crackme nejprve spustíme a prohlédneme. Tentokrát již bude sériové číslo
počítáno jinak, než za pomocí zadaného jména, ale jak vidíme, tak bude pravděpodobně
generováno pomocí sériového čísla svazku některého z logickcýh disků. Získání sériového
čísla svazku se provádí pomocí API GetVolumeInformation.
Načteme crackme do debuggeru a skočíme na začátek funkce GetVolumeInformationA
(CTRL + G), na začátek této funkce dáme breakpoint a program spustíme (F9). Debugger
zastaví běh programu, podíváme se do zásobníku, odkud byla API volána a dozvíme se, že
z adresy 0040118D, odstraníme break point a skočíme na uvedenou adresu. Před námi je nyní
tento kód:
| 0040117E PUSH EAX | ;lpMaxFilenameLength |
| 0040117F PUSH 00405030 | ;lpVolumeSerialNumber |
| 00401184 PUSH 0 | ;MaxVolumeNameSize = 0 |
| 00401186 PUSH 0 | ;VolumeNameBuffer |
| 00401188 PUSH 004050E4 | ;RootPathName = "C:\" |
| 0040118D CALL GetVolumeInformationA | |
| 00401193 MOV EDI,EAX | ;EDI = návratová hodnota API |
| 00401195 TEST EDI,EDI | ;EDI = 0 ? |
| 00401197 JE SHORT 004011BE | ;pokud ano, došlo k chybě, konec |
| 00401199 MOV EAX,DWORD PTR [405030] | ;EAX = sériové číslo svazku |
| 0040119E PUSH EAX | ;3. číselná hodnota |
| 0040119F PUSH 004050DC | ;2. ukazatel na string "%08X" |
| 004011A4 PUSH ESI | ;1. ukazatel na zásobník |
| 004011A5 CALL 00401320 | ;zavolání neznámé funkce |