WEB开发网
开发学院软件开发VC 浅析三线程程序开发思路与实现 阅读

浅析三线程程序开发思路与实现

 2010-05-12 20:35:44 来源:WEB开发网   
核心提示:2.本地辅助监视线程:watchRegOpenKeyEx(HKEY_LOCAL_MACHINE,rgspath,0,KEY_QUERY_VALUE,&hkey);//以查询方式打开注册表的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run;R

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。

本文配套源码

上一页  1 2 

Tags:浅析 线程 程序开发

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接