剑庭安
首页
黑客安全首页全部安全栏目 黑客技术黑客技术、渗透测试、漏洞利用工具与教程 安全软件安全工具、扫描器、检测与审计软件 病毒分析恶意软件分析、样本、逆向与沙箱 CTF思路CTF 题目、writeup、解题思路与工具 防护思路防御技术、加固、检测响应与蓝队 红蓝攻防红队攻击模拟、蓝队对抗、攻防演练 漏洞知识库漏洞、CVE、PoC、EXP 与安全研究
逆向|反编译
PHP源码PHP 网站源码、程序、系统 APP源码安卓/iOS APP 源码 ASP源码ASP 网站源码与程序 NET源码.NET 网站源码与系统 小程序源码微信/支付宝小程序源码 Dedecms风格模板Dedecms 织梦风格模板 Empirecms风格模板EmpireCMS 帝国风格模板 Discuz商业模板/插件Discuz 商业模板与插件 WordPress主题/插件WordPress 主题与插件 其它源码、模板其它各类源码与模板 游戏源码游戏源码与引擎项目 加密货币源码加密货币、区块链、钱包、USDT/比特币相关源码与工具 手游源码手机游戏源码、服务端、客户端与引擎项目 传奇源码热血传奇、传奇世界、复古传奇等客户端/服务端/引擎源码 页游源码网页游戏、H5 游戏、浏览器游戏源码 端游源码电脑单机游戏、PC 网游客户端/服务端源码
最新万能免驱动支持所有型号打印机下载程序 日历天气老黄历 · 每天同步真实日期与天气
站长工具站长工具 自助开通会员浏览该分类 其他资源qtziy SEO工具SEO工具 站群源码站群源码 泛程序泛程序 蜘蛛模板蜘蛛模板 蜘蛛池蜘蛛池 外链工具外链工具
搜索 自助开通会员🔓 破甲 API
登录 注册
首页 分类列表 防护思路 hello-rootkit - An LKM-based…
hello-rootkit - An LKM-based Linux kernel security research protot 防护思路 点击放大
作者:admin 发布:2026-10-06

hello-rootkit - An LKM-based Linux kernel security research protot

项目说明hello-rootkit功能[x] 模块隐藏[x] 提权[x] 文件隐藏[x] 进程隐藏[x] 端口隐藏开发说明开发环境rootkit与内核版本是强相关的,只可以在固定的内核上运行。内核版本号可以通过uname -r查看,如果内核版本号低,可以使用apt的包进行升级,如果过高可以自行搜索k…
资源可下载 免费下载 0 条讨论
会员资源
开通会员后即可下载全部资源。
登录后开通会员
会员方案
506浏览量
0讨论
2下载链接
可下载资源状态
内容可验证
更新 2026-10-06
人工审核发布
评论区答疑

hello-rootkit - An LKM-based Linux kernel security research protot

hello-rootkit - An LKM-based Linux kernel security research protot

项目说明

hello-rootkit

功能

  • [x] 模块隐藏

  • [x] 提权

  • [x] 文件隐藏

  • [x] 进程隐藏

  • [x] 端口隐藏
  • 开发说明

    开发环境


    rootkit与内核版本是强相关的,只可以在固定的内核上运行。内核版本号可以通过uname -r查看,如果内核版本号低,可以使用apt的包进行升级,如果过高可以自行搜索kernel downgrade的方法

  • 内核版本:5.4.0-126-generic

  • 开发工具:建议 + ssh remote 到虚拟机,并使用虚拟机快照,当rootkit将环境搞崩之后可以快速恢复
  • 运行rootkit


  • git clone仓库到本地

  • cd到项目根目录,运行make,生成目标文件

  • 执行make install安装模块
  • 具体细节参见项目Makefile的编写

    技术文档

    o

    rootkit是一种恶意软件,攻击者可以在获得 root 或管理员权限后安装它,从而隐藏入侵并保持root权限访问。rootkit可以是用户级的,也可以是内核级的。关于rootkit的详细介绍可以参考

    有许多技术可以实现rootkit,本项目使用的是通过编写LKM(Linux kernel module)并hook系统调用表的方式。这种方式具有诸多优点,比如,rootkit作为内核模块可以动态的加载和卸载。大多数rootkit也都是通过LKM的方式实现的

    LKM

    一个简单的LKM示例

    在完成了对应Makefile的编写之后,使用make命令可以编译出ko文件(kernel object),使用insmod rootkit.ko命令可以安装内核模块,使用rmmod rootkit可以卸载rootkit模块,使用dmesg命令可以打印程序中printk的信息

    hook系统调用

    用户进程通过系统调用使用内核服务。系统调用会进入内核,让内核执行服务然后返回,关于系统调用的更多信息,可以使用man -k syscall获取。如下图所示,hook可以劫持正常的系统调用,让内核执行我们自行设计的函数,从而实现我们自己想要的功能

    !hook

    比如,当用户使用ls命令列出该目录下所有文件的时候,本质上是使用了getdents64系统调用,如果我们将getdents64的地址替换为我们自己构造的函数hook_getdents64 ,即可劫持系统调用流程。因此,只要我们分析清楚了某一个shell命令底层所执行的系统调用,并成功对其进行hook,那么就可以成功实现rootkit的种种目的

    strace 命令可以对系统调用进行跟踪,这可以帮助我们分析命令的函数调用链

    回到hook系统调用这个事情上来,内核中有一张系统调用表,存放了所有的系统调用的地址,我们需要找到这张表的地址,才能对系统调用“偷梁换柱”——将原本的syscall的地址替换为我们自己实现的syscall地址。也可以将系统调用表看做是一个数组,系统调用号为其索引,不同的系统调用号对应着不同的系统调用。需要小心的是,相同的系统调用函数,对于不同的架构,调用号是不同的。这个页面列出了 Linux 支持的架构的所有系统调用

    查找系统调用表的地址有很多方法,比如:

  • 使用kallsyms

  • 使用ftrace

  • 暴力枚举
  • 注意,由于rootkit与系统内核版本是强相关的,所以对于不同的内核,查找系统调用表的方式也不同,比如有的版本的内核无法使用kallsyms得到系统调用表地址,那么就可以考虑使用ftrace

    使用kallsyms:

    使用ftrace:

    在某些内核版本中,/proc/kallsyms文件存储了系统调用和系统调用的地址信息,我们可以使用命令行获取:

    同样的,对于不同的内核,系统调用函数的声明不同,这是一个对比:

    asmlinkage是一个宏,告诉编译器在 CPU 堆栈上查找函数参数,而不是寄存器。众所周知,用户态程序调用syscall的时候,会下陷到内核态,此时会保存 CPU 堆栈中的所有寄存器(eax、ebx、ecx 等)。因此,从用户空间传递到内核空间的有关参数的信息都被保存在堆栈中,这也即是使用asmlinkage的原因

    对于新的系统调用,存储在寄存器中的参数会先被复制到pt_regs结构体中,因此当我们编写hook函数的时候,需要先从这个结构体中获取对应的参数值

    此外由于内核空间和用户空间是隔离的,地址的映射并不互通,因此需要使用copy_to_user和copy_from_user进行数据的传输

    提权

  • cred是一个记录进程credentials信息的结构体,具体定义在cred.c头文件中
  • prepare_creds()返回当前进程的cred结构

  • commit_creds()将这个cred应用于当前进程,因此我们只需要对cred结构体进行修改即可实现提权
  • hook kill实现提权,当我们在shell中输入kill -64 \<num\>的时候会将shell提权到root,可以使用id命令验证这一点

    模块隐藏

    lsmod命令可以列出已安装的内核模块,rmmod可以删除。模块隐藏也即是让lsmod命令无法输出我们的模块

    内核使用module结构体存储模块信息,可以看到module封装了list双向链表,下面的源码可以在module.h中找到

    为了隐藏模块,我们只需把对应rootkit模块的list从全局链表中删除即可。内核已经替我们实现了list_del和list_add函数,它们被封装在list.h头文件中,我们调用即可。在下面的代码中,THIS_MODULE宏指向当前模块的module struct

    值得注意的是,为了恢复节点,我们需要临时保存节点的信息

    文件隐藏

    ls命令可以打印出文件,为了深入研究ls做了什么,可以使用strace命令进行追踪。strace具有许多有趣的选项,比如-c可以打印出统计表格, -p可以追踪某一进程,等等

    一通分析后可以发现ls命令调用了getdents64 syscall(实际上有些较新的内核版本仍然会调用getdents函数而不是较新的getdents64,这个后面还会提到),该函数可以得到目录的entry,并返回读取的字节数。我们可以通过对该函数进行hook从而达到隐藏文件的目的

    下面是hook_getdents64函数的设计,省略了一些报错处理和别的细节

    为了设计出上面的代码我们需要详细理解linux_dirent结构体和linux_dirent64结构体,它们分别对应getdents函数和getdents64函数,后者是为了处理更大的文件系统和偏移而设计的,细节如下:

    对于getdents函数的hook,与getdents64函数的hook有一些不同,这里暂且略去

    进程隐藏

    linux内核维护了task_struct和pid两个链表,分布记录了进程的task_struct结构和pid结构

    想要查看当前是否有rootkit进程有两个常规操作:

  • 遍历task_struct链表

  • 遍历/proc/pid中所有进程
  • 要想隐藏进程,就要考虑将rootkit相关的task struct和pid都摘除列表,即要从下面两点出发:

  • 脱离 task_struct 链表
  • 脱离 pid 链表
  • 那么首先看下linux中使用的相关的结构

    相关的函数

    自定义的数据结构

    使用的函数

    大致的流程:

  • 根据pid用find_vpid()找到对应的pid结构体
  • 成功找到pid结构体后利用pid_task()找到对应的task struct
  • 利用链表操作函数hlist_del_rcu对task struct 结点进行脱链,并用INIT_HLIST_NODE设置task struct 的前后指针
  • 然后根据task struct 找到对应的pid 的结点,利用hlist_del_rcu进行脱链,INIT_HLIST_NODE设置其指针为空,并将pprev指向自身。
  • 此时进程已经成功摘除链表被隐藏,但是需要记录对应结构,方便之后恢复

  • 用kmalloc申请一个hide_node类型结点的空间,设置对应的pid号和task struct指针,并通过list_head将其增加到hide_list_header 链表上进行记录
  • 到此完成隐藏进程功能,并未后面恢复做准备

  • 通过list_for_each_entry_safe来遍历hide_list_header链表,直到找到和pid对应的hide_node的进程。然后利用hlist_add_head_rcu将pid链入对应的pid链表,利用list_add_tail_rcu将task链入对应的task struct链表
  • 这里同样通过list_for_each_entry_safe来遍历hide_list_header链表

  • 针对其中的每一个隐藏的进程,利用hlist_add_head_rcu将pid链入对应的pid链表,利用list_add_tail_rcu将task链入对应的task struct链表
  • 端口隐藏

    >端口隐藏即隐藏已经被使用的端口,在linux中查看已经使用的端口有两个命令,一个是netstat,一个是ss,两个命令调用的系统调用不同,因此实际隐藏的过程也不同

  • netstat在读取端口信息时会读取以下四个文件(对应的网络协议为tcp、udp、tcp6、udp6):/proc/net/tcp、/proc/net/udp、/proc/net/tcp6/、/proc/net/udp6

  • 这几个文件都是序列文件,即seq_file,seq_file定义的结构体如下
  • seq_operations定义的结构体为

    seq_operations的show函数即为netstat要输出的信息,我们只需要将该函数的 hook掉,在hook之前需要先保存show函数的地址,对应的函数为set_seq_opeartions

    我们在全局变量中声明了一个链表,变量名为hidden_port_list_head,它的作用为存储需要被隐藏的端口的信息,当想隐藏端口时,调用hide_connect函数,它的定义为

    其中type为网络类型(tcp/udp/tcp6/udp6),port为端口号,该函数会将需要隐藏的端口添加到链表上。

    当不想隐藏该端口时,使用hide_unconnect函数将该节点从链表中删除

    隐藏端口的链表会在我们定义的hook函数中用到

    首先要让定义的hook函数的参数与需要被hook的函数参数相同

    hook函数首先判断网络类型,之后调用原show函数,如下

    show函数会将需要展示的端口信息放在seq->buf中,而seq->count记录了buf的缓冲区长度,代码的逻辑为判断新增的缓冲区的字符串是否和想要的隐藏的端口信息相同,如下

    功能测试

    模块编译、安装、卸载:

    提权:

    ![]()

    模块隐藏与恢复

    ![]()

    进程隐藏与恢复

    ![]()

    文件隐藏与恢复

    ![]()

    端口隐藏与恢复

    ![]()

    参考资料

  • (nearly) Complete Linux Loadable Kernel Modules

  • awesome-linux-rootkits

  • 简易 Linux rootkit 编写入门指北

  • Reptile

  • Sample rootkit for Linux

  • 【rootkit 系列研究】rootkit 检测技术发展现状








  • 项目信息

    开发语言:C

    Star 数:119

    技术要点

    该项目属于防护思路方向的开源资源,代码结构清晰,适合安全研究人员学习参考。项目围绕An LKM-based Linux kernel security research prototype for studying rootkit behavior and defensive detection techniques.展开,提供了可运行的实现,对理解相关安全机制、工具原理与攻防技术具有较高的研究价值。

    从技术实现角度看,此类项目的核心在于对底层原理的深入理解与工程化落地。开发者在研究过程中可以结合官方文档与社区讨论,梳理项目的初始化流程、核心模块职责与数据流转,逐步掌握其中的技术细节与设计思路。

    使用与学习建议

    1. 下载源码压缩包,解压到本地环境。

    2. 根据项目类型准备对应的运行环境与依赖。

    3. 按照 README 中的步骤完成配置与部署。

    4. 在隔离的测试环境中运行验证,避免影响生产系统。

    免责声明

    本资源来源于开源社区,仅供安全研究、技术学习与合法授权范围内的攻防演练使用,请勿用于任何非法或侵害他人权益的用途。使用本项目产生的一切后果由使用者自行承担。

    资源标题hello-rootkit - An LKM-based Linux kernel security research protot
    所属分类防护思路
    发布作者admin
    发布时间2026-10-06 00:08:43
    下载权限 免费下载
    附件数量2 个下载链接
    浏览次数506
    讨论数量0
    主题状态正常讨论中

    本资源免费,登录后即可在本页「下载链接」区域获取全部附件。

    请在评论区留言说明具体链接,或联系作者补档。楼主更新后本页会同步最新的下载地址。

    请先阅读正文中的授权说明;未注明的默认仅限站内学习交流,禁止直接搬运到其他站点二次售卖。
    还没有讨论,快来抢沙发~
    登录 后才能参与讨论
    下载链接
    会员才能下载
    登录后开通会员
    同分类推荐
    暂无同类资源
    免费登录即可下载
    查看会员
    放大预览

    © 2026 剑庭安 - 网站开发定制 SEO 优化蜘蛛池代做 在线看手相算命. 保留所有权利。

    Powered by 酷像SEOv3.0

    网站地图 Sitemap.xml
    首页 全部分类 黑客安全 逆向|反编译 精品源码 站长工具自助开通会员其他资源SEO工具站群源码泛程序蜘蛛模板蜘蛛池外链工具创意乐园 搜索 会员服务 登录 注册