*sys_call_table[] 후킹이 2.4.20-8에서도 안돼는건가요? ㅠ.ㅠ
글쓴이: et3569 / 작성시간: 목, 2005/04/07 - 2:40오후
[root@localhost home]# gcc -D__KERNEL__ -DMODULE -Wall -c -O2 -I /usr/src/linux-2.4.20-8/include/ cryptmodule.c
[root@localhost home]# insmod cryptmodule.o
cryptmodule.o unresolved symbol sys_call_table
이렇게 나오네요 2.6이 시스템콜 후킹 안돼서 2.4로 하는데도 그러네요
답변좀 부탁드립니다.
Forums:
2.6대는 안해봐서 모르겠고 2.4대도 기본적으로 sys_call_tab
2.6대는 안해봐서 모르겠고 2.4대도 기본적으로 sys_call_table 이 외부로 들어나있지는 않습니다. 커널 컴파일을 다시 하든지 꽁수를 쓰든지 해야겠죠. 고운 하루되세요.
=========================
CharSyam ^^ --- 고운 하루
=========================
IA64에서는 sys_call_table이 EXPORT 되어 있는데 i3
IA64에서는 sys_call_table이 EXPORT 되어 있는데 i386, x86_64에서는 되어 있지 않습니다.
여러 가지 방법이 있습니다.
/boot/System.map에서 sys_call_table 을 가져가다 하드 코딩하셔도 되고요
#cat /boot/System.map | grep sys_call_table
c037eb74 d sys_call_table
sys_call_table = 0xc037eb74;
하셔도 되고요
아래 함수를 사용하셔도 되는데 코드 분석은 저도 모릅니다.
long *get_sys_call_table(void)
{
int ctr = 0;
unsigned int sys_call_off;
struct {
unsigned short limit;
unsigned int base;
} __attribute__ ((packed)) idtr;
struct {
unsigned short off1;
unsigned short sel;
unsigned char none,flags;
unsigned short off2;
} __attribute__ ((packed)) *idt;
asm ("sidt %0" : "=m" (idtr));
(unsigned int)idt = (unsigned int)(idtr.base+8*0x80);
sys_call_off = (idt->off2 << 16) | idt->off1;
while(1) {
if(!strncmp((char *)sys_call_off,"\xff\x14\x85",3))
break;
++sys_call_off;
++ctr;
if(ctr > 400) {
return NULL;
}
}
return (long *)*(unsigned int *)(sys_call_off + 3);
}
x86_64 나 IA64 에서는 적용되지 않는 코드이면 i386에서만 적용되는 코드입니다. 인터넷에 자료 있으니 찾아보시면 될듯 하네요.
방갑습니다..
잘 부탁드립니다.
댓글 달기