吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4031|回复: 21
收起左侧

[原创] 找delphi程序事件处理过程的心酸往事

[复制链接]
女萝岩 发表于 2020-2-9 23:21
本帖最后由 女萝岩 于 2020-2-9 23:23 编辑

分析delphi程序的crackme有感


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

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

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


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

代码更简单
code.png

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

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

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

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

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

sigcode.png

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

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

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

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

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

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

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







免费评分

参与人数 2威望 +1 吾爱币 +21 热心值 +2 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
qaz003 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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中看到的按钮,控件还是可以用的
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,其它没测试过。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-28 06:17

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表