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

author author     2022-08-07     773

关键词:

标 题: 【原创】易语言消息机制分析(消息拦截原理)
作 者: 红绡枫叶
时 间: 2014-12-17,12:41:44
链 接: http://bbs.pediy.com/showthread.php?t=195626

 

 

我自己做了个易语言的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)获取用户事件,如果匹配了,
就调用用户事件处理例程.

完美断下按钮事件:

技术分享

windows消息拦截技术的应用

...,消息在用户与程式之间进行交流时起了一种中间“语言”的作用。在程式中接收和处理 查看详情

android进阶知识——android的消息机制(代码片段)

文章目录1.Android的消息机制概述2.Android的消息机制分析2.1ThreadLocal的工作原理2.2消息队列的工作原理2.3Looper的工作原理2.4Handler的工作原理3.主线程的消息循环从开发的角度来说,Handler是Android消息机制的上层接口,这使得... 查看详情

android进阶知识——android的消息机制(代码片段)

文章目录1.Android的消息机制概述2.Android的消息机制分析2.1ThreadLocal的工作原理2.2消息队列的工作原理2.3Looper的工作原理2.4Handler的工作原理3.主线程的消息循环从开发的角度来说,Handler是Android消息机制的上层接口,这使得... 查看详情

handler机制.源码分析

...则一个线程可以产生一个looper对象,由它去管理线程里面消息队列MessageQueueHandler你可以构造handler对象来与looper沟通.可以发送消息和处理消息 MessageQueue用来存放线程放入的消息 线程一般值的是主线程UIthre 查看详情

ios开发系列--通知与消息机制(转)

...机制就可以告诉用户此时发生的事情。iOS中通知机制又叫消息机制,其包括两类:一类是本地通知;另一类是推送通知,也叫远程通知。两种通知在iOS中的表现一致,可以通过横幅或者弹出提醒两种形式告诉用户,并且点击通知... 查看详情

handler机制原理分析(适合初学者)1.0

...数中开始执行,接着调用prepareMainLooer()为UI线程创建一个消息队列MessageQueue.并执行Looper.loop().     Handler消息机制的原理是什么了?我们先来写一个程序看看。  查看详情

handlerloopermessage异步消息处理线程机制(hander消息机制原理)

Handler、Looper、Message这三者都与Android异步消息处理线程相关的概念。那么什么叫异步消息处理线程呢?异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,然后回调相应的... 查看详情

rabbitmq学习记录-消息队列存储机制源码分析

...lang是基于Actor模型的一门天然多进程、分布式和高并发的语言。一个Erla 查看详情

android:安卓学习笔记之handler机制的简单理解和使用(代码片段)

...Handler类对象6.3.1.1、隐式操作1:创建循环器对象&消息队列对象6.3.1.2、隐式操作2:消息循环6.3.2、创建消息对象6.3.3、在工作线程中发送消息到消息队列中6.3.4、总结6.4、方式2:使用Handler.post()6.4.1、在主线程中创建... 查看详情

android进阶知识——android的消息机制(代码片段)

文章目录1.Android的消息机制概述2.Android的消息机制分析2.1ThreadLocal的工作原理2.2消息队列的工作原理2.3Looper的工作原理2.4Handler的工作原理3.主线程的消息循环从开发的角度来说,Handler是Android消息机制的上层接口,这使得... 查看详情

handler消息机制和threadlocal原理(代码片段)

...er、MessageQueue、message四个部分组成,Handler负责线程间消息通讯的发送消息和接收处理消息Looper用于从MessageQueue中轮询获得MessageMessageQueue则是一个单线链表的用于存储Message的数据结构Message则是线程间通信的载体总体流程图如... 查看详情

qt消息机制和事件

三,事件过滤器  有时候,对象需要查看、甚至要拦截发送到另外对象的事件。例如,对话框可能想要拦截按键事件,不让别的组件接收到;或者要修改回车键的默认处理。   通过前面的章节,我们已经知道,Qt创建了Q... 查看详情

activemq---activemq原理分析之消息发送(代码片段)

持久化消息和非持久化消息的发送策略消息同步发送和异步发送ActiveMQ支持同步、异步两种发送模式将消息发送到broker上。同步发送过程中,发送者发送一条消息会阻塞直到broker反馈一个确认消息,表示消息已经被broker处理。这... 查看详情

rocketmq源码分析之rocketmq事务消息实现原理中篇----事务消息状态回查(代码片段)

上节已经梳理了RocketMQ发送事务消息的流程(基于二阶段提交),本节将继续深入学习事务状态消息回查,我们知道,第一次提交到消息服务器时消息的主题被替换为RMQ_SYS_TRANS_HALF_TOPIC,本地事务执行完后如果返回本地事务状态... 查看详情

rocketmq源码分析之rocketmq事务消息实现原理中篇----事务消息状态回查(代码片段)

上节已经梳理了RocketMQ发送事务消息的流程(基于二阶段提交),本节将继续深入学习事务状态消息回查,我们知道,第一次提交到消息服务器时消息的主题被替换为RMQ_SYS_TRANS_HALF_TOPIC,本地事务执行完后如果返回本地事务状态... 查看详情

kafka生产者开发,原理分析,以及参数配置

参考技术A生产者开发(基于java),生产者发送消息主要有以下三步那么我们进行抽象,大致可以得到这两个类。另外Kafka为了表现以下封装的特性,把准备生产者的参数配成了一个Properties类,以这个类为KafkaProducer构造函数入参... 查看详情

androidhandler消息机制从原理到应用详解(代码片段)

...而对于线程之间的通信,Android同样提供了一个强大的消息机制:Handler/Looper/MessageQueue,通过Handler我们很容易的实现在UI线程与其他线程之间的消息传递。这篇文章,就来看一看Android消息机制的具体应用以及原理。主要... 查看详情

28rocketmq:事务消息机制的底层实现原理

1.half消息在commit前对消费者不可见的原因回顾:当订单系统去发送一个half消息给MQ的时候。对于这个half消息,红包系统在这时是看不到它的,也无法去消费这条消息并进行处理。ConsumeQueue的可见原理场景解析:当... 查看详情