• ubuntu14.04 x86编译upx 3.92 及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下

     1 root@study:/home/local/upxmake# ll
     2 
     3 总用量 24
     4 
     5 drwxr-xr-x  6 root root  4096  8月 16 10:08 ./
     6 
     7 drwxr-xr-x  3 root root  4096  8月 16 09:55 ../
     8 
     9 drwxr-xr-x  5 root root  4096  8月 16 09:55 lzma443/
    10 
    11 drwxrwxrwx 10 jack users 4096  7月 20  2004 ucl-1.03/
    12 
    13 drwxr-xr-x  4 root root  4096  8月 16 10:28 upx-hg-22a77e02b61f/
    14 
    15 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函数

     

    反编译看下:

     

  • 相关阅读:
    第一次参赛经历:ecfinal总结
    滑雪(dp或记忆化搜索)
    dp入门题(数塔)
    SQL语句:子查询
    【原创】SQL语句原理解析
    gitignore规则探究
    路径分隔符:正斜线/、反斜线、双反斜线\的区别
    高并发系统设计方法
    js变量作用域,变量提升和函数传参
    数据库设计:三范式
  • 原文地址:https://www.cnblogs.com/Reverser/p/5778042.html
Copyright © 2020-2023  润新知