Memory management x86上的RIP相对寻址
我对x86汇编程序并没有真正的经验,并尝试调试与之相关的问题 原始代码如下所示(mach_inject.c中的函数Memory management x86上的RIP相对寻址,memory-management,assembly,x86,addressing,relative-addressing,Memory Management,Assembly,X86,Addressing,Relative Addressing,我对x86汇编程序并没有真正的经验,并尝试调试与之相关的问题 原始代码如下所示(mach_inject.c中的函数mach_inject): 然后稍晚(mach\u INJECT\u bundle\u stub.c的函数INJECT\u ENTRY): 对我来说,当我为x86编译这个时,它似乎失败了。如果我更改代码,使我的imageOffset=0在每种体系结构(即x86)上都可以正常工作 因此,有些问题: RIP相对寻址也可用于32位/x86模式 如果我们也有32位模式的RIP相对寻址,那么
mach_inject
):
然后稍晚(mach\u INJECT\u bundle\u stub.c的函数INJECT\u ENTRY
):
对我来说,当我为x86编译这个时,它似乎失败了。如果我更改代码,使我的imageOffset=0
在每种体系结构(即x86)上都可以正常工作
因此,有些问题:
- RIP相对寻址也可用于32位/x86模式
- 如果我们也有32位模式的RIP相对寻址,那么(可能)这段代码的最初意图是什么
- RIP相对寻址是编译器设置吗?或者,我可以通过什么方式控制我的代码是否使用RIP相对寻址?(或与此错误相关的更多信息:imageOffset=0;是否始终正确?或者何时不正确?)
imageOffset
作为第一个参数传递给注入的代码,因此我不确定它与RIP相对寻址(在32位模式下不存在)有何关系。@user786653:我对它进行了一点扩展。也许我没有得到代码(您能添加一些文件:行号参考以便可以继续吗?),但用于确定入口点的不是threadEntryOffset
而不是imageOffset
?在我看来,imageOffset似乎只是用作thread\u create\u running
@user786653的第一个参数。正确调用了thread\u create\u running
调用的函数。在我的情况下,我这是mach_INJECT_bundle_stub.c的INJECT_条目
。在该文件中,您可以看到一些地方,其中本地函数的地址由imageOffset
修改(如发布的代码)。啊,现在我看到了。如果mach_INJECT_bundle_stub单独编译位置,我认为不需要imageOffset
(虽然不是100%确定,但我不知道如何检查不同的内容是如何编译/链接的)。
#if defined(__x86_64__)
imageOffset = 0; // RIP-relative addressing
#else
ASSERT_CAST( void*, remoteCode );
imageOffset = ((void*) remoteCode) - image;
#endif
pthread_create( &thread,
&attr,
(void* (*)(void*))((long)some_local_function + imageOffset),
(void*) param );