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?
给定的过程不知道它是否是message处理程序,因为该信息没有存储在过程本身中,反编译器可以轻松访问它(尽管它在 RTTI 中可用)。
每个类都有自己的调度表,编译器生成该表来保存指向所有类dynamic和message方法的指针(在 的情况下message,还有它们的消息 ID)。因此,当您将类过程声明为message处理程序时,编译器会在该类的调度表中插入该消息 ID 的条目以及指向处理程序的指针。
当 UI 控件收到消息时,该消息首先发送到该控件WindowProc(应用程序可以直接对其进行子类化)。如果消息未被处理,它将转到控件的WndProc()方法。如果消息仍未得到处理,它将转到该TObject.Dispatch()方法,该方法在控件的调度表中查找消息 ID,如果找到则调用关联的过程。否则,消息将发送至控件的DefaultHandler()方法。
因此,除非 IDR 足够聪明,能够反编译一个过程,确定它属于哪个类,并查找并反编译该类的调度表或 RTTI 以确定属于该过程的消息 ID,那么您必须在执行此操作时手动执行此操作。分析反编译的输出。类的 VMT 包含指向类的调度表和 RTTI(以及其他内容)的指针。
一旦您能够确定属于给定处理message程序的消息 ID,您就可以研究并找出该 ID 可能引用的消息类型,如 Deltics 的回答中所述。
| 归档时间: |
|
| 查看次数: |
799 次 |
| 最近记录: |