Jak mohu najít main ()
vzhledem k binárnímu souboru a pouze pomocí nástroje jako ndisasm
? Nechci používat inteligentní nástroje, jako je IDA Pro, protože Dělám toto cvičení, abych se učil.
Jak mohu najít main ()
vzhledem k binárnímu souboru a pouze pomocí nástroje jako ndisasm
? Nechci používat inteligentní nástroje, jako je IDA Pro, protože Dělám toto cvičení, abych se učil.
Je to docela složité a vyžaduje to spoustu TRPOSTI. Předpokládám, že se zde snažíte najít funkci main
tak, jak je definována v C, a ne jako vstupní bod vašeho programu. Je velmi těžké najít to, co hledáte, skenováním kódu očima mozku &. Ale tady je způsob. Co můžete udělat, je nejprve zkontrolovat záhlaví binárního souboru, který se pokoušíte rozebrat. Níže najdete výstup readelf -h
v náhodném souboru. Pokud soubor není poškozen (úmyslně či nikoli), budete moci najít adresu vstupního bodu .
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Třída: ELF64 Data: doplněk 2, malý endian Verze: 1 (aktuální) OS / ABI: UNIX - Systém V ABI Verze: 0 Typ: EXEC (spustitelný soubor) Stroj: Advanced Micro Devices Verze X86-64: 0x1 Adresa vstupního bodu: 0x400440 Začátek záhlaví programu: 64 (bajtů do souboru) Začátek záhlaví sekce: 4680 (bajtů do souboru ) Příznaky: 0x0 Velikost tohoto záhlaví: 64 (bajtů) Velikost záhlaví programu: 56 (bajtů) Počet záhlaví programu: 8 Velikost záhlaví sekcí: 64 (bajtů) Počet záhlaví sekcí: 35 Index tabulky řetězců záhlaví sekce: 32
Tato adresa obvykle směřuje k místu jednoho z prvních bloků kódu, který bude spuštěn za běhu (funkce _start
) a který bude před voláním
Musím vás však varovat, pokud máte co do činění s binárními soubory ELF, mohlo by se to ukázat jako složitější, protože obsahují tabulky ctor
a dtor
, které obsahují ukazatele na funkce, které se provádějí před a po funkci main
. Při práci se staticky propojenými binárními soubory se také děje nějaká nezdokumentovaná podivnost. A samozřejmě si ostatní programy vystačí bez funkce main
a mohou volat, co chtějí.