upx工具编译使用指导

网络上有现成的upx工具,在github上面:https://github.com/upx/upx/releases 根据自己的操作系统和cpu选择相应的工具。下载下来就可以使用。


下面是说我在编译时遇到的一些问题:

下载的包是upx-3.94.tar.gz

tar -zxvf upx-3.94.tar.gz 解压到当前文件夹

进入解压目录执行命令:

make all

出现问题1:

ubuntu@ubuntu-ThinkPad-X220:~/upx/process/upx-3.94$ make all
make -C src all
make[1]: Entering directory `/home/ubuntu/upx/process/upx-3.94/src'
../src/stub/src/c/Makevars.lzma:12: *** ERROR: missing directory src/lzma-sdk/; visit https://github.com/upx/upx-lzma-sdk .  Stop.
make[1]: Leaving directory `/home/ubuntu/upx/process/upx-3.94/src'
make: *** [all] Error 2

显示没有src的lzma-sdk目录,错误中有提示信息要求访问网站并下载。

下载之后的upx-lzma-sdk-master.zip,并解压出现目录upx-lzma-sdk-master。将目录改名成lzma-sdk,并放到upz-3.94/src目录下,再执行命令make all。

出现问题2:

In file included from c_file.cpp:29:0:
conf.h:140:6: error: #error "please upgrade your UCL installation"
 #    error "please upgrade your UCL installation"
      ^

#error是c++预处理指令,当编译器处理到该指令时将停止编译并输出错误信息。

查看上下文:

#  if !defined(UCL_VERSION) || (UCL_VERSION < 0x010300L)
#    error "please upgrade your UCL installation"
#  endif
发现是没有设置UCL_VERSION。需要下载ucl安装包,到链接 http://www.oberhumer.com/opensource/ucl/download/ucl-1.03.tar.gz,下载ucl解压,并编译

./configure
make
然后命令行中输入

export UPX_UCLDIR=/home/ubuntu/upx/process/ucl-1.03
再次执行命令make all

出现问题3:

ERROR: binary file detected ./src/c_file.o: ELF>�@@	GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4.symtab.strtab.shstrtab.text.data.bss.comment.note.GNU-stack@!@@,0@,5llE�� �
                                           ��c_file.cppmake[1]: *** [upx.out] Error 1
make[1]: *** Deleting file `upx.out'
make[1]: Leaving directory `/home/ubuntu/upx/process/upx-3.94/src'
make: *** [all] Error 2

出现这种问题,就修改home/ubuntu/upx/process/upx-3.94/src/stub/scripts/check_whitespace.sh,将下面的语句全部注释掉

#print("$ARGV\n");
    if (m,[\x00\x01\x02\xfe\xff],) { print "ERROR: binary file detected $ARGV: $_"; exit(1); }
    if (m,[\r\x1a],) { print "ERROR: DOS EOL detected $ARGV: $_"; exit(1); }
    if (m,([ \t]+)$,) {
        # allow exactly two trailing spaces for GitHub flavoured Markdown in .md files
        if ($1 ne "  " || $ARGV !~ m,\.md$,) {
            print "ERROR: trailing whitespace detected $ARGV: $_"; exit(1);
        }
    }
    if (m,\t,) {
       if ($ARGV =~ m,(^|/)(gnu|m)?make(file|vars),i) { }
       elsif ($ARGV =~ m,/tmp/.*\.(disasm|dump)$,) { }
       elsif ($ARGV =~ m,/src/stub/src/arch/.*/lzma\w+\.S$,) { }
       else { print "ERROR: hard TAB detected $ARGV: $_"; exit(1); }
    }

然后再执行编译make all。

就出现了可执行文件

ubuntu@ubuntu-ThinkPad-X220:~/upx/process/upx-3.94/src$ ls -l upx.out 
-rwxrwxr-x 1 ubuntu ubuntu 2082496 10月 21 10:17 upx.out


用./upx.out -h 查看用法,其中最简单用法:
./upx.out -o liboutput.so libinput.so


参考事项:

1.交叉编译:

如果是交叉编译,需要修改upx下面src/Makefile文件将

# toolchain
CXX    ?= g++

中的CXX改成你要用的编译工具链


2.无so源码的upx加壳:

so加壳涉及到很多修改so库源码的地方,见参考链接。如果手头上没有so库源码。那么针对jni生成的so文件,可以修改upx中的p_lx_elf.cpp文件,将

 if (/*jni_onload_sym ||*/ elf_find_dynamic(Elf32_Dyn::DT_INIT)) {
改成

 if (jni_onload_sym || elf_find_dynamic(Elf32_Dyn::DT_INIT)) {

修改后的也是可以对jni的so库文件加壳。但具体使用中有没有问题,可不敢保证。
对于非jni的so库文件,如果没有源码,基本上加不了壳的。


参考链接:

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值