用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心编程技巧计算机理论

Windows NT/2000系统下进程的隐藏

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-10 12:07:34
--------------------
__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_THREADPROCESS_VM
             _OPERATIONPROCESS_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] [2] [3]

上一页  [1] [2] 

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:25,500.00000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号