ubuntu14.04 x86编译upx 3.92 及so加固
的参考文章:
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加固的更多相关文章
- Ubuntu14.04 Chromium 编译
1.下载depot_tools: 首先安装 git-core: sudo apt-get install git-core 执行命令: git clone https://chromium.googl ...
- 【转】Linux(ubuntu14.04)上编译Android4.4源码的环境搭建及编译全过程
原文网址:http://jileniao.net/linux-android-building.html sublime text让我伤心.本来很信任sublime text的自动保存功能,之前使用一 ...
- ubuntu14.04下编译安装ambari-2.4.2.0
ubuntu14.04下编译安装ambari-2.4.2.0 编译前的准备工作 准备工作有: 系统参数 系统依赖(编译环境) 离线安装包 java环境 maven环境 Nodejs环境 git环境 a ...
- 在ubuntu14.04上编译android4.2.2系统
原创作品,转载请注明出处,严禁非法转载 copyright:weishusheng 2015.8.1 时下android系统非常流行,下面就来说一下,下载编译一个andro ...
- 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 ...
- GDAL2.1.1库在Ubuntu14.04下编译时遇到的问题处理方法
不用作任何调整,直接在Linux下编译GDAL2.1.1源码的步骤是: $ ./configure $ make $ make install 非常简单,这样也能正常生成gdal动态库.静态库,如果想 ...
- [Ubuntu] Ubuntu14.04 64bit 编译安装nginx1.7+php5.4+mysql5.6
我的操作系统是Ubuntu14.04,其它linux系统的操作流程类似. 主要安装的软件是nginx1.7+php5.4+mysql5.6 1. 创建必要目录 sudo mkdir ~/setup s ...
- Ubuntu14.04 64bit 编译安装nginx1.7+php5.4+mysql5.6
我的操作系统是Ubuntu14.04,其它linux系统的操作流程类似. 主要安装的软件是nginx1.7+php5.4+mysql5.6 1. 创建必要目录 sudo mkdir ~/setup s ...
- Ubuntu14.04 静态编译安装Qt4.8.6
./configure -static -nomake demos -nomake examples -nomake tools -no-exceptions -prefix /usr/local/Q ...
随机推荐
- ArcGIS Python 坐标系信息
############################################################# import arcpy import os from arcpy impo ...
- docker部署多个mysql容器,并使用java连接
测试springboot多个数据源配置时,需要安装多个mysql容器,由于资源限制,当前只有一台虚拟机,如果在一台机器上安装多个mysql实例,是可以的,但步骤比较繁琐,使用docker来安装MySQ ...
- ThinkPHP数据查询与添加语句
在ThinkPHP框架中实现数据的查询操作 function ShowAll() { //Model:数据库中每张表对应一个模型 //类名是表名,类里面的成员变量是列名 //把一张表对应一个类,其中一 ...
- HTTP中GET请求与POST请求的区别
GET和POST是HTTP请求的两种基本方法.最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数.但这只是表象,或者说只是现象,并不是核心.本文将细细谈谈对它们的 ...
- WebView加载html实现网页上传本地文件(图片,拍照,语音等)
前言: 这里有两个方案,第一个使用Andorid客户端和JavaScript互相调用方法来实现,这种方法极力不推荐,它会增加服务端和客户端的开发成本. 第二种就是继承WebViewChromeClie ...
- SQL-W3School-基础:SQL 语法
ylbtech-SQL-W3School-基础:SQL 语法 1.返回顶部 1. 数据库表 一个数据库通常包含一个或多个表.每个表由一个名字标识(例如“客户”或者“订单”).表包含带有数据的记录(行) ...
- Python的并行求和例子
先上一个例子,这段代码是为了评估一个预测模型写的,详细评价说明在 https://www.kaggle.com/c/how-much-did-it-rain/details/evaluation, 它 ...
- delphi 需要应用一个单元是,需要在工程里面先添加单元
delphi 需要应用一个单元是,需要在工程里面先添加单元
- Swagger 介绍
简介Swagger 是最流行的 API 开发工具,它遵循 OpenAPI Specification(OpenAPI 规范,也简称 OAS).Swagger 可以贯穿于整个 API 生态,如 API ...
- python之selenium元素定位方法
前提: 大家好,今天我们来学习一下selenium,今天主要讲解selenium定位元素的方法,希望对大家有所帮助! 内容: 一,selenium定位元素 selenium提供了8种方法: 1.id ...