windows 10 下手动脱壳 – UPX

前言

由于网上各种文章,各种工具总感觉特别旧(基本都是面向xp系统),而且尝试后发现也没法在windows 10下正常使用,故写此文章

准备工作

首先是准备工作,下载一些可能用到的工具,以下仅供参考

注:该软件在x64dbg内自带有(如果无法使用请检查安装的插件是否有问题,参考后面反调试的文章)

该软件需要自行编译,吾爱破解论坛有编译好的https://down.52pojie.cn/Tools/PEtools/Scylla.v.0.9.8.rar笔者自行编译的版本稍后上传(需要安装VS 2015 运行库32&64)

  • 反汇编软件(可选):ida pro

由于可选加上版权原因就不贴链接了

脱壳过程

大致过程可以分为3个步骤:1,寻找OEP   2,内存dump   3,修复导入表

寻找OEP

upx的壳其实用ida分析的会发现特别有特征,顺着走到最尾就是跳转到oep的地方了



图1



图2
甚至我们还可以知道OEP是0x401210
不过不清楚不重要,在开头有一个pusha,在最后一个popa后方不远的一个大jmp肯定是跳往oep的。
再不清楚也不重要,我们还有别的方法:

ESP定律

注:esp定理利用壳在执行完成后需要保证堆栈的栈顶不变(保证程序运行时候的参数正确),那么在无论多少次入栈/出栈后,只要ESP值为原来的值,那么我们就离到达OEP的位置很近了。

运行调试器(x32dbg.exe),然后打开upx.exe

首先确认选项里面的入口断点要打开了哦

然后单步执行一步

单步执行  F7

此时ESP将为红色

选中红色字的esp,然后选“在内存中转到”或“在栈中转到”

然后添加“读取”或“写入”的断点,长度随意,因为出栈肯定有读又有写,而且改变不只四个字节。

然后运行下去

运行 F9

然后我们刚刚设置的硬件断点会跳出(如果硬件断点设置的是读取的话,eip应该会指向popad后面一句)

注意下面的显示的断点类型

 

我们来看看这段汇编代码

值得关注的是两个j指令,显然第二个才是跳到oep的位置

005D2531 | FF D5 | call ebp |
005D2533 | 58 | pop eax | eax:&L”msvcrt.dll”
005D2534 | 61 | popad |
005D2535 | 8D 44 24 80 | lea eax,dword ptr ss:[esp-80] |
005D2539 | 6A 00 | push 0 |<-位置1
005D253B | 39 C4 | cmp esp,eax |
005D253D | 75 FA | jne upx.5D2539 |<-跳到位置1
005D253F | 83 EC 80 | sub esp,FFFFFF80 |
005D2542 | E9 C9 EC E2 FF | jmp upx.401210 |<-跳到很远很远

我们继续单步执行(你也可以设置个断点)到jmp upx.401210

然后再单步执行一次,此时的EIP应该是0x401210,这就是oep

(实际上对于upx这个壳这几步可以省去,只需要到硬件断点跳出的时候就可以dump了)

内存dump

不知道为什么x64dbg自带的scylla是无法dump的(或许这个版本的bug吧)

运行32位的Scylla

然后选程序,然后点dump,保存到你喜欢的位置,这样就dump完成了

修复导入表

继续使用之前打开的scylla

oep填入之前找到的oep 401210

然后IAT Autosearch    Get Imports

对于upx还是比较简单的,自动搜索导入表是没有出现那种红叉的

然后Fix Dump 选之前dump下来的upx_dump.exe

自动会生成upx_dump_SCY.exe

至此,脱壳已完成,你可以关闭调试器了。

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据