android+so+upx,UPX编译及so加固

本文详细介绍了如何下载、解压并编译UPX,以及如何使用UPX对Android的SO库进行加固。在加固过程中,强调了需要在native代码中添加全局变量以满足UPX的压缩要求,并且指出被加壳的SO需要包含_init段。此外,还提供了处理编译错误的建议,如安装缺失的依赖库。
摘要由CSDN通过智能技术生成

UPX编译及so加固

参考 http://www.cnblogs.com/fishou/p/4202061.html

1.download upx和所依赖的组件

upx3.92:https://www.pysol.org:4443/hg/upx.hg/archive/tip.tar.gz

LZMA4.43:http://nchc.dl.sourceforge.net/project/sevenzip/LZMA%20SDK/4.43/lzma443.tar.bz2

UCL1.03:http://www.oberhumer.com/opensource/ucl/download/ucl-1.03.tar.gz

ZLIB1.2.3http://pkgs.fedoraproject.org/repo/pkgs/zlib/zlib-1.2.3.tar.gz/debc62758716a169df9f62e6ab2bc634/zlib-1.2.3.tar.gz

2.解压到/home/local/upx下

root@study:/home/local/upxmake# ll

总用量 24

drwxr-xr-x 6 root root 4096 8月 16 10:08 ./

drwxr-xr-x 3 root root 4096 8月 16 09:55 ../

drwxr-xr-x 5 root root 4096 8月 16 09:55 lzma443/

drwxrwxrwx 10 jack users 4096 7月 20 2004 ucl-1.03/

drwxr-xr-x 4 root root 4096 8月 16 10:28 upx-hg-22a77e02b61f/

drwxr-xr-x 11 501 80 4096 7月 18 2005 zlib-1.2.3/

3.设置环境变量

export UPX_ZLIBDIR=/home/local/upxmake/zlib-1.2.3/

export UPX_DIR=/home/local/upxmake/upx-hg-22a77e02b61f/

export UPX_LZMA_VERSION=0x443

export UPX_UCLDIR=/home/local/upxmake/ucl-1.03/

export UPX_LZMADIR=/home/local/upxmake/lzma443/

注:这种方式设置的环境变量只在当前shell环境下有效 当我们在另外一个shell环境下输入:env |grep UPX是没有显示结果的

4.进入到/home/local/upxmake/upx-hg-22a77e02b61f/的根目录下make all进行编译

如果在编译的过程中提示:找不到zlib.h 这个错误是因为zlib包没有安装,安装后问题即可解决。但有一点请注意安装命令是:

sudo apt-get install zlib1g-dev,而非sudo apt-get install zlib

如果提示 usr/bin/ld: cannot find -lucl 参考:http://www.jb51.net/LINUXjishu/211594.html

usr/bin/ld: cannot find -lxxx错误的通用解决方法

执行:apt-get install libucl-dev即可

5.编译成功的话 在$(UPX_ROOT)|src下生成一个upx.out的文件

root@study:/home/local/upxmake# ./upx-hg-22a77e02b61f/src/upx.out

Ultimate Packer for eXecutables

Copyright (C) 1996 - 2015

UPX 3.92 Markus Oberhumer, Laszlo Molnar & John Reiser Mar 30th 2015

Usage: upx.out [-123456789dlthVL] [-qvfk] [-o file] file..

Commands:

-1 compress faster -9 compress better

-d decompress -l list compressed file

.....................

UPX comes with ABSOLUTELY NO WARRANTY; for details visit http://upx.sf.net

使用UPX进行android so加固

在native代码中:

1.在native代码中定义全局变量用于增加生成的二进制的体积,否则会提示错误:

编译UPX出现“NotCompressibleException”错误。

分析:UPX对被加壳的二进制文件有最小限制,太小的文件将无法被加壳。

解决方案:在native代码中定义足够大的数据变量,使得编译出来的二进制文件容易达          到UPX的要求

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.要加壳的so需要有_init段

编译UPX出现“UnknownExecutableFormatException”错误。

分析:被加壳的二进制文件必须存在init段,否则UPX将无法脱壳还原原始代码。

解决方案:在native代码中定义_init()方法,需要注意C和C++的区别

//在native代码添加_init段

void _init(void)

{

}

注:_init并非区段,只是一个导出函数.NDK会生成对应的区段并融合在某个大区段中,所以你从区段表看不到它

我们以一个简单的例子libhello.so为例子hello.c代码如下

#include

void _init(void)

{

}

/** jni规定 本地方法名 Java_调用本地方法类所在的包名_类名_方法名

* JNIEnv * env java环境,提供函数供调用

* jobject obj 调用本地方法的对象

*

* typedef const struct JNINativeInterface* JNIEnv;

* JNIEnv <=> struct JNINativeInterface*

* env : JNIEnv * <=> struct JNINativeInterface**

* (*env)->NewStringUTF();

*/

jstring Java_com_itheima_helloworld_MainActivity_helloFromC(JNIEnv *env, jobject obj){

// 把C字符串转化为java中字符串

return (*env)->NewStringUTF(env,"hello world");

}

用readelf工具查看libhello.so是否有_init段

正如前面所说的 section table没有_init段

readelf -S libhello.so

使用readelf -d libhello.so 可以看到_INIT

将libhello.so放在  ($UPX_ROOT)|src目录下进行加壳 执行

使用upx加壳的so的section table被抹除了

我们用IDA对比下libhello.so加密的效果

未加密效果:代码是赤裸裸的啊

upx加密后:

1.section table信息抹除了

2.看下jni函数

反编译看下:

============== End

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值