最近在爆肝加密与解密第三版,想争取在第四版出来之前过一遍,其中多次安利了LordPE这个工具,最后我终于忍不住去看雪下了一个。
emmm,看起来似乎一直有点问题。
一运行,emmmmm。
看在是各种安利的份上,我决定调一下看是什么错误,所以挂上OD
我觉得各位应该一眼就看出来问题了吧。
当前ESP指的前一个值是000032AC,正好EIP也是000032AC所以触发了异常,明显是缓冲区溢出把返回地址覆蓋了。
那么修复的思路就很简单了,定位一下发生溢出的函数然后改一下栈帧就OK了。
先看看堆栈还剩下什么吧
跟踪了一圈,基本找不到什么比较有用的信息(还没有深入研究Windows内部消息机制,看不出来什么XD)
不过通过SendMessageA还是可以猜测到或许是某个回调函数出了问题?
这里如果你看到堆栈函数调用有更好的思路,还请评论指出。
调用堆栈没找到比较有用的信息,考虑直接跟踪
比较奇怪的是从异常处直接回退一步就到了这里,再回退几步也是几个retn来回转。
再回退几步就直接到这里了,并没有定位到想要的函数。
不过我先去查了下这个函数的定义。
DialogBoxParam
DialogBoxParam function
DialogProc
DialogProc callback function
可以看到实际上DialogProc维护了一个消息循环,所以我决定从这里找找突破口。
有关这里的异常跟踪情况(实际上有时候退回的情况还不一样),如果你知道原因的话,还请在评论指出!
首先在DialogProc处打上断点,多次Ctrl+F11跟踪,直到触发异常。
往前退一步,bingo!
可以看到这里调用了一个EnumProcesses,依旧是去查一查
EnumProcesses
EnumProcesses function
里面有一段话
看到这里,再看到那个0x400,我觉得心里基本就有数了,应该就是这里写溢出然后覆蓋了返回地址。
再往上看,栈帧只分配了0x31C,但是在调用EnumProcesses的时候却传了一个0x400,有明显的溢出隐患(实际上就是这样)。
其实到这里已经基本明白了,不过刚才可以看到是procs模块的,再往前一步可以看到IAT也就定位到了函数名字。
在正式修改前先试试
直接把堆栈扩大0x400即可。
看来就是这里的问题了,可以开IDA修改了。
但是在我用IDA反汇编后出现了一个有趣的现象,在IDA中这个传入的参数大小为0xF0而不是实际动态调试的0x400。
下了一个硬件断点,最后发现是在LordPeFi这个模块了进行了“修复”。
然后去翻了下说明,原来是前人修复的,为什么明明没有平衡堆栈却能在早期的系统上好好运行呢。。。
昨天我以为已经搞定了就去睡了。
当时我是这么修复的,也没想太多。
结果打开后成了这个样子,数据全是空的。
吓得我赶紧挂回了OD重新试了下,没问题啊,这时候联系到之前LordPeFi对这段代码进行了一些修改,莫非是我直接改DLL导致原来的“修复”失效了?
用OD追踪了下修改,可以看到前面有多句cmp指令判断procs.dll中关键位置数据是否修改。
那么果然是因为我对dll直接的修改导致原来的FIX失效,那就好说了。
于是用IDA打开LordPeFix.dll,只用修改
add eax,21ch
<< · Back Index ·>>