科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道关于Linux内核级后门的原理和简单实战 (4)

关于Linux内核级后门的原理和简单实战 (4)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

一定要注意的是我们的lkm讲要被运行在内核状态,我们就不能用libc包装的函数了, 但是我们可以通过前面所讨论的_syscallX()宏来构建系统调用。

作者:sixth 来源:linux8 2007年11月4日

关键字: 实战 原理 内核 Linux

  • 评论
  • 分享微博
  • 分享邮件
 

这里有一个经典的lkm代码结构:


#define MODULE
#define __KERNEL__
#define __KERNE_SYSCALLS__
#include
#ifdef MODULE
#include
#include
#else
#define MOD_INC_USE_COUNT
#define MOD_DEC_USE_COUNT
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int errno;
char tmp[64];
/* 假如,我们要用到ioctl调用 */
_syscall3(int, ioctl, int, d, int, request, unsigned long, arg);
int myfunction(int parm1,char *parm2)
{
   int i,j,k;
   /* ... */
}
int init_module(void)
{
   /* ... */
   printk("\nModule loaded.\n");
   return 0;
}
void cleanup_module(void)
{
   /* ... */
}
检查代码中的 #defines (#define MODULE, #define __KERNEL__)和
#includes (#include ...)

一定要注意的是我们的lkm讲要被运行在内核状态,我们就不能用libc包装的函数了, 但是我们可以通过前面所讨论的_syscallX()宏来构建系统调用。

你可以这样编译你的模块'gcc -c -O3 module.c' 并且利用'insmod module.o'来加载。

提一个建议, lkm也可以用来在不完全重建核心代码的情况下来修改内核代码。举个例子, 你可以修改write系统调用让它隐藏一部分给定的文件,就象我们把我们的backdoors放到一个非常好的地方:当你无法再信任你的系统内核的时候会怎么样呢?

* 内核和系统调用后门

在简单介绍了上述理论,我们主要可以用来做什么呢。我们可以利于lkm截获一些对我们有影响的系统调用, 这样可以强制内核按照我们的方式运行。例如:我们可以利用ioctl系统调用来隐藏sniffer所造成的网卡PROMISC模式的显示。非常有效。

去改变一个给定的系统调用,只需要在你的lkm程序中增加一个定义extern void *sys_call_table[],并且利用init_module()函数来改变sys_call_table里的入口来指向我们自己的代码。改变后的调用可以做我们希望它做的一切事情, 利用改变sys_call_table来导出更多的原系统调用,并且。。。。


译者后话:这篇文章相对比较浅显易懂,所以可以作为大家入门lkm编程来用,它着重讲述了linux系统调用system call的原理,以及我们如何通过lkm来截获它并换成我们想要的代码来建立后门程序。再次强调本文的依据是linux内核版本2.0.x,大家在自己系统实现时请对比内核代码来做改变。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章