如何找到“虚拟地址”的“原始地址”?

逆向工程 聚乙烯 入口点 pe32 虚拟内存
2021-06-28 22:53:52

我正在尝试手动解析 PE 文件,如下所示:

    1 ### DOS Header
    2 
    3 00000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000  MZ..............
    4 00000010: b800 0000 0000 0000 4000 0000 0000 0000  ........@.......
    5 00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
    6 00000030: 0000 0000 0000 0000 0000 0000 8000 0000  ................   // e_lfanew = 0x00000080
    7 
    8     - DOS Stub
    9 00000040: 0e1f ba0e 00b4 09cd 21b8 014c cd21 5468  ........!..L.!Th
   10 00000050: 6973 2070 726f 6772 616d 2063 616e 6e6f  is program canno
   11 00000060: 7420 6265 2072 756e 2069 6e20 444f 5320  t be run in DOS
   12 00000070: 6d6f 6465 2e0d 0d0a 2400 0000 0000 0000  mode....$.......
   13 
   14 -------------------------------------------------------------------
   15 
   16 ### NT Header
   17 
   18     - Magic
   19 00000080: 5045 0000
   20 
   21     - File Header
   22                     4c01 0f00 3f55 785e 0088 0400  PE..L...?Ux^....   // NumberOfSections = 0x000f = 15
   23 00000090: a705 0000 e000 0701                                         // SizeOfOptionalHeader = 0x000e = 14 * 16
   24 
   25     - Optional Header
   26                               0b01 0221 0022 0000  ...........!."..
   27 000000a0: 003a 0000 0006 0000 c014 0000 0010 0000  .:..............   // EntryPoint = 0x000014c0 & BaseOfCode = 0x00001000
   28 000000b0: 0040 0000 0000 4000 0010 0000 0002 0000  .@....@.........   // BaseOfData = 0x00004000 & ImageBase = 0x00400000 & SectionAlignment = 0x00001000 & FileAlignment = 0x00000200
   29 000000c0: 0400 0000 0100 0000 0400 0000 0000 0000  ................
   30 000000d0: 0030 0500 0004 0000 3004 0500 0300 4001  .0......0.....@.
   31 000000e0: 0000 2000 0010 0000 0000 1000 0010 0000  .. .............
   32 000000f0: 0000 0000 1000 0000
   33 
   34         - Data Directories
   35                               0000 0000 0000 0000  ................
   36 00000100: 0070 0000 5c07 0000 0000 0000 0000 0000  .p..\...........   // ImportDirectory: VirtualAddress = 0x00007000 & Size = 0x0000075c
   37 00000110: 0000 0000 0000 0000 0000 0000 0000 0000  ................
   38 00000120: 0000 0000 0000 0000 0000 0000 0000 0000  ................
   39 00000130: 0000 0000 0000 0000 0000 0000 0000 0000  ................
   40 00000140: 5052 0000 1800 0000 0000 0000 0000 0000  PR..............
   41 00000150: 0000 0000 0000 0000 6871 0000 0401 0000  ........hq......
   42 00000160: 0000 0000 0000 0000 0000 0000 0000 0000  ................
   43 00000170: 0000 0000 0000 0000
   44 
   45 -------------------------------------------------
   46 
   47 ### Section Headers
   48 
   49                               2e74 6578 7400 0000  .........text...
   50 00000180: 6421 0000 0010 0000 0022 0000 0004 0000  d!......."......
   51 00000190: 0000 0000 0000 0000 0000 0000 6000 5060  ............`.P`
   52 
   53 000001a0: 2e64 6174 6100 0000 3400 0000 0040 0000  .data...4....@..
   54 000001b0: 0002 0000 0026 0000 0000 0000 0000 0000  .....&..........
   55 000001c0: 0000 0000 4000 30c0
   56                               2e72 6461 7461 0000  ....@.0..rdata..
   57 000001d0: 6c08 0000 0050 0000 000a 0000 0028 0000  l....P.......(..
   58 000001e0: 0000 0000 0000 0000 0000 0000 4000 3040  ............@.0@
   59 
   60 000001f0: 2e62 7373 0000 0000 0c04 0000 0060 0000  .bss.........`..
   61 00000200: 0000 0000 0000 0000 0000 0000 0000 0000  ................
   62 00000210: 0000 0000 8000 60c0
   63                               2e69 6461 7461 0000  ......`..idata..   // .idata section header
   64 00000220: 5c07 0000 0070 0000 0008 0000 0032 0000  \....p.......2..   // VirtualSize = 0x0000075c & VirtualAddress = 0x00000700
   65 00000230: 0000 0000 0000 0000 0000 0000 4000 30c0  ............@.0.
   66 
   67 00000240: 2e43 5254 0000 0000 3400 0000 0080 0000  .CRT....4.......
   68 00000250: 0002 0000 003a 0000 0000 0000 0000 0000  .....:..........
   69 00000260: 0000 0000 4000 30c0
   70                               2e74 6c73 0000 0000  ....@.0..tls....
   71 00000270: 0800 0000 0090 0000 0002 0000 003c 0000  .............<..
   72 00000280: 0000 0000 0000 0000 0000 0000 4000 30c0  ............@.0.
   73 
   74 00000290: 2f34 0000 0000 0000 e002 0000 00a0 0000  /4..............
   75 000002a0: 0004 0000 003e 0000 0000 0000 0000 0000  .....>..........
   76 000002b0: 0000 0000 4000 1042
   77                               2f31 3900 0000 0000  ....@..B/19.....
   78 000002c0: efb8 0300 00b0 0000 00ba 0300 0042 0000  .............B..
   79 000002d0: 0000 0000 0000 0000 0000 0000 4000 1042  ............@..B
   80 
   81 000002e0: 2f33 3100 0000 0000 dd25 0000 0070 0400  /31......%...p..
   82 000002f0: 0026 0000 00fc 0300 0000 0000 0000 0000  .&..............
   83 00000300: 0000 0000 4000 1042
   84                               2f34 3500 0000 0000  ....@..B/45.....
   85 00000310: 9d34 0000 00a0 0400 0036 0000 0022 0400  .4.......6..."..
   86 00000320: 0000 0000 0000 0000 0000 0000 4000 1042  ............@..B
   87 
   88 00000330: 2f35 3700 0000 0000 1c09 0000 00e0 0400  /57.............
   89 00000340: 000a 0000 0058 0400 0000 0000 0000 0000  .....X..........
   90 00000350: 0000 0000 4000 3042
   91 
   92                               2f37 3000 0000 0000  ....@.0B/70.....
   93 00000360: 1e05 0000 00f0 0400 0006 0000 0062 0400  .............b..
   94 00000370: 0000 0000 0000 0000 0000 0000 4000 1042  ............@..B
   95 
   96 00000380: 2f38 3100 0000 0000 601a 0000 0000 0500  /81.....`.......
   97 00000390: 001c 0000 0068 0400 0000 0000 0000 0000  .....h..........
   98 000003a0: 0000 0000 4000 1042
   99 
  100                               2f39 3200 0000 0000  ....@..B/92.....
  101 000003b0: 4003 0000 0020 0500 0004 0000 0084 0400  @.... ..........
  102 000003c0: 0000 0000 0000 0000 0000 0000 4000 1042  ............@..B
  103 
  104 -------------------------------------------------
  105 
  106     - Padding for FileAlignment?
  107 
  108 000003d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
  109 000003e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
  110 000003f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
  111 
  112 ------------------------------------------------
  113 
  114 ### Sections
  115 
  116 00000400: c38d b426 0000 0000 8db4 2600 0000 0090  ...&......&.....
  117 00000410: 83ec 1c31 c066 813d 0000 4000 4d5a c705  ...1.f.=..@.MZ..
  118 00000420: 8c63 4000 0100 0000 c705 8863 4000 0100  .c@........c@...
  119 00000430: 0000 c705 8463 4000 0100 0000 c705 3060  .....c@.......0`
  120 00000440: 4000 0100 0000 7518 8b15 3c00 4000 81ba  @.....u...<.@...
  121 00000450: 0000 4000 5045 0000 8d8a 0000 4000 7450  ..@.PE......@.tP
  122 00000460: a30c 6040 00a1 9463 4000 85c0 7532 c704  ..`@...c@...u2..
  123 00000470: 2401 0000 00e8 0220 0000 e805 2000 008b  $...... .... ...
  124 00000480: 15a8 6340 0089 10e8 d40f 0000 833d 1c40  ..c@.........=.@
  125 00000490: 4000 0174 4b31 c083 c41c c38d 7426 0090  @..tK1......t&..
  126 000004a0: c704 2402 0000 00e8 d01f 0000 ebcc 6690  ..$...........f.
  127 000004b0: 0fb7 5118 6681 fa0b 0174 3d66 81fa 0b02  ..Q.f....t=f....
         ...           .... Truncated .....                   ...

我的问题:

  1. 正如您在上面看到的,在第 36 行中,我们virtualAddress与导入库相关。如何在文件内容中找到这些数据对应的rawAddress?我的意思是,如何将 virtualAddresses 转换为 rawAddresses?
  2. 正如您在上面看到的,我们在 optionalHeader(第 36 行)和 .idata sectionHeader(第 64 行)的 DataDirectory 的第二个索引中有 virtualAddress 和 Size 字段。并且两者具有相同的值。为什么?那不是多余的吗?我们是否有一些情况下这些字段具有不同的值?
  3. 据我所知, .text 部分包含程序的汇编代码。那么为什么 OptionalHeader 中的 EntryPoint 字段没有 .text 部分的开头地址?
1个回答
  1. 您需要解析节表,找出您的地址属于哪个节(使用它们的 VirtualAddress 和 VirtualSize),然后计算从节开始的偏移量并将其添加到节的物理偏移量中。例如:

    SectionOffset = addr - section[i].VirtualAddress
    offset = SectionOffset + section[i].PointerToRawData

  2. 目录不一定匹配整个部分。它可能是截面的一小部分,或者(理论上)甚至跨越截面边界。请注意,在实践中,操作系统加载程序可能会忽略大小字段,但会使用例如 NULL 终止符来检测数据的结尾。

  3. 入口点不一定在.text. 这在a.out二进制文件中很常见,但现在对于 PE 和 ELF 来说都非常罕见。通常在开头还有其他函数(例如库代码)和/或只读数据。