1 Delphi启动过程
参考连接:
https://blog.csdn.net/sforiz/article/details/5427245
https://www.cnblogs.com/FKdelphi/p/12773388.html
https://www.cnblogs.com/windlog/p/12354270.html
program Project1
第一步:
- _InitExe windows调用Exe的入口
- InitiateModule
- _StartExe
- SetExceptionHandler
- InitUnits
第二步:
InitControls 的 initialization (初始化)部分
- Mouse.create
- Screen.create
- Application.Create
- AllocateHWnd
- AllocateHWnd
- MakeObjectInstance
- StdWndProc
- Instance^.FMethod := TMethod(AMethod);
- AMethod==首次创建App时对应PopupControlProc
- PMethod = ^TMethod;
第三步:
- TApplication.Initialize; 初始化
- TApplication.CreateForm创建窗体(空白窗体) 或者是 TFORM.CREATE(创建设计好的窗体) ;
- TApplication.Run; 启动消息循环 大概这就是主程序 类似于main函数
************************************************************ program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}, Unit3 in 'Unit3.pas' {Form3}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.CreateForm(TForm3, Form3); Application.Run; end. ************************************************************
第四步:
- HandleMessage
- TApplication.ProcessMessage
- PeekMessage
- TranslateMessage
- DispatchMessageWi->
- StdWndProc
- TWinControl.MainWndProc
- WindowProc: TWndMethod【TControl】
- TControl.WndProc【初始化时指定FWindowProc := WndProc;】
- TControl.WndProc
- procedure TCustomForm.WndProc(var Message: TMessage);
- 基于多态性调用父类TControl的WndProc
- Dispatch->TObject.Dispath->消息回调函数
- DefaultHandler
单个窗体:
- –>程序启动
- –>执行 initialization 处的代码
- –>执行窗体的构造函数并创建相应窗体和单元中的对象(如拖拉的控件对象,全局变量等)
- –>执行 OnCreate 事件
- –>程序运行
- –>关闭主窗体(此处指调用主窗体的Close或点击主窗体的关闭按钮)
- –>执行 OnClose 事件
- –>执行 OnDestroy 事件
- –>执行 finalization 处的代码
************************************************************
unit Unit1;
interface
//InitUnits
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
//TApplication.Create
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
//OnClose —— 在点击关闭按钮或执行该事件时调用。
//OnCreate —— 在窗体创建时调用。(我的感觉:该事件是在窗体创建之后,即执行构造函数后才执行的)
//OnDestroy —— 在窗体销毁时调用,一般用来销毁程序员自己定义(自己定义、创建,而不是直接从控件板拖拉过来的控件)的对象、变量、指针等等。
//创建窗体
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage('1 FormCreate');
end;
//销毁窗体
procedure TForm1.FormDestroy(Sender: TObject);
begin
ShowMessage('1 Destroy');
end;
//initialization —— 在单元中放在文件结尾前,包含用来初始化单元的代码,它在主程序运行前运行并且只运行一次。
//finalization —— 在单元中放在 initialization 和 end. 之间,包含了单元退出时的代码。在程序退出时运行并且只运行一次。
initialization ShowMessage('1 ini');{单元初始化代码}
finalization ShowMessage('1 final');{单元退出时的代码}
end.
************************************************************
2 修复Delphi符号
IDA Pro默认并不会对Delphi有很好的符号解析效果,必须加载额外符号来修正。
- 下载该地址的IDR:https://github.com/huettenhain/dhrake/releases/tag/INITIAL
- 或者可以自己构建官方IDR:
知识库下载地址:https://www.dropbox.com/sh/9ran313nidqtagb/AADl_m_9GVYSiXUviZtDQWQHa?dl=0
程序下载地址:https://github.com/crypto2011/IDR/releases
- 加载Delphi程序
- Tools —> IDC Generator 产生IDC脚本
- IDA加载IDC脚本即可进行符号修正
- 使用Tools —> Map Generator 来创建Map文件供x64dbg使用
- x64dbg使用SwissArmyKnife插件来加载map文件