UPX so加密

时间:2024-03-03 13:33:52

如何进行编译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