- 论坛徽章:
- 0
|
经过一周的努力,终于有眉目了!
按照以前的说法,
LINUX2.4.18没有导出SYS_CALL_TABLE;
必须读出IDT寄存器,得到IDTR.BASE,
然后IDTR.BASE+0X0400(INT 80H);
得到INT 80H的对应IDT项目(8字节);
再然后,IDT项目的最高16位和最低16位结合;
得到INT 80H的进入地址;
搜索FF/14/85(CALL指令);
其后就是SYS_CALL_TABLE了;
我按照这个说法作了,结果是 系统宕机;
没办法,我有想了个办法:
发现REDHAT8的/PROC/KCORE对应系统内存;
好大啊(512M字节的文件),
我的计算机的内存是512M的条子,看来是对应了;
执行复制命令cp /proc/kcore /root/kcore.x
然后搜索, 找到了多个FF/14/85;
只有一个是我要的真正的CALL *SYS_CALL_TABLE;
它的特征是:
3D/00/01/00/00 (比较系统调用号(256));
0F/83/XX/XX/XX/XX (如果大于等于,就跳转);
FF/14/85/ZZ/ZZ/ZZ/ZZ/ (不然,CALL(系统调用表+调用号));
89/44/24/XX/ (保存返回的数值);
90 (nop了,空指令)
这个(ZZ/ZZ/ZZ/ZZ)就是SYS_CALL_TABLE的地址了!!
在内核里面也许不能使用READ函数;
没关系,我写个用户端的搜索程序(root权限下执行);
得到SYS_CALL_TABLE的地址以后,
INSMOD MYHACK ZZ/ZZ/ZZ/ZZ;
把地址用参数传入模块,INIT_MODULE()
读取这个参数,硬性设置SYS_CALL_TABLE;
替换原来的系统函数,从而实现系统调用的拦截!!
这个办法不适合于"黑"别人的系统,
这是我为了编写VOD歌库加密的,
它拦截系统的文件读写操作,
把数据解密后再返回给用户;
这样,服务器上面的加密的歌曲文件,
读入到客房计算机的VOD以后,就是解密的;
8471解压卡的LINUX驱动,就被蒙蔽了; |
|