sys_open module wrapping 관련 질문입니다.
wapping.c 의 소스입니다
#include
#include
#include
#include
#define __NR_open 5 // sys_open() system call number
#define __NR_getuid 24 // sys_getuid() system call number
void **sys_call_table;
asmlinkage int (*org_sys_open)( const char*, int, int );
asmlinkage int (*org_sys_getuid)( void );
asmlinkage int sys_our_open( char *fname, int flags, int mode )
{
printk( KERN_ALERT "%s file is opened by %d\n", fname, org_sys_getuid() );
return (org_sys_open( fname, flags, mode ) );
}
static void **find_system_call_table( void )
{
unsigned long ptr;
extern int loops_per_jiffy;
unsigned long *p;
for ( ptr = ( unsigned long )&loops_per_jiffy;
ptr < ( unsigned long )&boot_cpu_data ; ptr += sizeof( void* ) )
{
p = ( unsigned long * )ptr;
if ( p[ 6 ] == ( unsigned long ) sys_close )
{
return (void**)p;
}
}
return NULL;
}
int __init sct_init( void )
{
sys_call_table = find_system_call_table();
if( sys_call_table != NULL )
{
printk( KERN_ALERT "I think sys_call_table is at 0x%p\n",
sys_call_table );
org_sys_open = sys_call_table[ __NR_open ];
sys_call_table[ __NR_open ] = sys_our_open;
org_sys_getuid = sys_call_table[ __NR_getuid ];
}
else
{
printk( KERN_ALERT "Failed to find sys_call_table\n" );
}
return 0;
}
void __exit sct_exit( void )
{
sys_call_table[ __NR_open ] = org_sys_open;
}
module_init( sct_init );
module_exit( sct_exit );
MODULE_LICENSE( "GPL" );
이렇고요
make 하여 insmod wrapping 을 하면
커널 메세지로 I think sys_call_table 주소는 xxxxxxxxxxxx 이렇게 나옵니다.
문제는 wrapping 이 안됩니다. 그냥 기본적인 sys_open 만 하고 끝나더군요
그래서 /boot/System.map 에서 System_call_table 주소를 찾아보았떠니
wrapping.c 에서 찾은 주소와 틀린것입니다.
System_call_table 주소를 찾는 루틴이 잘못된거 같기도 하고요..
해결책 부탁드립니다.
운영체제는 페도라6(2.6.18-1.2798.fc6-i386) 입니다.
편법은 점점 더 쓰기
편법은 점점 더 쓰기 어려워집니다.
유저모드의 뭔가를 감시하기 위한 목적이라면 http://www.dazuko.org 를 들러보세요.
OTL
댓글 달기