UPX壳的修改

咳咳,别被吓着,改UPX的源代码是万万不可能的,我要是能改那个我现在就不坐在这了。

UPX壳的运行原理

众所周知,UPX是一个开源的功能强大的压缩壳。在读完别人读UPX源码之后写的博客之后,总结如下:
首先,UPX会将我们的程序分成几个部分,假设7个部分好了:

11 22 33 44 55 66 77

然后UPX会根据这个程序的平台、位数、使用的函数、大小之类的综合考虑一番,决定用LZMA、UCL、NRV中的哪个压缩算法。压缩后再将自己对应的解压算法添加在整个程序的前面,变成这个样子:

0 1 2 3 4 5 6 7

其中0的部分就是解压算法和一些修正算法。

修改UPX的信息

P.S.以下修改过程中前后多改点少改点都是可以成功的。

修改标识符

首先找一个加壳的普通程序(可能会爆毒)
拖到ExeinfoPE里可以看见:

也就是说它即识别出来了UPX也看出来了是3.96的版本。将exe拖到010editor可以看见:

这里我们发现了4个UPX标识,其中前两个代表了UPX的标识符一类的东西,将其改成你喜欢的东西:

再次拖进ExeinfoPE,可以看见:

发现它仍然认识UPX,只不过因为我们修改了它的标识符,显示出来的也是我们修改之后的样子。这里它虽然提醒Don’t try upx -d,实际上还是可以这么干的。

修改版本信息

上文提到的4个UPX标识中的剩下两个记录了UPX的版本信息,如果将他们修改,upx -d 将会因为不知道版本而失效:


这时如果是64位程序会提示Don’t try而32位程序会提示try。然而实际上都不会成功的。

修改入口点

将程序拖到x64dbg可以找到入口点:

此时可能会出现一堆push或者一个pushad,这几个都是可以改的,看心情改就好:

再拖进ExeinfoPE看一看:

可以发现ExeinfoPE现在彻底懵逼了,但仍然能分析出是类似UPX的东西,同时upx -d失效,只能手动脱壳。
P.S.别问我为什么改完入口点程序还能正常运行,我也不知道。。。

结束语

嗯…奇怪的知识又增加了!