- 论坛徽章:
- 0
|
本帖最后由 EncoreDeng 于 2014-05-27 14:25 编辑
大家好,关于AIX系统调用的捕获(教程在http://www.ibm.com/developerwork ... ceptcall/index.html),
我做了部分测试,发现如下问题, 希望大神们能够有所指点,谢谢.
首先简单的C代码如下
int main(void)
{
void *pAddr = (void *)chmod;
int *pInt = (int *)pAddr;
printf("%X %X\n", pInt[0], pInt[1]);
chmod("./testchmod.c", S_IRUSR|S_IWUSR|S_IXUSR);
int n = open("./testchmod.c", O_RDONLY);
return 0;
}
打印输出: 3700 138
正如文章所讲, 伪函数描述符的第一个双字(double-word)包含系统调用入口点的地址(0x3700),而第二个双字包含 chmod 的 svc 编号(0x138)
但当我尝试把系统调用从chmod换到open时,打印输出就完全不是那回事,
int main(void)
{
void *pAddr = (void *)open;//chmod
int *pInt = (int *)pAddr;
printf("%X %X\n", pInt[0], pInt[1]);
chmod("./testchmod.c", S_IRUSR|S_IWUSR|S_IXUSR);
int n = open("./testchmod.c", O_RDONLY);
return 0;
}
打印输出:D0119AE0 F1A724A0
当我尝试用dbx进行,尝试查看open的汇编指令,发现情况也跟chmod有很大区别.
(dbx) listi open
0xd0119ae0 (open) 7c0802a6 mflr r0
0xd0119ae4 (open+0x4) 93e1fffc stw r31,-4(r1)
0xd0119ae8 (open+0x8) 93c1fff8 stw r30,-8(r1)
0xd0119aec (open+0xc) 93a1fff4 stw r29,-12(r1)
0xd0119af0 (open+0x10) 9381fff0 stw r28,-16(r1)
0xd0119af4 (open+0x14) 9361ffec stw r27,-20(r1)
0xd0119af8 (open+0x18) 83e206d8 lwz r31,0x6d8(r2)
0xd0119afc (open+0x1c) 90010008 stw r0,0x8(r1)
0xd0119b00 (open+0x20) 8002000c lwz r0,0xc(r2)
0xd0119b04 (open+0x24) 9421ffa0 stwu r1,-96(r1)
另外我尝试查看其他多个系统调用,发现也不能用教程里的办法,取为函数描述符的前两个双字来获得系统调用的入口地址和相应的svc.
希望各位大虾能够解答小弟的小小疑问.
小弟就此拜谢!
|
|