- 論壇徽章:
- 0
|
經(jīng)過(guò)一周的努力,終于有眉目了!
按照以前的說(shuō)法,
LINUX2.4.18沒(méi)有導(dǎo)出SYS_CALL_TABLE;
必須讀出IDT寄存器,得到IDTR.BASE,
然后IDTR.BASE+0X0400(INT 80H);
得到INT 80H的對(duì)應(yīng)IDT項(xiàng)目(8字節(jié));
再然后,IDT項(xiàng)目的最高16位和最低16位結(jié)合;
得到INT 80H的進(jìn)入地址;
搜索FF/14/85(CALL指令);
其后就是SYS_CALL_TABLE了;
我按照這個(gè)說(shuō)法作了,結(jié)果是 系統(tǒng)宕機(jī);
沒(méi)辦法,我有想了個(gè)辦法:
發(fā)現(xiàn)REDHAT8的/PROC/KCORE對(duì)應(yīng)系統(tǒng)內(nèi)存;
好大啊(512M字節(jié)的文件),
我的計(jì)算機(jī)的內(nèi)存是512M的條子,看來(lái)是對(duì)應(yīng)了;
執(zhí)行復(fù)制命令cp /proc/kcore /root/kcore.x
然后搜索, 找到了多個(gè)FF/14/85;
只有一個(gè)是我要的真正的CALL *SYS_CALL_TABLE;
它的特征是:
3D/00/01/00/00 (比較系統(tǒng)調(diào)用號(hào)(256));
0F/83/XX/XX/XX/XX (如果大于等于,就跳轉(zhuǎn));
FF/14/85/ZZ/ZZ/ZZ/ZZ/ (不然,CALL(系統(tǒng)調(diào)用表+調(diào)用號(hào)));
89/44/24/XX/ (保存返回的數(shù)值);
90 (nop了,空指令)
這個(gè)(ZZ/ZZ/ZZ/ZZ)就是SYS_CALL_TABLE的地址了!!
在內(nèi)核里面也許不能使用READ函數(shù);
沒(méi)關(guān)系,我寫(xiě)個(gè)用戶(hù)端的搜索程序(root權(quán)限下執(zhí)行);
得到SYS_CALL_TABLE的地址以后,
INSMOD MYHACK ZZ/ZZ/ZZ/ZZ;
把地址用參數(shù)傳入模塊,INIT_MODULE()
讀取這個(gè)參數(shù),硬性設(shè)置SYS_CALL_TABLE;
替換原來(lái)的系統(tǒng)函數(shù),從而實(shí)現(xiàn)系統(tǒng)調(diào)用的攔截!!
這個(gè)辦法不適合于"黑"別人的系統(tǒng),
這是我為了編寫(xiě)VOD歌庫(kù)加密的,
它攔截系統(tǒng)的文件讀寫(xiě)操作,
把數(shù)據(jù)解密后再返回給用戶(hù);
這樣,服務(wù)器上面的加密的歌曲文件,
讀入到客房計(jì)算機(jī)的VOD以后,就是解密的;
8471解壓卡的LINUX驅(qū)動(dòng),就被蒙蔽了; |
|