问题-[Delphi]通过Map文件查找内存地址出错代码所在行
生活随笔
收集整理的這篇文章主要介紹了
问题-[Delphi]通过Map文件查找内存地址出错代码所在行
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?一 什么是MAP文件 ????? 什么是 MAP 文件?簡單地講, MAP 文件是程序的全局符號、源文件和代碼行號信息的唯一的文本表示方法,它可以在任何地方、任何時候使用,不需要有額外的程序進行支持。而且,這是唯一能找出程序崩潰的地方的救星。 ????? 如果要查找代碼行號,需要使用下面的公式做一些十六進制的減法運算: ????? 崩潰行偏移 = 崩潰地址(Crash Address) - 基地址(ImageBase Address) - 0x1000 ????? 為什么要這樣做呢?我們得到的崩潰地址都是由 偏移地址+ 基地址得來的,所以在計算行號的時候要把基地址減去,一般情況下,基地址的值是 0x00400000 。另外,由于一般的 PE 文件的代碼段都是從 0x1000 偏移開始的,所以也必須減去 0x1000 。 二 Delphi 下生成MAP文件的方法 ????? project?? ->?? options?? ->?? Linker?? ->?? Map?? file?? 選擇detailed。? 生成的位置在Exe文件所在的目錄。 三 例子 ????? 代碼 procedure TForm1.Button1Click(Sender: TObject);
var????
??? I,?? J:?? Integer;
??? p:?? PChar;
begin
??? I?? :=?? 10;
??? J?? :=?? 0;
??? p?? :=?? nil;
??? p^?? :=?? 'A';?? //?? 36行.? 這里會報錯
end; ???? 運行時會報錯 ? 這里可以發現出錯地址是:$00401A51 根據:????? 崩潰行偏移 = 崩潰地址(Crash Address) - 基地址(ImageBase Address) - 0x1000 ???????????????????????????????????? =$00401A51 - $00400000 -$1000 ??????????????????????????????????? =$00000A51 ? 用記事本打開生成的MAP文件
Line numbers for Unit1(Unit1.pas) segment .text ??? 32 0001:00000A48??? 35 0001:00000A49???? 36 0001:00000A4E??? 37 0001:00000A54
??? 40 0001:00000A58??? 42 0001:00000A7D??? 43 0001:00000A8E??? 44 0001:00000ABD
??? 45 0001:00000AEE??? 49 0001:00000AF8??? 50 0001:00000B10??? 52 0001:00000B44
??? 52 0001:00000B4B ? 那么,通過在MAP文件里查找小于或等于$00000A51的最大值就是,我們要得到的崩潰行偏移. 這樣得到出錯行在, Unit1單元的36行.? 正好是這行:?? p^?? :=?? 'A';?? //?? 36行.? 這里會報錯 建議給客戶的時候不要帶著map文件,map文件里記錄著所有程序函數的名稱及入口內存地址,太方便別人破解了。
var????
??? I,?? J:?? Integer;
??? p:?? PChar;
begin
??? I?? :=?? 10;
??? J?? :=?? 0;
??? p?? :=?? nil;
??? p^?? :=?? 'A';?? //?? 36行.? 這里會報錯
end; ???? 運行時會報錯 ? 這里可以發現出錯地址是:$00401A51 根據:????? 崩潰行偏移 = 崩潰地址(Crash Address) - 基地址(ImageBase Address) - 0x1000 ???????????????????????????????????? =$00401A51 - $00400000 -$1000 ??????????????????????????????????? =$00000A51 ? 用記事本打開生成的MAP文件
Line numbers for Unit1(Unit1.pas) segment .text ??? 32 0001:00000A48??? 35 0001:00000A49???? 36 0001:00000A4E??? 37 0001:00000A54
??? 40 0001:00000A58??? 42 0001:00000A7D??? 43 0001:00000A8E??? 44 0001:00000ABD
??? 45 0001:00000AEE??? 49 0001:00000AF8??? 50 0001:00000B10??? 52 0001:00000B44
??? 52 0001:00000B4B ? 那么,通過在MAP文件里查找小于或等于$00000A51的最大值就是,我們要得到的崩潰行偏移. 這樣得到出錯行在, Unit1單元的36行.? 正好是這行:?? p^?? :=?? 'A';?? //?? 36行.? 這里會報錯 建議給客戶的時候不要帶著map文件,map文件里記錄著所有程序函數的名稱及入口內存地址,太方便別人破解了。
轉載于:https://www.cnblogs.com/FKdelphi/p/4654621.html
總結
以上是生活随笔為你收集整理的问题-[Delphi]通过Map文件查找内存地址出错代码所在行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nodejs+express +jade
- 下一篇: Arduino 与 MPU6050 姿态