首页
社区
课程
招聘
[求助]用OD脚本调试易语言程序的消息
发表于: 2020-8-25 22:30 4067

[求助]用OD脚本调试易语言程序的消息

2020-8-25 22:30
4067

今天捣鼓易语言的消息处理特征码“FF55FC5F5E”,弄明白了一些东西,但是对一个结构体还是有很大疑问。

按照惯例,写一个易语言程序拖入OD,接着ctrl+B  FF55FC5F5E  F2,断在了此处,依照栈图往回找。可以看到下图

这是第三个RETURN,我最近正好认真研究了OD的EWND插件,8B44240C 8B4C2408 8B542404 50 51 52 B9????????这一串是EWND里面使用过的特征码

研究过EWND的,应该可以反应得过来 *(DWORD**)(0x4AE708+0x114)是窗口ID表,*(DWORD*)(0x4AE708+0x11C)是窗口数量*8(这个原理我不清楚...)


再外一层,即第四个RETURN

据我的猜测,这个应该是官方文档上面的易语言通知函数,我为了去找结构体翻了易语言的支持库开发手册,结果除了LIB_INFO和HUNIT之外什么都没有,倒是NotifySys和这个长得挺像。。。。而且易语言消息处理的外层应该有消息通知函数,这个函数的身份基本可以确定


好奇心驱使着我试着在NotifySys下断点,程序会一直断下,观察每次的esp,返回地址都不一样,看来NotifySys这个函数调用非常频繁且交叉引用非常多


之后我选择了在按钮事件的外层第五个RETURN下断点,然后就有了有趣的发现

在这里下断点,在按钮按下或者时钟触发的时候才会调用,调用不频繁,便于我分析,刚开始F7了3步,我就注意到了eax和ecx的变化,eax无疑是变成了主窗口的ID(易语言里的push窗体那个ID),而ecx,E-Analysis分析易语言的人应该都用过,这个16开头的是按钮控件的ID,用E-Analysis测试一下,确实如此。

翻一下栈数据,甚至能看到控件标题 


那么,完全可以低仿一个E-Debug&Analysis中的消息截获功能了...随手用OD写了个脚本(放附件了)


那么,第五个RETURN处的函数,怎么从ecx中取出了窗口ID和控件ID呢?ecx按照编译规则,在这里应该是要认为做_thiscall的this指针,然后我又往外看了一层。

第一眼就看到了大量的8B4D08 FF5514,这个转化为c++语句大概是

pTarget->pfn();(pTarget:ebp+8,参数一        pfn:ebp+14,参数五)

长得和mfc的AfxDispatchCmdMsg几乎一模一样(作用上),暂且把作为this的ecx判断为CCmdTarget*类型(或者从这个类派生)的,大小为0x20。

值为1的是第二和第六个成员,分别为m_dwRef和m_bResultExpected,这一点与CCmdTarget的构造函数吻合。0x480E44这个应该是AfxGetModuleState的返回值

第一个成员是关键,这个应该是虚函数表,第一个函数应该是从CObject继承来的GetRuntimeClass(),这个函数返回了这个类的标识类静态成员。

虚函数表:

GetRuntimeClass:

静态成员CRuntimeClass:(第一个成员为LPCSTR类型,指向这个类的名称字符串)

名称字符串:

由此可见,运行到此处,ecx保存的是一个CButton类型的结构。

CButton继承于CWnd,没有成员,大小应该与CWnd一样是0x74,而程序中读取e窗口和控件id的偏移却是ecx+0x78和ecx+0x7C,这显然超过了CButton的大小界限,那么易语言应该是又封装了一个类作为按钮控件的类型。


关于这个结构具体定义和名称?对于运行到AfxDispatchCmdMsgpfn时栈中出现的控件标题字符串,我逆了几个小时也没有找到根源,这个字符串是在哪个位置写入的?

大概就是这两个问题困扰着我,求大佬们解惑


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//