Otázka:
Jak najít main () v binárním formátu?
drum
2014-04-26 02:37:10 UTC
view on stackexchange narkive permalink

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.

Věřím, že na tuto otázku jsem již odpověděl v odpovědi na tuto otázku: [Reversing ELF 64-bit LSB executable, x86-64, gdb] (http://reverseengineering.stackexchange.com/questions/3815/reversing-elf -64-bit-lsb-spustitelný-x86-64-gdb / 3816 # 3816). Neváhejte upravit svou otázku, abyste se zeptali na další podrobnosti, pokud vám něco chybí.
@perror A byla to fantastická odpověď. Je škoda, když lidé ani nevěnují pozornost pomoci, kterou jste jim poskytli.
Jakou platformu / OS / kompilátor chcete zpracovat? Uveďte několik konkrétních příkladů.
@perror Skvělá odpověď. Byl by to velký rozdíl ve Windows? Je také nemožné zjistit vstupní bod bez této informace?
Ano, bylo by to velmi odlišné. Ve skutečnosti v této odpovědi popisuji vazbu na kompilátor `gcc`. Pokud tedy uvažujete o jiném kompilátoru, rozložení se může úplně lišit. Pokud ale hledáte funkci „main“ v kontextu MS-Windows, musíte upravit svoji otázku, abyste ji specifikovali. Pomůže získat přesnější odpověď.
@perror, musím tě v tom opravit. Není vázán na kompilátor, spíše na formát binárního souboru: `ELF`,` PE`, ... se kterým kompilátor nemá nic společného.
Ne, je skutečně vázán na kompilátor. Nemluvím o vstupním bodě, ale o umístění procedury `main`, která probíhá po načtení dynamických knihoven. Každý kompilátor má svou vlastní funkci. Je tedy vázán na kompilátor.
@perror Z tohoto pohledu souhlasím. Ale předpokládám, že jste to měli uvést ve svém komentáři. Technicky vzato, umístění funkce „main“ není důležité, pokud existuje a je na ni odkazováno. Překladače jej tedy mohou umístit kamkoli chtějí, nakonec ho najdou. Nedíval jsem se na váš první komentář, jinak bych neodpověděl, hezká práce!
Jeden odpovědět:
yaspr
2014-04-26 03:53:18 UTC
view on stackexchange narkive permalink

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 hlavní (nebo argumenty příkazového řádku) kód> hlavní funkce. Další technikou by bylo spustit program pod debuggerem (například GDB ) a jít krok za krokem.

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í.



Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...