的参考文章:

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

1.download upx和所依赖的组件

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

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

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

ZLIB1..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

 总用量 

 drwxr-xr-x   root root    8月  : ./

 drwxr-xr-x   root root    8月  : ../

 drwxr-xr-x   root root    8月  : lzma443/

 drwxrwxrwx  jack users   7月    ucl-1.03/

 drwxr-xr-x   root root    8月  : upx-hg-22a77e02b61f/

 drwxr-xr-x          7月    zlib-1.2./

3.设置环境变量

export UPX_ZLIBDIR=/home/local/upxmake/zlib-1.2./

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)  - 

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

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

Commands:

-    compress faster                  -    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[] = {,,};

         C++:extern "C" int const dummy_to_make_this_compressible[] = {,,};

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函数

 

反编译看下:

ubuntu14.04 x86编译upx 3.92 及so加固的更多相关文章

  1. Ubuntu14.04 Chromium 编译

    1.下载depot_tools: 首先安装 git-core: sudo apt-get install git-core 执行命令: git clone https://chromium.googl ...

  2. 【转】Linux(ubuntu14.04)上编译Android4.4源码的环境搭建及编译全过程

    原文网址:http://jileniao.net/linux-android-building.html sublime text让我伤心.本来很信任sublime text的自动保存功能,之前使用一 ...

  3. ubuntu14.04下编译安装ambari-2.4.2.0

    ubuntu14.04下编译安装ambari-2.4.2.0 编译前的准备工作 准备工作有: 系统参数 系统依赖(编译环境) 离线安装包 java环境 maven环境 Nodejs环境 git环境 a ...

  4. 在ubuntu14.04上编译android4.2.2系统

    原创作品,转载请注明出处,严禁非法转载             copyright:weishusheng   2015.8.1 时下android系统非常流行,下面就来说一下,下载编译一个andro ...

  5. Ubuntu14.04 64bit编译u-boot-2016.07提示 Your dtc is too old, please upgrade to dtc 1.4 or newer

    Author:AP0904225版权声明:本文为博主原创文章,转载请标明出处. Ubuntu14.04 64bit环境下编译u-boot-2016.07提示如下错误: CHK include/conf ...

  6. GDAL2.1.1库在Ubuntu14.04下编译时遇到的问题处理方法

    不用作任何调整,直接在Linux下编译GDAL2.1.1源码的步骤是: $ ./configure $ make $ make install 非常简单,这样也能正常生成gdal动态库.静态库,如果想 ...

  7. [Ubuntu] Ubuntu14.04 64bit 编译安装nginx1.7+php5.4+mysql5.6

    我的操作系统是Ubuntu14.04,其它linux系统的操作流程类似. 主要安装的软件是nginx1.7+php5.4+mysql5.6 1. 创建必要目录 sudo mkdir ~/setup s ...

  8. Ubuntu14.04 64bit 编译安装nginx1.7+php5.4+mysql5.6

    我的操作系统是Ubuntu14.04,其它linux系统的操作流程类似. 主要安装的软件是nginx1.7+php5.4+mysql5.6 1. 创建必要目录 sudo mkdir ~/setup s ...

  9. Ubuntu14.04 静态编译安装Qt4.8.6

    ./configure -static -nomake demos -nomake examples -nomake tools -no-exceptions -prefix /usr/local/Q ...

随机推荐

  1. CentOS 上 Jenkins 的安装

    Jenkins 的前身是 Hudson. Jenkins 是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件. Jenkins 支持各种运行方式,可通过系统包.Dock ...

  2. Trees Made to Order——Catalan数和递归

    Trees Made to Order Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7155   Accepted: 40 ...

  3. python下载服务器

    大佬们,你们还在为传输文件时利用U盘插拔而苦恼吗,还在为设置文件共享而苦恼吗?别苦恼了,教你一秒实现文件的传输. 首先我们都要有python环境,这个肯定有. 下面就是一秒,在你要传的文件的目录下输入 ...

  4. 让matlab在出错时停在debug内,并留下相关变量

    很多时候,我们写的matlab代码会在执行的过程中发生错误.这种情况下,matlab会 直接跳出执行,顺带告诉你是在代码的那一行跳出了,但是却无法留下出错时的每个变量 的具体值,给debug带来很大的 ...

  5. php----处理从mysql查询返回的数据

    使用php的mysql,向mysql查询,返回的是一个资源,有4个函数可以进行处理. 1.mysql_fetch_row() 2.mysql_fetch_assoc() 3.mysql_fetch_a ...

  6. 小D课堂 - 新版本微服务springcloud+Docker教程_4-03 高级篇幅之Ribbon负载均衡源码分析实战

    笔记 3.高级篇幅之Ribbon负载均衡源码分析实战     简介: 讲解ribbon服务间调用负载均衡源码分析         1.完善下单接口         2.分析@LoadBalanced ...

  7. 通过Xshell 执行压缩.zip文件出现unzip: command not found错误的解决办法

    利用unzip命令解压缩的时候,出现 -bash: unzip: command not found 的错误. unzip——命令没有找到,其原因肯定是没有安装unzip. 利用一句命令就可以解决了. ...

  8. ElasticSearch——自定义模板

    output中配置 elasticsearch{ action => "index" hosts => ["xxx"] index => &q ...

  9. 树莓派-CentOS-Minimal arm版的设置

    将镜像用 balenaEtcher 写入到树莓派SD卡并启动后,需要对其进行一些设置才能正常使用. 1. 用户名 root 密码 centos 2. 扩展 rootfs 到最大可用空间:cat REA ...

  10. C/C++中结构体总结笔记

    结构体的定义方式 在C/C++中结构体的定义方式有很多种,做个简单的总结. 定义方式1: struct st{ int a; }; 定义方式2: struct _st{ int a; } st; 定义 ...