手动编译UPX并修改Loader

编译UPX源码

系统环境:

  • Ubuntu 22.04
  • Python 2
  • Gcc 11, G++ 11, Make 4.3

    获取UPX源码

    1
    2
    3
    git clone --recursive https://github.com/upx/upx.git 
    # --recursive 用于将lzma-sdk子模块一并获取
    cd upx

安装&配置必要库

1
2
sudo apt install libucl-dev zlib1g-dev zlib1g zlib1g:i386 libmpfr6
sudo ln -s /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-linux-gnu/libmpfr.so.4

下载UPX-STUBTOOLS

1
2
3
4
5
6
mkdir -p ~/local/bin
cd ~/local/bin
wget https://github.com/upx/upx-stubtools/releases/download/v20210104/bin-upx-20210104.tar.xz
tar xvJf bin-upx-20210104.tar.xz
mv bin-upx-20210104 bin-upx
cd - # 回到UPX源码根目录

编译UPX源码

1
2
make all # 编译
./src/upx.out # 运行UPX

修改UPX Loader

UPX的Loader用于加载、解压, 在src/stub/src目录下可以看到这种名字为架构-系统.类型.S的汇编代码文件, 比如i386-linux.elf-entry.Samd64-win64.pep.S. 修改这些代码然后重新编译UPX(make all)就可以了.

amd64-win64.pep.S为例(也就是Windows 64位PE):

我们在section PEMAIN01中加入以下代码:

1
2
3
4
5
nop
push rax
mov rax, 0x1234
pop rax
nop

保存修改后,重新编译UPX:

1
make all

然后对某个程序进行加壳(tests/test1.exe是一个我自己写的Hello World测试程序, 且使用Windows 64位编译器中编译):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看tests/test1.exe文件类型
zsy@ubuntu:/mnt/hgfs/E/CODE/git/upx$ file tests/test1.exe
tests/test1.exe: PE32+ executable (console) x86-64, for MS Windows
# 使用UPX加壳
zsy@ubuntu:/mnt/hgfs/E/CODE/git/upx$ ./src/upx.out tests/test1.exe -o tests/test1-p1.exe
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2021
UPX git-d61edc+ Markus Oberhumer, Laszlo Molnar & John Reiser Jan 1st 2021

File size Ratio Format Name
-------------------- ------ ----------- -----------
297288 -> 135496 45.58% win64/pe test1-p1.exe

Packed 1 file.

WARNING: this is an unstable beta version - use for testing only! Really.

使用IDA打开UPX加壳后的test1-p1.exe:

可以发现UPX Loader已经成功修改.

参考