UPX so加密


如何進行編譯UPX

請參考http://www.cnblogs.com/oloroso/p/6377807.html

 

 

 

Android so加密遇到的問題,參考自http://www.th7.cn/Program/Android/201606/885235.shtml

1、40k以下so不能加殼


kiiim@ubuntu:~/src$ upx.out a.out
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2011
UPX 3.08 Markus Oberhumer, Laszlo Molnar & John Reiser Dec 12th 2011
File sizeRatioFormatName
-------------------- ------ ----------- -----------
upx.out: a.out: NotCompressibleException
Packed 1 file: 0 ok, 1 error.
解決,添加下面代碼


int const dummy_to_make_this_compressible[10000] = {1,2,3};
2、無INIT節區的so不能加殼


kiiim@ubuntu:~/src$ readelf -d a.out
Dynamic section at offset 0xe28 contains 24 entries:
Tag TypeName/Value
0x0000000000000001 (NEEDED)Shared library: [libc.so.6]
0x000000000000000c (INIT) 0x400460
0x000000000000000d (FINI) 0x400694
0x0000000000000019 (INIT_ARRAY)0x600e10kiiim@ubuntu:~/src$ upx_diy.out libcmxsecd.so
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2016
UPX 1.02 Markus Oberhumer, Laszlo Molnar & John Reiser Mar 30th 2016
File sizeRatioFormatName
-------------------- ------ ----------- -----------
upx_diy.out: libcmxsecd.so: UnknownExecutableFormatException
Packed 0 files.
以上,沒有(INIT)的so不能進行加殼,解決辦法:


在native代碼中聲明_init()函數,用於在編譯時生成_init段,例如:

C++:extern "C" {void _init(void){}}

注意:C和C++代碼定義或聲明的方式是有所區別的,在C++中必須使用extern “C”關鍵 字進行修飾,被extern "C"修飾的變量和函數是按照C語言方式編譯和連接的


編譯時在Android.mk添加編譯選項,


LOCAL_CFLAGS += -Wl,-init=my_init

 

 

 

3.由於UPX無法對小於40kB 的so進行加殼,在native代碼中定義全局變量用於增加生成的二進制的體積,例如:

C:int const dummy_to_make_this_compressible[100000] = {1,2,3};

C++:extern "C" int const dummy_to_make_this_compressible[100000] = {1,2,3};

注意:如果編譯出來的庫本身足夠大,則此步驟可省略。


3、用於Android so加固?


經過UPX加殼后的so,通過IDA不能靜態分析,有比較好的保護能力。但弱點也很明顯,通過 upx -d參數就可以完美扒掉。

 

4、在native代碼中使用宏定義混淆函數名,用於增加靜態反匯編分析難度,例如:

#define startSimpleWifi sSW

#define sendData sD

……

 


除了通過編譯源碼,隱藏UPX版本、標志等信息外,還有另外的方法達成UPX防脫效果,項目保密咯;)

 

對於防止被直接./upx.out -d 直接脫殼,吾愛上有一篇可以進行參考http://www.52pojie.cn/thread-326995-1-1.html

關於想要修改upx源碼的,可以參考下面的這篇文章。

https://my.oschina.net/ichunqiu/blog/844660

這個是我編譯后的,如果你嫌編譯比較麻煩,就我這個吧,3.9.3版本,Linux端 X86 64測了,可以用,其他指令集和操作系統沒試。

 http://pan.baidu.com/s/1hrTUJ8w


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM