记修复“LordPE已停止工作”

0x0 前言

最近在爆肝加密与解密第三版,想争取在第四版出来之前过一遍,其中多次安利了LordPE这个工具,最后我终于忍不住去看雪下了一个。

emmm,看起来似乎一直有点问题。

一运行,emmmmm。

0x1 事故现场

看在是各种安利的份上,我决定调一下看是什么错误,所以挂上OD

我觉得各位应该一眼就看出来问题了吧。

当前ESP指的前一个值是000032AC,正好EIP也是000032AC所以触发了异常,明显是缓冲区溢出把返回地址覆蓋了。

那么修复的思路就很简单了,定位一下发生溢出的函数然后改一下栈帧就OK了。

0x2 调用追踪

先看看堆栈还剩下什么吧

跟踪了一圈,基本找不到什么比较有用的信息(还没有深入研究Windows内部消息机制,看不出来什么XD)

不过通过SendMessageA还是可以猜测到或许是某个回调函数出了问题?

这里如果你看到堆栈函数调用有更好的思路,还请评论指出。

0x3 从头跟踪

调用堆栈没找到比较有用的信息,考虑直接跟踪

比较奇怪的是从异常处直接回退一步就到了这里,再回退几步也是几个retn来回转。

再回退几步就直接到这里了,并没有定位到想要的函数。

不过我先去查了下这个函数的定义。

DialogBoxParam

DialogBoxParam function

DialogProc

DialogProc callback function

可以看到实际上DialogProc维护了一个消息循环,所以我决定从这里找找突破口。

有关这里的异常跟踪情况(实际上有时候退回的情况还不一样),如果你知道原因的话,还请在评论指出!

0x4 通过DialogProc跟踪

首先在DialogProc处打上断点,多次Ctrl+F11跟踪,直到触发异常。

往前退一步,bingo!

可以看到这里调用了一个EnumProcesses,依旧是去查一查

EnumProcesses

EnumProcesses function

里面有一段话

看到这里,再看到那个0x400,我觉得心里基本就有数了,应该就是这里写溢出然后覆蓋了返回地址。

再往上看,栈帧只分配了0x31C,但是在调用EnumProcesses的时候却传了一个0x400,有明显的溢出隐患(实际上就是这样)。

0x5 定位

其实到这里已经基本明白了,不过刚才可以看到是procs模块的,再往前一步可以看到IAT也就定位到了函数名字。

0x6 尝试修改

在正式修改前先试试

直接把堆栈扩大0x400即可。

看来就是这里的问题了,可以开IDA修改了。

0x7 一点小插曲

但是在我用IDA反汇编后出现了一个有趣的现象,在IDA中这个传入的参数大小为0xF0而不是实际动态调试的0x400。

下了一个硬件断点,最后发现是在LordPeFi这个模块了进行了“修复”。

然后去翻了下说明,原来是前人修复的,为什么明明没有平衡堆栈却能在早期的系统上好好运行呢。。。

0x8 正式修复(10.8更新)

昨天我以为已经搞定了就去睡了。

当时我是这么修复的,也没想太多。

结果打开后成了这个样子,数据全是空的。

吓得我赶紧挂回了OD重新试了下,没问题啊,这时候联系到之前LordPeFi对这段代码进行了一些修改,莫非是我直接改DLL导致原来的“修复”失效了?

用OD追踪了下修改,可以看到前面有多句cmp指令判断procs.dll中关键位置数据是否修改。

那么果然是因为我对dll直接的修改导致原来的FIX失效,那就好说了。

于是用IDA打开LordPeFix.dll,只用修改

add eax,21ch

<< · Back Index ·>>

发表回复

相关推荐

“黎民百姓”從何而來?竟然與“涿鹿之戰”密切相關!

嗨,你好呀~我是賽賽 黃帝與炎帝在具茨山握手言和,標志著炎、黃兩部落力量的融合與強大。現在,他們有足夠的信心去與九黎部...

· 21秒前

花记 | 铃兰,贵族的专属

我们再来回顾一下上个月哈里王子的婚礼,梅根手上的捧花还记得吗?

· 21秒前

一文读懂显存、显存带宽、算力、外部通信等概念

最近,AMD发布了最新的AI生产力工具,打压下英伟达的嚣张气焰。

· 45秒前

硫酸依替米星註射液市場研究報告

依替米星為氨基糖苷類抗生素,本品對靜止期細菌的殺滅作用強,為靜止期抗菌藥。其主要不良反應是耳毒性、腎毒性、神經肌肉阻...

· 46秒前

養貓好還是養狗好?看完給你答案!!

隨著生活水平的提高,人們對精神層面的追求也越來越高,很多朋友都開始養起瞭寵物,可是自己挑選寵物的時候卻又犯瞭難,在...

· 4分钟前