首页
论坛
课程
招聘
[原创]易语言消息机制分析(消息拦截原理)
2014-12-17 12:41 16268

[原创]易语言消息机制分析(消息拦截原理)

2014-12-17 12:41
16268
我自己做了个易语言的sig签名,方便分析的时候用.易语言例子是静态编译的.版本 5.11
易语言其实是基于mfc的,它依然需要mfc的消息派发机制,只不过,自己当了系统与
用户间的代理人.所有的消息都要经它转发而已.我在MFC的消息派发函数_AfxDispatchCmdMsg
下断点,总能断下所有事件,包括按钮事件.我按下按钮,断在如下:
0045C7E0 _ /$  55        push ebp      ; ewnd._AfxDispatchCmdMsg(CCmdTarget *,uint,int,void (CCmdTarget::*)(void),void *,uint,AFX_CMDHANDLERINFO *)(guessed Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7)
0045C7E1   |.  8BEC      mov ebp, esp
0045C7E3   |.  8B45 20   mov eax, dword ptr ss:[arg7]
0045C7E6   |.  53        push ebx
0045C7E7   |.  56        push esi
0045C7E8   |.  6A 01     push 1
在下面不远处,消息转发到了:

只是这有点麻烦了.我才不想一步一步绕到用户事件处理的地方.
因此,我们要找到易语言给用户派发消息的地方.
往下追踪:
00411688   |.  FFD0      call eax ; ewnd.ProcessNotifySys(int,ulong,ulong)

处理消息的其中一步,继续吧
004116B4   |.  E8 77C7FF call CKrnlApp::Notify(int,ulong,ulong)
再继续:
0040E36D   |> \8B4424 34 mov eax, dword ptr ss:[arg2]                  ; Case 7D8 of switch ewnd.40DE4F
0040E371   |.  8BCE      mov ecx, esi
0040E373   |.  50        push eax                                      ; /Arg1 => [Arg2]
0040E374   |.  E8 67A600 call CKrnlApp::ProcessEvent(EVENT_NOTIFY *)   ; \ewnd.CKrnlApp::ProcessEvent(EVENT_NOTIFY *) //处理派发消息
0040E379   |.  E9 580700 jmp 0040EAD6
0040E37E   |>  8B4C24 34 mov ecx, dword ptr ss:[arg2]                  ; Case 7EF of switch ewnd.40DE4F
0040E382   |.  51        push ecx                                      ; /Arg1 => [Arg2]
0040E383   |.  8BCE      mov ecx, esi                                  ; |
0040E385   |.  E8 06A700 call CKrnlApp::ProcessEvent(EVENT_NOTIFY2 *)  ; \ewnd.CKrnlApp::ProcessEvent(EVENT_NOTIFY2 *)
0040E38A   |.  E9 470700 jmp 0040EAD6
0040E38F   |>  8B86 4802 mov eax, dword ptr ds:[esi+248]               ; Case 7DB of switch ewnd.40DE4F
来到派发事件的地方了呢!跟进:
CPU Disasm
Address    Hex dump      Command                                       Comments
00418A06   |.  51        push ecx                                      ; |Arg1 = ASCII "p"I"
00418A07   |.  8B4D E8   mov ecx, dword ptr ss:[local.6]               ; |
00418A0A   |.  E8 419AFF call CKrnlApp::BeginProcessEvent(ulong,ulong,int,int) ;获取用户定义的消息
00418A0F   |.  8945 FC   mov dword ptr ss:[local.1], eax
00418A12   |.  837D FC 0 cmp dword ptr ss:[local.1], 0  ;判断这次的消息是不是用户的.
00418A16   |.  75 04     jne short 00418A1C
00418A18   |.  33C0      xor eax, eax
00418A1A   |.  EB 67     jmp short 00418A83
00418A1C   |>  56        push esi  ;是用户定义的消息,那就来到这里处理了.
00418A1D   |.  57        push edi
00418A1E   |.  8B55 08   mov edx, dword ptr ss:[arg1]
00418A21   |.  8B42 0C   mov eax, dword ptr ds:[edx+0C]
00418A24   |.  83E8 01   sub eax, 1
00418A27   |.  8945 EC   mov dword ptr ss:[local.5], eax
00418A2A   |.  EB 09     jmp short 00418A35
00418A2C   |>  8B4D EC   /mov ecx, dword ptr ss:[local.5]
00418A2F   |.  83E9 01   |sub ecx, 1
00418A32   |.  894D EC   |mov dword ptr ss:[local.5], ecx
00418A35   |>  837D EC 0 |cmp dword ptr ss:[local.5], 0
00418A39   |.  7C 12     |jl short 00418A4D
00418A3B   |.  8B55 EC   |mov edx, dword ptr ss:[local.5]
00418A3E   |.  8B45 08   |mov eax, dword ptr ss:[arg1]
00418A41   |.  8B4C90 10 |mov ecx, dword ptr ds:[edx*4+eax+10]
00418A45   |.  894D F0   |mov dword ptr ss:[local.4], ecx
00418A48   |.  FF75 F0   |push dword ptr ss:[local.4]
00418A4B   |.^ EB DF     \jmp short 00418A2C
00418A4D   |>  FF55 FC   call dword ptr ss:[local.1] //调用用户消息处理例程.这就是所谓的事件特征码.
00418A50   |.  5F        pop edi
00418A51   |.  5E        pop esi

00418A52   |.  895D F4   mov dword ptr ss:[local.3], ebx

看到我的注释了没?就是这样简单.我忘记是在哪儿看到的了,前辈们总结的易语言事件特征码:FF55FC5F5E.
看来原理很简单嘛.

现在总结一下:
易语言其实是基于mfc的,它注册了所有的事件,
由MFC事件派发函数_AfxDispatchCmdMsg把所有发生的事件派发给易语言,
此时易语言相当于用户.然后易语言调用CKrnlApp::Notify(int,ulong,ulong),派发事件,
调用CKrnlApp::ProcessEvent(EVENT_NOTIFY[2] *)进一步处理派发的事件.
然后CKrnlApp::BeginProcessEvent(ulong,ulong,int,int)获取用户事件,如果匹配了,
就调用用户事件处理例程.

完美断下按钮事件:

看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

收藏
点赞0
打赏
分享
最新回复 (18)
雪    币: 41
活跃值: 活跃值 (82)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wuyuhan 活跃值 2014-12-17 12:50
2
0
不错。静态编译版本还是带支持库的版本
雪    币: 1533
活跃值: 活跃值 (218)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
红绡枫叶 活跃值 6 2014-12-17 12:51
3
0
静态编译的,版本5.11.忘记说明了..
雪    币: 188
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
JackJoker 活跃值 2014-12-17 15:57
4
0
好帖,赞一个。
雪    币: 201
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
snakehack 活跃值 2014-12-17 15:59
5
0
赞个,顶
雪    币: 346
活跃值: 活跃值 (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
学雄 活跃值 1 2014-12-17 17:42
6
0
楼主好厉害
CKrnlApp::Notify(int,ulong,ulong)
CKrnlApp::ProcessEvent(EVENT_NOTIFY[2] *)
CKrnlApp::BeginProcessEvent(ulong,ulong,int,int)

上面的这些函数,易语言的静态库中不是已经处理了这些符号了吗?符号已经添加前缀,改得面目全非了,
你的od怎么会显示这些信息的?求教~
求配套工具啊~
雪    币: 346
活跃值: 活跃值 (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
学雄 活跃值 1 2014-12-17 17:43
7
0

难道是手动注释~
雪    币: 1533
活跃值: 活跃值 (218)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
红绡枫叶 活跃值 6 2014-12-17 18:02
8
0
[QUOTE=学雄;1338453]楼主好厉害
CKrnlApp::Notify(int,ulong,ulong)
CKrnlApp::ProcessEvent(EVENT_NOTIFY[2] *)
CKrnlApp::BeginProcessEvent(ulong,ulong,int,int)

上面的这些函数,易语言的静态库中不是...[/QUOTE]

用IDA的工具做了易语言的sig签名
雪    币: 238
活跃值: 活跃值 (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
anticode 活跃值 2015-1-10 23:26
9
0
学习了,谢谢
雪    币: 30
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
babyrjw 活跃值 2015-12-17 10:12
10
0
您好,请问能否分享下您制作的易语言的Sig,或者分享下您是如何制作sig的吗?
雪    币: 1533
活跃值: 活跃值 (218)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
红绡枫叶 活跃值 6 2015-12-17 10:43
11
0
用IDA的flair工具,具体自己搜搜?
雪    币: 30
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
babyrjw 活跃值 2015-12-17 11:50
12
0
用Flair工具制作Sig的话,需要生成的易语言可执行程序中 带有符号信息,比如CKrnlApp等等,我生成的易语言可执行程序都没有符号信息, 所以想请教下您那边易语言的符号信息是怎么出来的
雪    币: 1533
活跃值: 活跃值 (218)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
红绡枫叶 活跃值 6 2015-12-17 23:29
13
0
生成的程序中本来就没有符号信息(release),符号信息是从sig签名中模式匹配得到的.
我记得OD有加载sig签名的插件.
雪    币: 30
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
babyrjw 活跃值 2015-12-18 10:03
14
0
用Flair制作Sig一般流程是从 obj 或者 lib 或者 exe 生成 pat文件,然后 再从pat文件生成sig文件,这步是正确的吧?
我尝试了从  易语言开发环境目录\static_lib\krnln_static.lib, 易语言开发环境目录\lib\krnln.fnr 等几个文件生成出来的sig 都不包含 CKrnlApp这类似的符号,所以想请教下您是如何生成带有CkrnlApp符号的sig文件的,多谢
雪    币: 1161
活跃值: 活跃值 (708)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
Tennn 活跃值 5 2015-12-18 10:19
15
0
感谢楼主分享~
雪    币: 10
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zjchxj 活跃值 2016-12-7 15:23
16
0
mark  用IDA的工具做了易语言的sig签名
雪    币: 223
活跃值: 活跃值 (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
泪落晨曦 活跃值 2016-12-9 23:42
17
0
好文章mark一下
雪    币: 17
活跃值: 活跃值 (62)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Carkem 活跃值 2017-1-3 13:34
18
0
mark  易语言消息派发
雪    币: 717
活跃值: 活跃值 (486)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hanhaochi 活跃值 2017-1-3 15:21
19
0
感谢楼主分享!!!
游客
登录 | 注册 方可回帖
返回