IDR是反编译Delphi应用程序的好工具,但是我如何知道分配给消息处理程序的Windows消息的ID号?
例如,从IDR反编译中,我看到:
procedure sub_004D2398(var Msg: TMsg);dynamic;
原始源代码是:
procedure Name_procedure(var Msg: TMsg); message 1028;
如何在IDR中对代码进行逆向工程时知道消息号1028?
答案 0 :(得分:4)
给定的过程不知道它是否是message
处理程序,因为该信息不存储在程序本身中,反过来可以在其中轻松访问它(虽然它在RTTI中可用)。
每个类都有自己的调度表,编译器生成该调度表以保存指向所有类dynamic
和message
方法的指针(在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
开头只有该应用程序。
如果没有原始声明的消息常量名称,无论它意味着什么并且用于它,只能通过检查代码并确定其在该代码中的使用来确定。