编译UPX源码
系统环境:
- Ubuntu 22.04
- Python 2
- Gcc 11, G++ 11, Make 4.3
获取UPX源码
1
2
3git clone --recursive https://github.com/upx/upx.git
# --recursive 用于将lzma-sdk子模块一并获取
cd upx
安装&配置必要库
1 | sudo apt install libucl-dev zlib1g-dev zlib1g zlib1g:i386 libmpfr6 |
下载UPX-STUBTOOLS
1 | mkdir -p ~/local/bin |
编译UPX源码
1 | make all # 编译 |
修改UPX Loader
UPX的Loader用于加载、解压, 在src/stub/src目录下可以看到这种名字为架构-系统.类型.S
的汇编代码文件, 比如i386-linux.elf-entry.S
和amd64-win64.pep.S
. 修改这些代码然后重新编译UPX(make all
)就可以了.
以amd64-win64.pep.S
为例(也就是Windows 64位PE):
我们在section PEMAIN01中加入以下代码:
1 | nop |
![custom loader](/2022/07/14/%E6%89%8B%E5%8A%A8%E7%BC%96%E8%AF%91UPX%E5%B9%B6%E4%BF%AE%E6%94%B9Loader/pic1.png)
保存修改后,重新编译UPX:
1 | make all |
然后对某个程序进行加壳(tests/test1.exe
是一个我自己写的Hello World测试程序, 且使用Windows 64位编译器中编译):
1 | # 查看tests/test1.exe文件类型 |
使用IDA打开UPX加壳后的test1-p1.exe
:
![IDA](/2022/07/14/%E6%89%8B%E5%8A%A8%E7%BC%96%E8%AF%91UPX%E5%B9%B6%E4%BF%AE%E6%94%B9Loader/pic2.png)
可以发现UPX Loader已经成功修改.