1.4.8的壳,有6个模拟DLL,通过程序入口代码可以判断为VC的入口格式,也就是有可能是VC或者易语言的程序。
我打算使用网上搜集到的脱壳脚本进行脱壳,但这些脚本都需要填写IAT的开始&结束处地址。我想请问的则是如何找到这个地址。网上方法有两种,以下分别是他们的方法描述,以及我使用这些方法时遇到的问题。红字部分为问题。
方法一、“自己计算IAT的Start和End,计算方法,相信有过脱壳经验的都明白,到OEP后(ZP的到OEP,ESP定律即可),随便找个CALL,不断进几次就会发现了。”,转自ximo的脱壳脚本说明。
方法二、“通过查找FF25 很容易确定IAT的位置”,转自hyperchem的脱壳笔记。
=====================================================
方法一遇到的问题
我的经历:
首先,直接靠ESP定律,无法到达OEP处,最终会停止在注册码输入框处。
使用了以下方法,最终找到OEP,参照的是破吧《脱壳第三十六课》的视频:
a.跟到PUSHAD处,HR ESP,F9,程序弹出注册码输入框。
b.F12,停止程序,进度调用堆栈列表,点击USER32.DialogBoxIndirectParamAorW,右键显示函数过程,对代码77D56D7D 下硬件访问断点。
c.重启程序,F9一次到之前的HR ESP处,再F9一次到达USER32.DialogBoxIndirectParamAorW的函数过程出。修改,EAX=232C,
77D56D7D > 8BFF MOV EDI,EDI
77D56D7F 55 PUSH EBP
77D56D80 8BEC MOV EBP,ESP
77D56D82 6A 02 PUSH 2
77D56D84 FF75 18 PUSH DWORD PTR SS:[EBP+18]
77D56D87 FF75 14 PUSH DWORD PTR SS:[EBP+14]
77D56D8A FF75 10 PUSH DWORD PTR SS:[EBP+10]
77D56D8D FF75 0C PUSH DWORD PTR SS:[EBP+C]
77D56D90 FF75 08 PUSH DWORD PTR SS:[EBP+8]
77D56D93 E8 38DCFCFF CALL USER32.DialogBoxIndirectParamAorW
77D56D98 5D POP EBP
77D56D99 C2 1400 RETN 14
d.对77D56D99行右键,此处为新EIP。
e.F9运行程序,成功断在HR ESP处。
以上方法并没有使用网上找到的LPK.DLL,同样可以绕过注册码输入框到OEP处,所以并没有导致之前的死机,也成功进入到了OEP处。
这时如果按F9运行程序,程序会因为异常导致结束,也不知道是什么问题。。
想用脚本脱壳的话必须改IATS IATE,但到了这一步,怎么获取IAT,完全不懂了~~~
=====================================================
方法二遇到的问题
一进入程序时,搜索FF25,无结果,搜索FF15,有一个结果。
而通过方法一的方法到达OEP时,搜索FF25,可以搜索到很多处地方~~搜索FF15也是。
不知道需要的是到达OEP前还是后的搜索结果,搜索到了又怎样可以找到IAT的起始与结束地址呢?
=====================================================
以下是再之前的经历,不太重要吧。。
=====================================================
=====================================================
以下问题是旧的~~可以不看~
=====================================================
我遇到的程序是1.4.8的壳。
开始程序后,F9弹出注册码输入框,搜索,可以找到FF15
00527CDB FF15 48735200 CALL DWORD PTR DS:[527348]
DS:[00527348]=00B610A7
然后怎么找IATS和IATE啊??不懂哦~~~可以详细说说吗~
另外,网上有个lpk.dll文件,放到程序目录下,运行程序,就没有弹出注册码输入框了,不过程序自动关闭了。
如果我在有LPK.DLL的情况下,使用OD调试这个程序,不管是用StrongOD.dll还是PhantOm.dll。。OD都会过一会就死机。。死了无数次了。。。
另外,如果不适用LPK.DLL,ESP定律是无法到达OEP处的~而用LPK.DLL,就要冒十次运行九次死机的风险。。~~~~(>_<)~~~~
我只想知道如何获得IATS和IATE~请指教~谢谢~
---------------------------------------
补充说明:
厄,你的脚本,我没有填写如iats和iate的情况下进行了测试,如果没有LPK.DLL的情况下使用,脚本运行到程序运行,即弹出注册码输入框时就停止住了。
如果有LPK.DLL,则可以完成执行完,不过要求事后修复OEP。
想了一想,在网上看了这么多ZPROTECT的脱壳教材,获取OEP的方法一般有两种,一种就是通过OEP,另一种则是通过FF15或者FF25,但FF15与FF25必须程序运行下来时才会有跳转数值,而我用LPK.DLL时,一运行程序就结束了,而不用LPK.DLL,程序运行就会运行到注册码输入框那里。而这时FF15跳转到的地方就是上面的代码段:
00527CDB FF15 48735200 CALL DWORD PTR DS:[527348]
DS:[00527348]=00B610A7
通过这个代码段,如何获取IATS IATE?获取到又是否是正确的了?
=====================================================
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)