如何在delphi应用程序中逆向工程“Windows消息”

abd*_*der 1 delphi reverse-engineering

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

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

procedure sub_004D2398(var Msg: TMsg);dynamic;
Run Code Online (Sandbox Code Playgroud)

原来的源代码是:

procedure Name_procedure(var Msg: TMsg); message 1028;
Run Code Online (Sandbox Code Playgroud)

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

Rem*_*eau 5

给定的过程不知道它是否是message处理程序,因为该信息没有存储在过程本身中,反编译器可以轻松访问它(尽管它在 RTTI 中可用)。

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

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

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

一旦您能够确定属于给定处理message程序的消息 ID,您就可以研究并找出该 ID 可能引用的消息类型,如 Deltics 的回答中所述。