• AV 地址错误 map 文件 根据地址报错,查 Delphi 代码


    1. 首先需要设置程序生成 map 文件。
    Project -> Options -> Linker -> Map file , Detailed

    2. 计算公式
    Edit2.Text := IntToHex(StrToInt('$'+ Edit1.Text) - StrToInt('$00400000') - StrToInt('$00001000'), 8) ;
    将看到的地址错误,输入到 Edit1 中。

    3. 从 Map 文件中查这个地址。
    一般直接查是找不到的。根据获得的 Edit2 中的值。删掉最后 1 位,或者 2 位,查。
    得到的第一个不大于 Edit2 中值的地方,就是我们要的。
    如果能找到函数名,根据这个函数名对应的“完整”的地址,再查一次,可以得到代码行数。

    4. 这种方法并非非常靠谱。找不到,或者直接找到更底层的代码位置。也是很正常的。

    ----------------------------------------------
    详解二

    什么是MAP文件?简单地讲,MAP文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。而且,这是唯一能找出程序崩溃的地方的救星。
    DELPHI下生成MAP文件的方法:偶只知道下面两种,如果谁知道其他的方法 敬请告知 多谢
    生成详细的MAP信息的方法
    1. project -> options -> Linker -> Map file 选择detailed.
    2. D:FredCodeDELPHIMyPasErrLineByAddr2>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);  
          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行 ^_^.....

    另外,map文件不是唯一的,dcu本身就可以,要不然Delphi IDE也没法找到发生异常的行了,
    还有如果编译的时候带上turbo debug info,也可以从本身的tds找到行号
    也有一些工具能够间接从map文件生成符号信息然后附加到目标模块(或者成为独立的一个文件)

    大家可以看到DELPHI 的设置
    点击
    project -> Linker -> Memory size 的Image base 默认为$00400000 这就是pe loader加载的时候默认加载到的基址。

    参考:http://www.cnblogs.com/key-ok/p/3394328.html

  • 相关阅读:
    设计模式概述
    Android之.9.png图片的制作与使用
    2015-4-3~2015-5-28 第四届全国大学生软件设计大赛《解密陌生人》项目总结
    排序算法之快速排序
    AsyncTask那些事(更新中...)
    经典Android面试题
    import第三方库的头文件找不到的错误
    点击某个按钮在tableView某个位置动态插入一行cell
    NSUserDefaults:熟悉与陌生(转)
    更改UIsearchbar 的背景和cancel按钮(转)
  • 原文地址:https://www.cnblogs.com/findumars/p/4748585.html
Copyright © 2020-2023  润新知