我正在尝试更好地理解Windows PE可执行文件的结构,即C ++链接器如何处理静态变量引用。 (就我的Visual Studio C ++而言。)
说我有以下示例:
::PathFindExtension(L"file.exe");
可能会转换为以下程序集(在本例中为Debug构建):
我理解指向PathFindExtension
指令的call
API指针,并在加载相应的DLL时插入到.exe文件启动时的PE图像中,但是我我不清楚如何处理指向静态字符串的指针。
如您所见push
指令:
00568AC6 68 70 48 60 00 push offset string L"file.exe" (604870h)
是68 id
机器码,或PUSH imm32
[source],因此imm32
只是对内存的绝对引用,或604870h
在这种情况下:
但我的问题是,由于该值在编译时是硬编码的,所以如何计算该偏移(即604870h
)?
第二个问题,ASLR如何处理这种情况,即当这个可执行文件可以加载到内存中的某个任意地址时? (如果我正确理解ASLR概念。)