UPX壳的修改
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.别问我为什么改完入口点程序还能正常运行,我也不知道。。。
结束语
嗯…奇怪的知识又增加了!