调试软件:x64dbg
下载地址:https://github.com/x64dbg/x64dbg/releases
64位软件:write
64位加壳软件:upx3.96
下载地址:https://github.com/upx/upx/releases
PE工具:studyPE++64
x64dbg手脱64位程序upx3.96壳后修复
现在64的程序越来越多了,正好前几天看了一个坛友发帖求脱upx的壳(64位程序),估计是变种壳,直接用upx -d失败,只能手脱了。
关于IAT修复,强烈建议大家看下锻钢著的“加密解密第4版”,介绍很详细,一本好书,如果此推荐触犯论坛规则,版主可直接删除,也可通知我删除。
依然是入门小白贴,大神请跳过吧。
1、x64dbg熟悉
2、寻找OEP
3、脱壳插件Scylla使用
4、修复异常
一、x64dbg打开后如下,简单介绍,全凭OD一一对应相似功能,如有不对,尽情谅解。
x64dbg.png (418.54 KB, 下载次数: 0)
下载附件
2021-10-27 22:02 上传
如果没有入口点没有停在软件模块,选项-事件后去除系统断点前的选中状态。
x64dbg01.png (72.48 KB, 下载次数: 0)
下载附件
2021-10-27 22:11 上传
系统API断点设置方法,类同OD的Ctrl+N。
x64dbg02.png (109.49 KB, 下载次数: 0)
下载附件
2021-10-27 22:19 上传
二、打开加壳后的64位write.upx3.96(write为Win7系统标配,可下载加壳软件后自制),我们通过ESP定律找到OEP。
x64dbg03.png (213.81 KB, 下载次数: 0)
下载附件
2021-10-28 00:00 上传
直接F9运行,暂停在这里。
x64dbg04.png (54.02 KB, 下载次数: 0)
下载附件
2021-10-28 00:00 上传
F8单步执行到jmp处,再按一次f8就到了软件OEP处。
x64dbg05.png (82.08 KB, 下载次数: 0)
下载附件
2021-10-28 00:06 上传
三、选择插件-scylla,打开dump窗口,此处已经自动获取了OEP,直接点击dump就好。
x64dbg06.png (112.81 KB, 下载次数: 0)
下载附件
2021-10-28 00:46 上传
保存文件后再单击Autosearch,修复IAT。
x64dbg07.png (106.04 KB, 下载次数: 0)
下载附件
2021-10-28 00:46 上传
x64dbg08.png (126.73 KB, 下载次数: 0)
下载附件
2021-10-28 00:46 上传
一般dump数据和修复IAT后正常应该可以打开了,可是爆了异常。
x64dbg09.png (72.82 KB, 下载次数: 0)
下载附件
2021-10-28 00:55 上传
四、异常修复,我们用x64dbg加载write.upx3.96_dump_SCY。
x64dbg10.png (189.86 KB, 下载次数: 0)
下载附件
2021-10-28 01:23 上传
原因知道了,是因为软件的基址不同,软件找不到正常地址而报错,可是64位软件的基址是动态(ASLR机制),每次加载都不同,可是原程序(未加壳的原程序)可以完成自动修改,我看看源程序的基址和我们脱壳软件有啥不同。
x64dbg11.png (252.39 KB, 下载次数: 0)
下载附件
2021-10-28 01:39 上传
x64dbg12.png (92.3 KB, 下载次数: 0)
下载附件
2021-10-28 01:39 上传
解决补丁思路
1、禁用ASLR机制。
2、加入代码实现自动修改基址。
因为我比较懒,打开studyPE++禁用了ASLR机制,这样每次都用默认基址就能正常打开。
x64dbg15.png (109.5 KB, 下载次数: 0)
下载附件
2021-10-28 10:15 上传
总结,软件脱壳后区段看着和原文件有差异,不够完美,也变大了,需要优化。
ASLR机制禁用只是权宜之计,后续需要编写脚本修复,这个留给大神研究。
补充下禁用的ASLR的方法
注册表禁用适与XP:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
"MoveImages"=dword:00000000
XP后用:Enhanced Mitigation Experience Toolkit
单个软件禁用,脱壳常用软件PETools操作
PETools-Tool-PE Edior-Optional Header,修改dll flags为8100.