Delphi下生成Map文件方法,免杀或调试用的
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Delphi下⽣成Map⽂件⽅法,免杀或调试⽤的
以前看了通过崩溃地址找错误⾏数之VC版那时候还没⽤DELPHI
昨晚刚好⼜看到了所以就试了⼀下DELPHI的,与⼤家共享 ^_^
什么是 MAP ⽂件?简单地讲, MAP ⽂件是程序的全局符号、源⽂件和代码⾏号信息的唯⼀的⽂本表⽰⽅法,它可以在任何地⽅、任何时候使⽤,不需要有额外的程序进⾏⽀持。
⽽且,这是唯⼀能找出程序崩溃的地⽅的救星。
DELPHI下⽣成MAP⽂件的⽅法:偶只知道下⾯两种,如果谁知道其他的⽅法敬请告知多谢
⽣成详细的MAP信息的⽅法
1. project -> options -> Linker -> Map file 选择detailed.
2. D:\Fred\Code\DELPHI\MyPas\ErrLineByAddr2>dcc32 -GD project1.dpr
我们的代码为:
unit Unit1;
//{$D+,L+}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
I, J: Integer;
p: PChar;
begin
I := 10;
J := 0;
//I := I div J; // 32
//ShowMessage(IntToStr(I));
p := nil;
p^ := 'A'; // 38
end;
end.
// 想必⼤家看到了会有返回0地址错误....我们这⾥就是要让它崩溃,让我让你崩溃 ^_^
然后执⾏点击然后出错我的机器上崩溃地址为0044d946
如果要查找代码⾏号,需要使⽤下⾯的公式做⼀些⼗六进制的减法运算:
崩溃⾏偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000
减去后得到 0004c946 然后查找 0004c946
0044d946 - 00400000 = 0004d946 - 00001000 = 0004c946 <= 后⾯列出的
0004C946 就是它了我们⽤ultraedit32之类的⼯具打开 .map⽂件搜索 0004C94,找到了,然后就找
<= 0004c946的那个地址然后看到了
Line numbers for Unit1(Unit1.pas) segment .text
37 0001:0004C944 38 0001:0004C946 39 0001:0004C949 41 0001:0004C97C
41 0001:0004C983
o yeah..<星际⾥⾯注射兴奋剂的声⾳ ^_^>.. 38 0001:0004C946 就是它了。
unit1.pas的第38⾏!!去代码⾥看⼀下果然就是38⾏ ^_^.....
共享ing...如果有不妥之处敬请之处多谢....
-------------------------------------------------------------------------
简单的⽅法
机器⾥要装delphi
然后新建⼀个快速编译.bat
内容 dcc32 -GD xx.dpr
把xx.dpr改成你⾃⼰的⼯程⽂件。
运⾏快速编译.bat
就能编译出程序,和map⽂件。
另外问下各位⾼⼿。
我⽤mycll定位出来的地址。
⽤oc转成了内存地址,再 -基地址(ImageBase Address) - 0x1000 得出来的地址Map⽂件⾥却没有。
不知道怎么回事。
是不是我搞错了。
我现在就想。
⽤mycll定位地址,然后在map⽂件⾥找到对应的代码。