您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:89 来源:vckbase.com

本文章共11004字,分7页,当前第1页,快速翻页:
 

NT环境下进程隐藏的实现

作者:局部变量

下载源代码
逆风者

  在NT环境下隐藏进程,也就是说在用户不知情的条件下,执行自己的代码的方法有很多种,比如说使用注册表插入DLL,使用Windows挂钩等等。其中比较有代表性的是Jeffrey Richer在《Windows核心编程》中介绍的LoadLibrary方法和罗云彬在《windows环境下32位汇编语言程序设计》中介绍的方法。两种方法的共同特点是:都采用远程线程,让自己的代码作为宿主进程的线程在宿主进程的地址空间中执行,从而达到隐藏的目的。相比较而言,Richer的方法由于可以使用c/c 等高级语言完成,理解和实现都比较容易,但他让宿主进程使用LoadLibrary来装入新的DLL,所以难免留下蛛丝马迹,隐藏效果并不十分完美。罗云彬的方法在隐藏效果上绝对一流,不过,由于他使用的是汇编语言,实现起来比较难(起码我写不了汇编程序:))。笔者下面介绍的方法可以说是对上述两种方法的综合:采用c/c 编码,实现完全隐藏。并且,笔者的方法极大的简化了远程线程代码的编写,使其编写难度与普通程序基本一致。


基础知识

  让自己的代码作为宿主进程的线程,在宿主进程的地址空间中执行确实是个不错的主意。但是要自己把程序放到其他进程的地址空间中去运行,将面临一个严峻的问题:如何实现代码重定位。关于重定位问题,请看下面的程序:


… 

int func()//函数func的定义 

… 

int a = func();//对func的调用 

…

这段程序经过编译链接后,可能会变成下面的样子: 

… 

0x00401800: push ebp//这是函数func的入口 

0x00401801: mov ebp, esp 

… 

0x00402000: call 00401800//对函数func的调用 

0x00402005: mov dword ptr [ebp-08], eax 

… 

  请注意“0x00402000”处的直接寻址指令“call 00401800”。上面的程序在正常执行(由windows装入并执行)时,因为PE文件的文件头中含有足够的信息,所以系统能够将代码装入到合适的位置从而保证地址“00401800”处就是函数func的入口。但是当我们自己把程序装入到其他进程的地址空间中时,我们无法保证这一点,最终的结果可能会象下面这样:

… 

0x00801800: push ebp//这是函数func的入口 

0x00801801: mov ebp, esp 

… 

0x00802000: call 00401800//00401800处是什么 

0x00802005: mov dword ptr [ebp-08], eax 

… 

  显然,运行上面的代码将产生不可预料的结果(最大的可能就是执行我们费尽千辛万苦才装入的代码的线程连同宿主进程一起被系统杀死)。 不知大家注意过系统中动态链接库(dll)的装入没有:一个dll被装入不同进程时,装入的地址可能不同,所以系统在这种情况下也必须解决dll中直接寻址指令的重定位问题。原来,绝大多数dll中都包含一些由编译器插入的用于重定位的数据,这些数据就构成了重定位表。系统根据重定位表中的数据,修改dll的代码,完成重定位操作。Richer使用的LoadLibrary也是借用了这一点。所以我们的重定位方法就是:替系统来完成工作,自己根据重定位表中的数据进行重定位。既然如此,那就让我们来了解一下重定位表吧。
  先来分析一下重定位表中需要保存哪些信息。还以上面的代码为例,要让它能正确执行,就必须把指令“call 00401800”改为“call 00801800”。进行这一改动需要两个数据,第一是改哪,也就是哪个内存地址中的数据需要修改,这里是“0x00802001”(不是“0x00802000”);第二是怎么改,也就是应该给该位置的数据加上多少,这里是“0x00400000”。这第二个数据可以从dll的实际装入地址和建议装入地址计算而来,只要让前者减后者就行了。其中实际装入地址装入的时候就会知道,而建议装入地址记录在文件头的ImageBase字段中。所以,综上所述,重定位表中需要保存的信息是:有待修正的数据的地址。
 
本文章更多内容1 - 2 - 3 - 4 - 5 - 6 - 7 - 下一页>>
相关文章

如何通过Openh323开发自己的H.323协议栈
Direct3D9初级教程
仿 Windows 自带扫雷的小程序
针对Excel表格文件操作的编程实现
VC 游戏开发:五子棋
如何简单实现可执行文件的自我删除
树视控件在多文档中的使用
使用 LIBCTINY.LIB 为 EXE 和 DLL 文件 减肥
代号 WinFS:革命性的文件存储系统...
浅谈PDFlib中文输出(一)如何使用Acrobat标
实现一个能模拟简单猜扑克牌大小的 Win32 控
MFC 应用程序中的菜单提示信息
用RealPlayer控件制作的播放器
模拟退火算法求解TSP问题
使用C#制作《邮件特快专递》
如何实现三态选择树
Google搜索客户端API for C/C
MFC程序员的WTL指南: Part VII - 分隔窗口
从TTF字体中字模信息
Sybase批量操作(BCP)的设计和实现

相关评论


本文章所属分类:首页 VC++

  热门关键字: