如何逆向工程师' Windows消息'在delphi应用程序中

时间:2018-03-19 18:06:01

标签: delphi reverse-engineering

IDR是反编译Delphi应用程序的好工具,但是我如何知道分配给消息处理程序的Windows消息的ID号?

例如,从IDR反编译中,我看到:

procedure sub_004D2398(var Msg: TMsg);dynamic;

原始源代码是:

procedure Name_procedure(var Msg: TMsg); message 1028;

如何在IDR中对代码进行逆向工程时知道消息号1028?

2 个答案:

答案 0 :(得分:4)

给定的过程不知道它是否是message处理程序,因为该信息不存储在程序本身中,反过来可以在其中轻松访问它(虽然它在RTTI中可用)。

每个类都有自己的调度表,编译器生成该调度表以保存指向所有类dynamicmessage方法的指针(在message的情况下),以及它们的消息ID )。因此,当您将类过程声明为message处理程序时,编译器会在该类的调度表中插入该消息ID的条目以及指向该处理程序的指针。

当UI控件收到消息时,消息首先转到控件的WindowProc(应用程序可以直接子类化)。如果未处理该消息,则转到控件的WndProc()方法。如果仍未处理该消息,则转到TObject.Dispatch()方法,该方法在控件的调度表中查找消息ID,并在找到相关过程时调用该过程。否则,消息将转到控件的DefaultHandler()方法。

因此,除非IDR足够智能地反编译过程,确定它属于哪个类,并查找并反编译该类的调度表或RTTI以确定属于该过程的消息ID,然后您必须手动执行此操作在分析反编译输出时。类的VMT包含指向类的调度表和RTTI(以及其他内容)的指针。

一旦您能够确定属于给定message处理程序的消息ID,您才能研究并确定ID可能引用的消息类型,如Deltics的回答中所述。< / p>

答案 1 :(得分:0)

通常,要查找与给定消息编号对应的消息声明,您只需查看声明消息常量的任何头文件(C / C ++)或单元(Delphi)。从内存中我认为(较旧的?)Delphi版本是在 Windows 单元中,或者可能是消息

对于Delphi,你会发现一堆类似于:

的声明
if(resulttxt.contains("-")){

或者如果是十六进制:

const
  WM_LBUTTONDOWN = 513;

只需找到 WM _ 常量的声明,其值为1028(或等效十六进制,$ 0404)。

然而 你几乎肯定找不到一个

私信

1028大于1024,而1024是&#34;特殊消息&#34;:WM_USER的常量。这不是直接用作消息,而是指示应用程序可用于其自己的自定义/私有消息的第一个消息号。

即。值为1028的消息在所有Windows应用程序中都没有标准含义。

相反,它是第四个&#34;定制&#34;或者私人消息(或者可能是第5条 - 有些人以const WM_LBUTTONDOWN = $0201; 开头,有些人以WM_USER+1开头,而WM_USER开头只有该应用程序

如果没有原始声明的消息常量名称,无论它意味着什么并且用于它,只能通过检查代码并确定其在该代码中的使用来确定。