<b>WinNT及Win2K下实现进程的完好躲藏</b>[VC/C++编程]
本文“<b>WinNT及Win2K下实现进程的完好躲藏</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
面对众多的计算机高手,考虑好久,终于还是决意出来献丑一下,文章内尽大概利用最简便易懂的词汇及例子来介绍,但愿可以对一些初学与进阶者有所帮忙.
关于进程的躲藏,98下的例子不可胜数.WinNT/Win2K下的躲藏办法,西祠的高手shotgun在去年的6月就已经在网上公布出实例《揭开木马的奥秘面纱<四>》 ,我也多次拜读他的文章,对他的计算机水平及热情帮忙朋友的作风非常敬佩.这里也可算是对shotgun的文章的增补与深化介绍吧,好了,闲话少说.
在WinNT下"真正躲藏进程"这一说法,可以讲是根本不大概实现,只要我们的程序是以进程内核的情势运行,都是不大概逃离CTRL+ALT+DEL的法眼.那么奇特了,这岂不是与我们的标题《WinNT & Win2K下实现进程的完好躲藏》相冲突吗?是的,实际上应当是:以非进程方法履行目标代码,而躲避进程查看器的查抄,从而到达"进程躲藏"的目的.
我们这里用的,是在宿主进程中,以线程的方法履行我们的代码.实现起来非常简单.首先,我们先成立一个不履行任何语句的线程
DWORD stdcall ThreadProc(LPVOID *lpVoid){
return 0;
}
然后,将线程代码拷备至宿主进程所可以履行的任何地方(即页面属性为PAGGE_EXECUTE_READWRITE),如:同享内存影射区、宿主进程内.这里我们挑选宿主进程,拷备的时侯,我们需求先在宿主进程中利用VirtualAllocEx函数申请一段内存,然后再利用WriteProcessMemory将线程体写入宿主进程中.
以上工作完成后,我们便可CreateRemoteThread函数激活其履行.下面给出一个完好的例子
//远程线程履行体
DWORD __stdcall ThreadProc (void *lpPara){
return 0;
}
int main(int argc, char* argv[]){
const DWORD THREADSIZE=1024*4;//暂定线程体大小为4K,实际上没这么大,稍后我将会介绍
DWORD byte_write;
//得到指定进程ID句柄,并设其权限为PROCESS_ALL_ACCESS,992是宿进程的ID号,获得ID号的办法这里我就不多讲了
HANDLE hWnd = ::OpenProcess (PROCESS_ALL_ACCESS,FALSE,992);
if(!hWnd)return 0;
void *pRemoteThread =::VirtualAllocEx(hWnd,0,THREADSIZE,MEM_COMMIT| MEM_RESERVE,PAGE_EXECUTE_READWRITE);//申请
if(!pRemoteThread)return 0;
if(!::WriteProcessMemory(hWnd,pRemoteThread,&ThreadProc,THREADSIZE,0))//写入进程
return 0;
//启动线程
HANDLE hThread = ::CreateRemoteThread (hWnd ,0,0,(DWORD (__stdcall *)(void *))pRemoteThread ,NULL,0,&byte_write);
if(!hThread){ //还有内存分配未释放
return 0;
}
return 0;
}
以上是“<b>WinNT及Win2K下实现进程的完好躲藏</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |