zoukankan      html  css  js  c++  java
  • 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);  
          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行   ^_^.....   
        
    另外,map文件不是唯一的,dcu本身就可以,要不然Delphi   IDE也没法找到发生异常的行了,  
      还有如果编译的时候带上turbo   debug   info,也可以从本身的tds找到行号  
      也有一些工具能够间接从map文件生成符号信息然后附加到目标模块(或者成为独立的一个文件)   
     
      大家可以看到DELPHI   的设置  
      点击    
      project   ->   Linker   ->   Memory   size   的Image   base   默认为$00400000   这就是pe   loader加载的时候默认加载到的基址。
    View Code
  • 相关阅读:
    TDD
    算法与数据结构 文档 1 洋洋洋传
    编程的专精度
    python小课
    有时心情舒畅时打个代码心里都是默默地同步输出...
    同时可以运行在JVM上的Kotlin~枚举和判定以及数据对象的写法总结
    map
    multiset
    set
    priority_queue
  • 原文地址:https://www.cnblogs.com/key-ok/p/3394328.html
Copyright © 2011-2022 走看看