女萝岩 发表于 2020-2-9 23:21

找delphi程序事件处理过程的心酸往事

本帖最后由 女萝岩 于 2020-2-9 23:23 编辑

分析delphi程序的crackme有感


由于我没有完整的学习过一门面向对象的语言,所以分析起来delphi程序特别吃力,走了很多弯路,特此记录,希望警醒自己的同时也能给别人提供一点帮助。

我对VC程序相对而言是比较熟悉的,所以我用调试VC程序的思路调试delphi程序。vc程序的winproc函数是一个回调函数,是由user32.dll中的call dword ptr调用的,于是我在这个地方下断点,看能不能返回到delphi程序的winproc,结果很无奈,断是能断下来,但断下的次数太多了,返回到delphi程序的领空之后是一个winproc的调用框架,好像是调用的各种虚函数,找到真正的事件处理过程很难。

换个思路,点击crackme的注册按钮会获取文本框的内容然后判断是否注册成功。如果能断在“获取文本”这个操作附近代码处,那么离事件处理过程就不远了。于是下段GetWidowText GetDlgItemText SendMessage的WM_GETTEXT条件断点,没有预想的效果。


再换个思路,我像无头苍蝇一样乱撞,根本原因是我对delphi程序不熟悉,没有正向,何来逆向,于是我下了一个delphi7精简版和一本delphi7的基础教程,写了一个测试程序,我倒是像亲自看看是怎么获取文本框的内容的。
功能很简单,就是点击getdata的时候吧label的内容设置到文本框中。


代码更简单


在红框处代码下一个断点,断下之后看一看汇编代码:


不太习惯delphi中看汇编代码,在OD中定位到004501DA


看着lea mov call这几条指令我就想着,能不能把它们当作一个通用的特征码来定位到事件处理过程呢?

lea,edx, dwor ptr
edx可能会变,ebp可能会变,可能会变的我们后面就用??来代替,一个?代表一个字节,特征码只能是lea,这里的lea的opcode是8D,所以这里的特征码就是8D ?? ??
mov eax, dword ptr
猜测这里的两个eax都不会变,看过好几处这种调用,都是用eax寻址的。所以这里的特征码是8B 83 ?? ?? ?? ??
call XXXXXXXX
call不会变,后面的XXXXXXXX可能会变,这里call的opcode是E8,所以这里的特征码是E8 ?? ?? ?? ??

三组特征码组合起来就是:



在OD中搜索,ctrl+L差不多三四次就定位到了crackme的事件处理函数。

由于最近学习了intel指令手册第二卷的内容,对CPU解码指令的过程有所熟悉,特征码还是可以改进得更好的。比如mov eax, dword ptr,这里的304是一个32位的304,在指令中存储的是0403 0000
所以后面的0000也可以当作特征码的一部分。

后来才有了这篇帖子 分析delphi程序的一些心得,可能是delphi版本的问题,有些同学说不太好用,我这边也安装不了高版本的delphi,不能测试。

其实这中间有一点小插曲,就是我用exescope查看过delphi程序的资源部分,在RC部分里面可以看到事件处理过程的名字,当时记录了一下没有特别深入追查,其实是我能力不够了,哈哈。再后来论坛上的同学说dede LDR都可以找事件处理过程,而且贴出很多LDR相关的贴图,我一看贴图中事件处理名字怎么和我用exescope在资源中看到的数据很相似呢?

然后我就用WINHEX打开delphi程序,搜索TForm1,果然看到了事件处理过程的名字,简单分析了一下就看到了事件处理过程的地址。


可以看到Button1Click事件处理地址就在0048C6D4,原来DEDE和LDR就是从exe的资源中读取的数据。

以后如果手头没有DEDE或者LDR的时候用WINHEX就好了。







bester 发表于 2020-2-10 08:57

dede对高版本的支持不是很好,idr用得少,体积大,但不失为一个强大的分析工具,而且D的程序我几乎不考虑从事件入手,当然如果必要,我一般用两个工具,一个是某初中生写的delphi事件查找工具,仿OD按钮事件查找脚本,另外一个是某组织的delphi事件到地址,好像爱盘有,另外我有两个问题,就是什么是虚函数?然后vc的winproc又是什么?期待一篇分析vc的操作手法

女萝岩 发表于 2020-2-10 14:50

bester 发表于 2020-2-10 08:57
dede对高版本的支持不是很好,idr用得少,体积大,但不失为一个强大的分析工具,而且D的程序我几乎不考虑从 ...

恩,可以可以,谢谢提供线索。winproc就是LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ,昨天写的时候忘了叫啥名字了,就随便写了一个。虚函数我也知道点皮毛,可能还不对,就不说了吧。

qaz003 发表于 2020-2-10 00:44

谢谢分享。。。一直没留意还有最后那张图这个特性

不苦小和尚 发表于 2020-2-10 07:43

没有这么简单吧,新版不能用吧?

冥界3大法王 发表于 2020-2-10 08:13

winhex中看到的按钮,控件还是可以用的{:301_997:}

woshicn 发表于 2020-2-10 10:21

学习了,感谢分享

Lixinist 发表于 2020-2-10 12:02

ce的dbvm定位杀一切

女萝岩 发表于 2020-2-10 14:41

不苦小和尚 发表于 2020-2-10 07:43
没有这么简单吧,新版不能用吧?

我测试了一个,就是【2020春节】解题领红包之二.exe,这个是新版delphi编写的,也有效的。00617c3c

女萝岩 发表于 2020-2-10 14:46

冥界3大法王 发表于 2020-2-10 08:13
winhex中看到的按钮,控件还是可以用的

恩,目前就针对crackme,一般就是一个EDIT和button,其它没测试过。
页: [1] 2 3
查看完整版本: 找delphi程序事件处理过程的心酸往事