|
e=(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]
|