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加固的更多相关文章

  1. android安全检测工具,梆梆安全 - 防止反编译|APP安全加固|应用加固|盗版监测

    android安全检测工具,梆梆安全 - 防止反编译|APP安全加固|应用加固|盗版监测https://dev.bangcle.com/ 业内专业的应用加固服务供应商 帮助数十万APP抵御破解风险,早 ...

  2. app反编译遇到360加固,傻瓜式脱壳

    转载https://blog.kieng.cn/2051.html 第一步 电脑安装安卓模拟器,我使用的是雷电模拟器(推荐). 第二步 打开模拟器,准备安装软件: 1.需要脱壳的软件 2.XP 框架. ...

  3. ubuntu14.04 x86编译upx 3.92 及so加固

    的参考文章: http://www.cnblogs.com/fishou/p/4202061.html 1.download upx和所依赖的组件 upx3.:https://www.pysol.or ...

  4. Android SO(动态链接库)UPX加固指南

    前言 随着移动互联网的爆发性增长,人们对移动应用的需求变得越来越复杂,企业在带给用户众多便利和享受的同时,却容易忽视应用自身的安全性问题,一旦遭受攻击,就会给企业和用户的经济或声誉带来影响.本文主要是 ...

  5. 加固apk的开发者最常面对的十种问题

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 因为工信部对移动App应用安全过检要求日益增多,不加固大都达不到工信部的要求,同时开发者加固App大都是为了防止以下10个检测项出现问题,影响App ...

  6. 一文读懂加固apk的开发者是怎么想的

    有人说加固会明显拖慢启动速度,同时造成运行卡顿,严重降低用户体验,而且加固是完全可以脱壳的,只需要pc配合进行断点调试就能抓到解密后的dex文件,加固并没有所说的那么安全. 但是为什么还有一大批开发者 ...

  7. 6.android加密解析

    编码.数字摘要.加密.解密 UrlEncoder /Urldecoder String str = "http://www.baidu.com?serach = 哈哈"; Stri ...

  8. App上架应用市场,如何攻破安全过检难题

    App的安全过检与众所熟知的安全检测是两个完全不同的概念.首先App行业本身对App安全过检有一定的要求与规范,其次2017年6月1日正式实施的<中国网络安全法>中就曾要求App在渠道上线 ...

  9. Android加密解析

    编码.数字摘要.加密.解密 UrlEncoder /Urldecoder String str = "http://www.baidu.com?serach = 哈哈"; Stri ...

随机推荐

  1. vue中书写JSX一些坑-特殊属性名

    举例说明, T1和T2引用Sub时, key2会出现在props以及data.attrs中, 而key则在data中 const Sub = ({data, props}) => { conso ...

  2. MySQL 5.7新增加的json数据类型

    MySQL 5.7中有json存储类型了以前我们只能通过php来进行序列化了不过现在就不需要了我们可以直接使用MySQL 5.7的json数据类型来存储json格式数据了,具体来看介绍.   在MyS ...

  3. js中的splice方法和slice方法简单总结

    slice:是截取用的 splice:是做删除 插入 替换用的 slice(start,end): 参数: start:开始位置的索引 end:结束位置的索引(但不包含该索引位置的元素) 例如: va ...

  4. [转]SQL 读取表结构

    1.Sql SELECT column_name as FName,data_type as FType,CHARACTER_MAXIMUM_LENGTH as FLen from informati ...

  5. 使用idea进行activiti工作流开发入门学习

    1.安装插件 在idea里面,activiti的插件叫actiBPM,在插件库里面把它安装好,重启idea就行了. 2.新建一个maven项目,并更改pom.xml.pom中依赖如下: <?xm ...

  6. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_05-vuejs研究-vuejs基础-v-text指令

    把js移到body 的下面 网速改慢一点 通过模拟网速慢的情况.刷新页面的时候会有闪烁的效果 速度快的情况下也会闪烁 ,只不过是不明显. 2.解决插值表达式闪烁问题,使用v-text v-text可以 ...

  7. python3 super().__init__() 和 __init__() 的区别

    1.单继承 super().__int__()和 Base.__init__(self)是一样的, super()避免了基类的显式调用. class Base(object): def __init_ ...

  8. postman使用当前时间戳

    //设置当前时间戳postman.setGlobalVariable(“time”,Math.round(new Date().getTime()));time = postman.getGlobal ...

  9. .Netcore 2.0 Ocelot Api网关教程(8)- 缓存

    Ocelot中使用 CacheManager 来支持缓存,官方文档中强烈建议使用该包作为缓存工具.以下介绍通过使用CacheManager来实现Ocelot缓存. 1.通过Nuget添加 Ocelot ...

  10. selenium3 web自动化测试框架 五: 数据驱动简介及基础使用

    1.数据驱动概述 相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离,这样的测试脚本设计模式称为数据驱动.简单的理解为数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变.通过使 ...