-
-
[求助]用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时栈中出现的控件标题字符串,我逆了几个小时也没有找到根源,这个字符串是在哪个位置写入的?
大概就是这两个问题困扰着我,求大佬们解惑
赞赏
- [原创]通过NtContinue修改3环程序执行流程 34173
- [求助]关于intel cpu的模式切换 2846
- [求助]用OD脚本调试易语言程序的消息 4068
- [已删除] 3112
- [原创]修改扫雷程序实现悬停显雷 6792