Ubuntu下编译upx

/ 0评 / 0

编译此版本主要是为了在Android so上使用,所以需要同步的是devel版本,此版本改善了对Android 7.0的兼容性(防止一部分字段被优化掉)

前提:系统已经安装make,可以尝试make --version,如果没有还需要先安装下make

同步upx:git clone -b devel https://github.com/upx/upx 

cd upx

cd src

rmdir lzma-sdk

git clone https://github.com/upx/upx-lzma-sdk.git lzma-sdk

下载ucl:http://www.oberhumer.com/opensource/ucl/download/ucl-1.03.tar.gz

下载zlib http://pkgs.fedoraproject.org/repo/pkgs/zlib/zlib-1.2.11.tar.xz/sha512/b7f50ada138c7f93eb7eb1631efccd1d9f03a5e77b6c13c8b757017b2d462e19d2d3e01c50fad60a4ae1bc86d431f6f94c72c11ff410c25121e571953017cb67/zlib-1.2.11.tar.xz

解压zlib进入目录执行sudo make && make install,顺便安装下sudo apt-get install zlib1g-dev,防止编译时提示找不到zlib.h

解压ucl进入目录执行./configure

最终回到upx目录,执行 

make all UPX_UCLDIR=/home/qtfreet00/ucl-1.03 UPX_LZMADIR=./src/lzma-sdk

UPX_UCDIR需要修改为自己对应的目录

一切没问题的话会在src目录下生成一个upx.out文件

使用

./upx.out --android-shlib -o libqtfreet00upx.so libqtfreet00.so

一些注意:

需要设置一些字段,不然upx会提示不支持的格式

1、在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};

         注意:如果编译出来的库本身足够大,则此步骤可省略。

2、在native代码中声明_init()函数,用于在编译时生成_init段,例如:

         C:void _init(void){}

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

         注意:C和C++代码定义或声明的方式是有所区别的,在C++中必须使用extern “C”关键          字进行修饰,被extern "C"修饰的变量和函数是按照C语言方式编译和连接的

3、在native代码中使用宏定义混淆函数名,用于增加静态反汇编分析难度,例如:

         #define startSimpleWifi sSW

         #define sendData sD

同时可以自己修改upx的注释信息,代码位于src/packer.cpp #1059 

搜索 #define UPX_MAGIC_LE32 把关键字符替换掉
搜索 "UPX" 可把对应的section标志改掉

发表评论

电子邮件地址不会被公开。 必填项已用*标注