方法 3: 使用映射文件
此方法演示了一种使用映射文件 (但不使用 TOC) 访问全局数据的方法。 将计算 民主 /demokext_j 变量的数据的地址。
与 方法 2 中概述的过程不同: 使用 TOC 和映射文件时,可以随时使用此方法。 此方法需要映射文件以及装入内核扩展时所使用的地址。
注: 由于此方法取决于装入内核扩展的方式,因此如果装入内核扩展的过程发生更改,那么此方法可能会退出工作。
此方法基于以下假设: 可以通过使用以下公式找到全局变量的地址:
Addr of variable = Addr of the last function before the variable in the map +
Length of the function +
Offset of the variable
以下是 demokext 内核扩展的映射文件的一部分:
20 000005B8 000028 2 GL SD S17 <.fp_write> glink.s(/usr/lib/glink.o)
21 000005B8 GL LD S18 .fp_write
22 000005E0 000028 2 GL SD S19 <.fp_open> glink.s(/usr/lib/glink.o)
23 000005E0 GL LD S20 .fp_open
24 00000000 0000F9 3 RW SD S21 <_$STATIC> demokext.c(demokext.o)
25 E 000000FC 000004 2 RW SD S22 demokext_j demokext.c(demokext.o)
26 * 00000100 00000C 2 DS SD S23 demokext demokext.c(demokext.o)
27 0000010C 000000 2 T0 SD S24 <TOC>
28 0000010C 000004 2 TC SD S25 <_$STATIC>
29 00000110 000004 2 TC SD S26 <_system_configuration>
.text 部分中的最后一个函数位于第 22 行和第 23 行。 此函数与映射的偏移量为 0x000005E0
(第 22 行,第 2 列)。 函数的长度为 0x000028
(第 22 行,第 3 列)。 demokext_j 变量的偏移量为 0x000000FC
(第 25 行,第 2 列)。 因此,从装入点值到 demokext_j 变量的偏移量为:
0x000005E0 + 0x000028 + 0x000000FC = 0x00000704
将此偏移量添加到 demokext 内核扩展的装入点值将提供 demokext_j 变量的数据地址。 假定装入点值为 0x01304040
,这指示 demokext_j 变量的数据位于:
0x01304040 + 0x00000704 = 0x01304744
要查看全局数据,请完成以下操作: