Jako ciekawostka, moje rozwiązanie było zupełnie inne niż rozwiązanie @Bartosz Wójcik.
(Trochę przeskoczę kilka problemów bo nie było aż tak prosto do celu, ale żeby nie zanudzać & nie pisać za dużo :P).
-
Spróbowałem zdekompilować CrackMe.exe, zobaczyłem że wszystko tam brzydkie bardzo i nawet nie próbowałem analizować.
-
Uruchomiłem program CrackMe.exe
-
Zaatachowałem się do programu za pomocą IDA Pro (deasembler/debugger aplikacji natywnych).
-
Kiedy wpiszemy złe hasło pojawia się windowsowy natywny messagebox - więc dałem breakpoint na MessageBoxW w user32.dll
-
Wpisałem złe hasło, poczekałem na breakpoint i popatrzyłem na stack trace:
-
Znalazłem na ramce stosu odpowiednią funkcję (hard part) - jako że ramka stosu była uszkodzona trochę i akurat tej jednej funkcji której szukałem na niej nie było, dałem breakpointy na wszystkich funkcjach pomiędzy MessageBoxW (na pewno za wysoko) a debug064 (na pewno za nisko() i patrzyłem po kolei co się wywołuje
-
Znalazłem funkcję która zaczynała się tak:
v2 = (*(int (**)(void))(*this[81] + 356))();
v3 = ((int (__fastcall *)(signed int, void *))unk_3C72A8)(-1084468574, &unk_1E7AC4);
if ( ((int (__fastcall *)(int, int))unk_6F421E60)(v2, v3) ) {
...
} else {
...
}
Co domyśliłem się że w oryginale wyglądało jakoś tak:
textbox_string = (*(int (**)(void))(*this[81] + 356))();
password = ((int (__fastcall *)(unsigned int, void *))decrypt_string)(0xBF5C52A2, &unk_307AC4);
if ( ((int (__fastcall *)(int, int))str_equals)(textbox_string, password) )
Teraz wystarczył breakpoint w momencie wywołania if() i odzyskałem hasło w plaintexcie.
Może to brzmiec jak overkill (używanie debuggera natywnego do analizy aplikacji .netowej), ale było zaskakująco przyjemne (w sumie JITowany kod niewiele różnił się od typowego kompilowanego) - jedynym problem był brak symboli (ale to standard tez przy analizie malware), przez co trzeba by się było trochę domyślać jak wyglądają struktury w środku.