- 论坛徽章:
- 0
|
可以直接根据system.map中的地址修改。我实验了。
另外我还找到一下方法:
static void get_sys_call_table1(void) {
unsigned long* ptr;
int i;
int arr[4];
ptr=(unsigned long *)((init_mm.end_code + 4) & 0xfffffffc);
while((unsigned long )ptr < (unsigned long)init_mm.end_data)
{
if (*ptr == (unsigned long *)sys_open) { /* The hit has happend! */
printk (KERN_INFO" -> matching detected at %p\n", ptr);
/* The pointers mast point to kernel code section... */
for(i = 0; i < 4 ;i++)
{
arr[i]=*(ptr+i);
arr[i]=(arr[i] >> 16) & 0x0000ffff;
}
/* And they does not mast match... */
if(arr[0] != arr[2] || arr[1] != arr[3])
{
sys_call_table=(ptr-__NR_open);
break;
}
}
ptr++; /* The next one... */
}
printk (KERN_INFO"[1] sys_call_table1 base found at: 0x%p\n",sys_call_table);
}
其中为什么要进行arr[i]=(arr[i] >> 16) & 0x0000ffff;这个操作,什么意思?
if(arr[0] != arr[2] || arr[1] != arr[3])??? |
|