浅析三线程程序开发思路与实现
2010-05-12 20:35:44 来源:WEB开发网2.本地辅助监视线程:watch
RegOpenKeyEx(HKEY_LOCAL_MACHINE,rgspath,0,KEY_QUERY_VALUE,&hkey);
//以查询方式打开注册表的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run;
RegQueryValueEx(hkey,_T("T-mouse"),NULL,NULL,(LPBYTE)lpdata,&dwbuflen);
//查询是否存在T-mouse的键值;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,rgspath,0,KEY_WRITE,&hkey);
//如果没有相关键值,就以写方式再次打开注册表;
RegSetValueEx(hkey,_T("T-mouse"),NULL,type,(const byte *)wtname,dwbuflen);
//写入我们想要的东西,系统每次启动都会运行我们的可执行文件;
GetExitCodeThread(wethread,&exitcode);
//获得远程线程的运行情况,看是否为STILL_ACTIVE,如果不是则创建远程线程;
3.远程线程:remote
tOpenProcess(PROCESS_ALL_ACCESS,FALSE,erp->rpmousepid);
//以所有可能的访问方式打开主进程,以便监视主进程的运行情况;
tWaitForSingleObject(erp->rpprocesshandle,INFINITE);
//等待直到主进程结束;
tWinExec(erp->rpwinexecname, 0);
//重新启动我们的可执行文件;
4.获得进程ID:processtopid
EnumProcesses(lpidprocesses,sizeof(lpidprocesses),&cbneeded);
//列举所有的进程
OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,lpidprocesses[i]);
//以查询信息和读取的方式打开进程
EnumProcessModules(hprocess,&hmodule,sizeof(hmodule),&cbneeded);
//获得进程模块的句柄
GetModuleBaseName(hprocess,hmodule,normalname,sizeof(normalname));
//获得特定模块的名字,以备比较
5.创建远程线程:createremote
OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,remotepid);
//PROCESS_CREATE_THREAD for CreateRemoteThread
//PROCESS_VM_OPERATION for VirtualAllocEx
//PROCESS_VM_WRITE for WriteProcessMemory
VirtualAllocEx(rphandle,NULL,cb,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
//在远程进程中分配空间,以备将线程代码置入其中;
WriteProcessMemory(rphandle,remotethr,(LPVOID)remote,cb,NULL);
//将远程线程remote的代码写入到远程进程的地址空间中
WriteProcessMemory(rphandle,remotepar,(LPVOID)&rp,cb,NULL);
//将远程线程所需的参数也写入到远程进程的地址空间中
CreateRemoteThread(rphandle,NULL,0,(LPTHREAD_START_ROUTINE)remotethr,(LPVOID)remotepar,0,NULL);
//创建远程监视线程
四、小结与后记
我们已经看到,创建三线程就是为了更好的保护程序自身不被关闭和删除。两个辅助线程相互实时监视,如果监视对象被关闭了,就重新创建线程或进程。其实,在程序中我们选择的远程进程驻体为Explorer.exe和Taskmgr.exe。在通常情况下,如果用户知道了远程线程的驻体为资源管理器后,就会打开任务管理器来结束Explorer,这时我们再把远程线程驻入到任务管理器中。也就是说,只要Explorer或Taskmgr有一个存在,就不可能结束主进程。如果有其他Kill进程的工具,你就可以将其关闭掉,只要资源管理器和任务管理器均不存在时,就没有驻体来维持远程进程。不过,如果我们选择的远程进程为随机的,这就不容易发现了;如果我们选择的远程进程为系统文件(如smss.exe会话管理器),那么你是不会安全的结束远程线程,除非系统崩溃。
如何不用其他的工具将其关闭并删除呢?你也可以进入到DOS或Safe模式下,将系统目录下的可执行文件删除,然后重启系统。这时,就不会自动运行程序了,然后将注册表里RUN键下的相关键值,系统目录下的备份文件及首次运行的可执行文件删除就彻底清楚了。在调试程序时,为了对远程线程的运行情况有所了解,我们使用了工具Dbgview.exe。
本文配套源码
更多精彩
赞助商链接