借助x64dbg及Scylla的UPX手工脱壳

参考文章:https://bbs.kanxue.com/thread-268159.htm 很多地方都是复制粘贴的,学习学习大佬的文章。

寻找入口点

1、加载程序F9运行,会发现停在push处,push操作将所有寄存器的值压栈,这一步之后会加载UPX的解压代码用于将原始程序解压。
2、upx工作原理首先将程序压缩。所谓的压缩包括两方面,一方面在程序的开头或者其他合适的地方插入一段代码,另一方面是将程序的其他地方做压缩。压缩也可以叫做加密,因为压缩后的程序比较难看懂,主要是和原来的代码有很大的不同。最大的表现也就是他的主要作用就是程序本身变小了。变小之后的程序在传输方面有很大的优势。其次就是在程序执行时,实时的对程序解压缩。解压缩功能是在第一步时插入的代码完成的功能。联起来就是:upx可以完成代码的压缩和实时解压执行。且不会影响程序的执行效率。

graph LR;
1-->2-->3-->4-->5-->6;

1是upx插入的代码,2,3,4是压缩后的代码。5,6是随便的什么东西。程序从1开始执行。而1的功能是将2,3,4解压缩为7,8,9。7,8,9就是2,3,4在压缩之前的形式。

graph LR;
1-->7-->8-->9-->5-->6;

一篇学习upx工作原理的文章:https://blog.csdn.net/zacklin/article/details/7419001 目前先放一放,有时间再学
3、了解之后会知道(虽然我还不太了解),跟踪到这部分栈弹出的位置,就是解压缩完成的地方,即可得到原始的代码
(1)F8将寄存器全部压栈,之后在堆栈窗口,找到标黑的地方(栈顶)下硬件断点(访问,Byte)
img
img
注意一定要等push完再下断点(第一次我就搞错了)
img
(2)F9继续执行,断到了此处,此时已经发现pop,说明UPX的解压过程已经结束.
img
对于此处的代码,正在将缺失的栈空间补齐,循环若干次.运行到断点处,发现是一个big jmp,F7进去
img
(3)步进后,是下面类似界面,这就是入口点了.
img
img
用Scylla脱壳就行了,先IAT Autosearch 再Get Import,之后dump,如果dump后的文件可能IAT表有问题导致程序不能正常运行,fix dump试一试
(4)如果依旧不能正常运行只能手动修复IAT表.之后再研究

posted @ 2024-06-02 17:51  Un1corn  阅读(81)  评论(0编辑  收藏  举报