UPX编译及so加固
UPX编译及so加固
来源 https://www.cnblogs.com/Reverser/p/5778042.html
参考 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 <jni.h>
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
UPX编译及so加固的更多相关文章
- android安全检测工具,梆梆安全 - 防止反编译|APP安全加固|应用加固|盗版监测
android安全检测工具,梆梆安全 - 防止反编译|APP安全加固|应用加固|盗版监测https://dev.bangcle.com/ 业内专业的应用加固服务供应商 帮助数十万APP抵御破解风险,早 ...
- app反编译遇到360加固,傻瓜式脱壳
转载https://blog.kieng.cn/2051.html 第一步 电脑安装安卓模拟器,我使用的是雷电模拟器(推荐). 第二步 打开模拟器,准备安装软件: 1.需要脱壳的软件 2.XP 框架. ...
- ubuntu14.04 x86编译upx 3.92 及so加固
的参考文章: http://www.cnblogs.com/fishou/p/4202061.html 1.download upx和所依赖的组件 upx3.:https://www.pysol.or ...
- Android SO(动态链接库)UPX加固指南
前言 随着移动互联网的爆发性增长,人们对移动应用的需求变得越来越复杂,企业在带给用户众多便利和享受的同时,却容易忽视应用自身的安全性问题,一旦遭受攻击,就会给企业和用户的经济或声誉带来影响.本文主要是 ...
- 加固apk的开发者最常面对的十种问题
欢迎访问网易云社区,了解更多网易技术产品运营经验. 因为工信部对移动App应用安全过检要求日益增多,不加固大都达不到工信部的要求,同时开发者加固App大都是为了防止以下10个检测项出现问题,影响App ...
- 一文读懂加固apk的开发者是怎么想的
有人说加固会明显拖慢启动速度,同时造成运行卡顿,严重降低用户体验,而且加固是完全可以脱壳的,只需要pc配合进行断点调试就能抓到解密后的dex文件,加固并没有所说的那么安全. 但是为什么还有一大批开发者 ...
- 6.android加密解析
编码.数字摘要.加密.解密 UrlEncoder /Urldecoder String str = "http://www.baidu.com?serach = 哈哈"; Stri ...
- App上架应用市场,如何攻破安全过检难题
App的安全过检与众所熟知的安全检测是两个完全不同的概念.首先App行业本身对App安全过检有一定的要求与规范,其次2017年6月1日正式实施的<中国网络安全法>中就曾要求App在渠道上线 ...
- Android加密解析
编码.数字摘要.加密.解密 UrlEncoder /Urldecoder String str = "http://www.baidu.com?serach = 哈哈"; Stri ...
随机推荐
- vue中书写JSX一些坑-特殊属性名
举例说明, T1和T2引用Sub时, key2会出现在props以及data.attrs中, 而key则在data中 const Sub = ({data, props}) => { conso ...
- MySQL 5.7新增加的json数据类型
MySQL 5.7中有json存储类型了以前我们只能通过php来进行序列化了不过现在就不需要了我们可以直接使用MySQL 5.7的json数据类型来存储json格式数据了,具体来看介绍. 在MyS ...
- js中的splice方法和slice方法简单总结
slice:是截取用的 splice:是做删除 插入 替换用的 slice(start,end): 参数: start:开始位置的索引 end:结束位置的索引(但不包含该索引位置的元素) 例如: va ...
- [转]SQL 读取表结构
1.Sql SELECT column_name as FName,data_type as FType,CHARACTER_MAXIMUM_LENGTH as FLen from informati ...
- 使用idea进行activiti工作流开发入门学习
1.安装插件 在idea里面,activiti的插件叫actiBPM,在插件库里面把它安装好,重启idea就行了. 2.新建一个maven项目,并更改pom.xml.pom中依赖如下: <?xm ...
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_05-vuejs研究-vuejs基础-v-text指令
把js移到body 的下面 网速改慢一点 通过模拟网速慢的情况.刷新页面的时候会有闪烁的效果 速度快的情况下也会闪烁 ,只不过是不明显. 2.解决插值表达式闪烁问题,使用v-text v-text可以 ...
- python3 super().__init__() 和 __init__() 的区别
1.单继承 super().__int__()和 Base.__init__(self)是一样的, super()避免了基类的显式调用. class Base(object): def __init_ ...
- postman使用当前时间戳
//设置当前时间戳postman.setGlobalVariable(“time”,Math.round(new Date().getTime()));time = postman.getGlobal ...
- .Netcore 2.0 Ocelot Api网关教程(8)- 缓存
Ocelot中使用 CacheManager 来支持缓存,官方文档中强烈建议使用该包作为缓存工具.以下介绍通过使用CacheManager来实现Ocelot缓存. 1.通过Nuget添加 Ocelot ...
- selenium3 web自动化测试框架 五: 数据驱动简介及基础使用
1.数据驱动概述 相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离,这样的测试脚本设计模式称为数据驱动.简单的理解为数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变.通过使 ...