- 论坛徽章:
- 0
|
原帖由 canjian 于 2008-11-6 09:20 发表
感谢热心回复!现在发现了另外一个问题,再次请教。在32位Linux下,为了获取系统调用表,采用了下面的这种方式对内存进行搜索,主要是搜索call sys_call_table * (% eax, 4)对应的机器码0xff 0x14 0x85 *addres ...
在64位当然要修改啦。
1、首先,64位下,IDTE 是16字节的,也就是说: 64位下的 interrupt descriptor 是16字节(128位)的。
那么:memcpy(&desc, (void *) (base + (0x80 * 8 ), sizeof(desc));
要修改为: memcpy(&desc, (void *) (base + (0x80 * 16), sizeof(desc));
相应的 system_call = ((void *) ((desc.off_high << 16) + desc.off_low)); 也要修改。
2、FF 14 85 这3个机器码的汇编语句是: call [eax*4+disp] 是 4 字节边界寻址。
那么 64 位下,估计实现时会改为: call [rax*8+disp] 8字节边界寻址。
相应的修改为:FF 14 C5
所以,应改为搜索 FF 14 C5 |
|