Jak odstranit řetězce ze kompilovaný binární (.so)

hlasů
14

Jak mohu odstranit řetězce z / poplést kompilované binární? Cílem je zabránit tomu, aby lidé přečíst názvy funkcí / metod uvnitř.

Jedná se o dynamické knihovny (.so) sestaveny z C ++ kódu pro Android s nástroji NDK (zahrnuje GCC)

I kompilovat -O3a již používá arm-eabi-strip -g mylib.soodstranit symboly ladění, ale když jsem si strings mylib.sojména všech funkcí / metody jsou stále čitelné.

Položena 20/05/2010 v 10:57
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
23

Tyto řetězce jsou v dynamické tabulce symbolů , který je použit, je-li knihovna zavedeno za běhu. readelf -p .dynstr mylib.sozobrazí tyto položky.

strip -godstraní symboly ladění, ale nelze odstranit položky z dynamické tabulky symbolů, protože by mohly být zapotřebí při běhu. Váš problém je, že máte položky v dynamické tabulce symbolů pro funkce, které jsou nikdy nebude volat z mimo knihovny. Pokud jej chcete, překladač / linker nemá žádný způsob, jak zjistit, které funkce tvoří část vnějšího API (a tedy i potřebné položky v dynamické tabulce symbolů) a které funkce jsou soukromé knihovny (a proto nepotřebují položky v dynamická tabulka symbolů), tak to prostě vytváří dynamické položky symbol tabulky pro všechny non-statické funkce.

Existují dva hlavní způsoby, jak můžete informovat kompilátoru, které funkce jsou soukromé.

  1. Označte soukromých večírků static. Je zřejmé, že toto funguje pouze pro funkce pouze potřebné v rámci jedné kompilace jednotky, i když u některých knihoven tato technika může být dostačující.

  2. Použijte gcc „viditelnost“ atribut označit funkce jako viditelné nebo skryté. Máte dvě možnosti: buď označit všechny soukromé funkce jako skryté, nebo změnit výchozí viditelnost na skryté pomocí -fvisibility=hiddenmožnost kompilátoru a označit všechny veřejné funkce jako viditelné. Ta je pravděpodobně nejlepší volbou pro vás, protože to znamená, že nemusíte mít strach o náhodně přidání funkce a zapomněla označit jako skrytý.

Máte-li funkce:

int foo(int a, int b);

pak syntaxe pro označování to skryté je:

int foo(int a, int b) __attribute__((visibility("hidden")));

a syntax pro značení viditelné, je:

int foo(int a, int b) __attribute__((visibility("default")));

Pro další informace viz tento dokument , který je vynikajícím zdrojem informací o tomto tématu.

Odpovězeno 02/06/2010 v 17:37
zdroj uživatelem

hlasů
5

Existuje několik komerčních obfuscators která splnění tohoto úkolu. V podstatě, oni re-psát všechny symboly na cestách. Něco takového:

void foo()

stává

void EEhj_y33() // usually much, much longer and clobbered

Názvy proměnných jsou rovněž stejné zacházení, jako jsou členy struktur / svazů (v závislosti na jaké úrovni mlžení nastavení).

Většina z nich pracuje naskenováním kódu základny, kterou se stanoví slovník poté nahrazením poškozenými zmatky názvy symbol ve výstupu, které pak mohou být shromažďovány jako obvykle.

Nedoporučuji jejich použití, ale jsou k dispozici. Jednoduše zamlžování smysluplné názvy symbolů je to nezastaví někoho, kdo je odhodlaný zjistit, jak vaše knihovna / program funguje. Kromě toho se nebude moci nic dělat někdo, kdo stopuje systémová volání. Opravdu, jaký to má smysl? Někteří argumentují, že to pomáhá udržet ‚náhodného pozorovatele‘ v šachu, tvrdím, že někdo běží ltrace stracea stringsje obvykle něco, ale příležitostná.

Pokud jste na mysli řetězcové literály , ne symboly ? Neexistuje nic, co můžete udělat o nich, pokud jste ukládání literály v šifrovaném formátu, který má kód dešifrovat před použitím. To není jen odpad, ale nebe volající odpad, který neposkytuje žádnou výhodu vůbec.

Odpovězeno 20/05/2010 v 15:32
zdroj uživatelem

hlasů
2

Za předpokladu, že jsou správně zadáním skryté viditelnost g ++ pro všechny zdrojové soubory (jak doporučily další plakáty), je tu šance, že byste mohl být spuštěn do tohoto GCC chyba: http://gcc.gnu.org/bugzilla/show_bug .cgi? id = 38643

Zkuste dumping symboly v binárního souboru, které se objevují ( readelf -Wa mylib.so | c++filt | less); pokud vidíte pouze VTable a VTT symbolů po demangling, pak gcc chyba může být váš problém.

Edit: můžete-li, zkuste GCC 4.4.0 nebo novější, protože se zdá, že existuje pevná.

Odpovězeno 11/07/2010 v 07:11
zdroj uživatelem

hlasů
-2

Jsou to nevyhnutelné. Tyto řetězce jsou prostředky, kterými odkazy nakladače sdílené knihovny za běhu.

Odpovězeno 20/05/2010 v 11:03
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more