Witam. Proszę o wskazanie mi dobrych dekompilatorów. Dobrych tz. działających i generujących w miarę czytelny kod. Jak do tej pory próbowałem używać dwóch:
-plugina do IDA
-boomerang
Problem z pierwszym polega na tym, że generuje dość dziwny kod, i ogólnie nieczytelne nazwy funkcji i zmiennych(nieczytelne tz. np sub_XXXXXX i ciezko odroznic jedna taka funkcje od drugiej; jak juz to wolalbym zeby generowalo cos w stylu sub1, sub2....)
Ale to maly problem w porownaniu z czyms takim:
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
CHAR File; // [sp+2Ch] [bp-100h]@5
sub_423730();
(*(void (__stdcall **)(_DWORD, _DWORD, _DWORD))(*LODWORD(dword_54FD30) + 80))(LODWORD(dword_54FD30), "Data.chunk", 0);
sub_449690();
if ( !(unsigned __int8)sub_4237E0()
&& (unsigned __int8)(*(int (__stdcall **)(_DWORD))(*LODWORD(dword_54FD30) + 4))(LODWORD(dword_54FD30)) )
{
(*(void (__stdcall **)(_DWORD))(*LODWORD(dword_54FD30) + 128))(LODWORD(dword_54FD30));
(*(void (__cdecl **)(_DWORD, _DWORD, _DWORD))(*LODWORD(dword_54FD30) + 20))(LODWORD(dword_54FD30), "Loading...", 0);
sub_4490C0();
(*(void (__cdecl **)(_DWORD, _DWORD))(*LODWORD(dword_54FD30) + 20))(LODWORD(dword_54FD30), "Starting...");
(*(void (__cdecl **)(_DWORD))(*LODWORD(dword_54FD30) + 12))(LODWORD(dword_54FD30));
(*(void (__cdecl **)(_DWORD, _DWORD))(*LODWORD(dword_54FD30) + 20))(LODWORD(dword_54FD30), "Clearing things...");
sub_41E4E0();
(*(void (__cdecl **)(_DWORD, _DWORD))(*LODWORD(dword_54FD30) + 20))(LODWORD(dword_54FD30), "Freeing objects...");
sub_448C70();
(*(void (__stdcall **)(_DWORD, _DWORD))(*LODWORD(dword_54FD30) + 20))(LODWORD(dword_54FD30), "Freeing sounds...");
sub_43F4A0();
(*(void (__cdecl **)(_DWORD, _DWORD))(*LODWORD(dword_54FD30) + 20))(LODWORD(dword_54FD30), "Freeing textures...");
sub_449640();
}
(*(void (__cdecl **)(_DWORD, _DWORD))(*LODWORD(dword_54FD30) + 20))(LODWORD(dword_54FD30), "Removing resource...");
(*(void (__stdcall **)(_DWORD, _DWORD))(*LODWORD(dword_54FD30) + 84))(LODWORD(dword_54FD30), "Data.chunk");
(*(void (__cdecl **)(_DWORD, _DWORD))(*LODWORD(dword_54FD30) + 20))(LODWORD(dword_54FD30), "Shutting down...");
(*(void (__stdcall **)(_DWORD))(*LODWORD(dword_54FD30) + 8))(LODWORD(dword_54FD30));
(*(void (__stdcall **)(_DWORD))*LODWORD(dword_54FD30))(LODWORD(dword_54FD30));
if ( byte_54FD70 )
{
GetModuleFileNameA(0, &File, 0x100u);
ShellExecuteA(0, "open", &File, 0, 0, 1);
}
return 0;
}
(*(void (__stdcall **)(_DWORD, _DWORD, _DWORD))(*LODWORD(dword_54FD30) + 80))(LODWORD(dword_54FD30), "Data.chunk", 0);
Nawet nie jestem w stanie tego odczytac - te wszystkie gwiazdki, nawiasy sie mi rozmywaja
Przy czyms takim musze przeskakiwac do widoku asemblera:
mov eax, dword_54FD30
push 0
push offset aData_chunk ; "Data.chunk"
push eax
mov ecx, [eax]
call dword ptr [ecx+50h]
Czy naprawde tego sie nie na zapisac jakos czytelniej, na kilka linii?
Cos w stylu
_eax = &dword_54FD30
_ecx = eax
((*ecx+50h)(eax, aData_chunk, 0)); //nie wiem czy to jest poprawne, nigdy nie uzywalem wskaznikow na funkcje
- Boomerang.
Tutaj, jesli wierzyc przykladowi na stronie projektu, kod wyglada bardzo czytelnie. Niestety, dekompiler mi nie dziala. Niewazne czy wybiore wersje gui czy konsolowa, zawsze crashuje sie prawie na koncu procesu dekompilacji(wtedy jak tworzy chyba jakies drzewo czy graf funckcji)
Czy sa jakies inne alternatywy?