工具函数(代码块的大小,代码块起始地址,提升进程权限)

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工具函数(代码块的大小,代码块起始地址,提升进程权限)相关的知识,希望对你有一定的参考价值。

一些在编程中经常要用到的功能编写成函数,方便使用.

 

[cpp] view plain copy
 
  1. #include <windows.h>  
  2.   
  3. //系统类型  
  4. typedef enum SystemType  
  5. {  
  6.     WINDOWS_2000 = 1, //5.0  
  7.     WINDOWS_XP, //5.1  
  8.     WINDOWS__SERVER_2003, //5.2  
  9.     WINDOWS__SERVER_2003_R2, //5.2  
  10.     WINDOWS_VISTA, //6.0  
  11.     WINDOWS__SERVER_2008, //6.0  
  12.     WINDOWS__SERVER_2008_R2, //6.1  
  13.     WINDOWS_7, //6.1  
  14.     WINDOWS_SERVER_2012,//6.2  
  15.     WINDOWS_8//6.2  
  16. }ST;  
  17.   
  18. /*******获取系统类型*******/  
  19. ST GetSystemType()  
  20. {  
  21.     OSVERSIONINFO osvi;  
  22.     ST st;  
  23.   
  24.     ZeroMemory(&osvi, sizeof(OSVERSIONINFO));  
  25.     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);  
  26.   
  27.     GetVersionEx(&osvi);  
  28.   
  29.   
  30.     if (osvi.dwMajorVersion==5)  
  31.     {  
  32.         if (osvi.dwMinorVersion==0)  
  33.         {  
  34.             st = WINDOWS_2000; //5.0  
  35.         }  
  36.         else if (osvi.dwMinorVersion==1)  
  37.         {  
  38.             st = WINDOWS_XP; //5.1  
  39.         }  
  40.         else if (osvi.dwMinorVersion==2)  
  41.         {  
  42.             st = WINDOWS__SERVER_2003; //5.2  
  43.         }  
  44.     }   
  45.     else if(osvi.dwMajorVersion==6)  
  46.     {  
  47.         if (osvi.dwMinorVersion==0)  
  48.         {  
  49.             st = WINDOWS_VISTA; //6.0  
  50.         }  
  51.         else if (osvi.dwMinorVersion==1)  
  52.         {  
  53.             st = WINDOWS_7; //6.1  
  54.         }  
  55.         else if (osvi.dwMinorVersion==2)  
  56.         {  
  57.             st = WINDOWS_8; //6.2  
  58.         }  
  59.     }  
  60.   
  61.     return st;  
  62. }  
  63.   
  64.   
  65. /*找到代码块的大小*/  
  66. DWORD GetCodeSize(HANDLE hModule)  
  67. {  
  68.     if (!hModule) return 0;  
  69.     unsigned int nSize = 0;  
  70.     unsigned int v1;  
  71.     DWORD result;  
  72.     DWORD p = (DWORD)hModule;  
  73.     if ( *(WORD *)p == 0x5A4D && (v1 = p + *(DWORD *)(p + 0x3c), *(WORD *)v1 == 0x4550) )  
  74.         result = *(DWORD *)(v1 + 0x1c);  
  75.     else  
  76.         result = 0;  
  77.   
  78.     return result;  
  79. }  
  80.   
  81. /*找到代码块起始地址*/  
  82. DWORD GetCodeStart(HANDLE hModule)  
  83. {  
  84.     if (!hModule) return 0;  
  85.   
  86.     unsigned int nSize = 0;  
  87.     unsigned int v1;  
  88.     DWORD result;  
  89.     DWORD p = (DWORD)hModule;  
  90.     if ( *(WORD *)p == 0x5A4D && (v1 = p + *(DWORD *)(p + 0x3c), *(WORD *)v1 == 0x4550) )  
  91.         result = *(DWORD *)(v1 + 0x2c);  
  92.     else  
  93.         result = 0;  
  94.   
  95.     return (DWORD)hModule + result;  
  96. }  
  97.   
  98. /*搜索代码特征,找到挂钩地址*/  
  99. BYTE* SearchOpcode(BYTE* pOpcodeBytes, unsigned int nOpcodeLen, const char* pLibName)  
  100. {  
  101.     BYTE * pCode = pOpcodeBytes;  
  102.     int nCodeLen = nOpcodeLen;  
  103.     HANDLE hModule;  
  104.   
  105.     hModule = GetModuleHandleA(pLibName);  
  106.   
  107.     DWORD dwCodeSize = GetCodeSize(hModule);  
  108.     DWORD dwCodeStart = GetCodeStart(hModule);  
  109.     for (DWORD i = 0; i<dwCodeSize; i++)  
  110.     {  
  111.         BYTE* p = (BYTE*)dwCodeStart+i;  
  112.         int j;  
  113.         for (j=0; j<nCodeLen; j++)  
  114.         {  
  115.             if (*(p+j)==pCode[j])  
  116.                 continue;  
  117.             else  
  118.                 break;  
  119.         }  
  120.   
  121.         if (j==nCodeLen)  
  122.             return p;  
  123.         else  
  124.             continue;  
  125.     }  
  126.   
  127.     return NULL;  
  128.   
  129. }  
  130.   
  131.   
  132. BOOL Is64Bit_OS()  
  133. {  
  134.         BOOL bRetVal = FALSE;  
  135.         IsWow64Process(NULL, &bRetVal);  
  136.         return bRetVal;  
  137. }  

 

 

单字节转多字节:

[cpp] view plain copy
 
  1. BOOL ThreadCheckFileTrust(CHAR* lpfileName)  
  2. {  
  3.     if (lpFileName == NULL)  
  4.     {  
  5.         return TRUE;  
  6.     }  
  7.   
  8.     HCATADMIN hCatAdmin = NULL;  
  9.   
  10.     DWORD dwNum = MultiByteToWideChar(CP_ACP,0,lpFileName,-1,NULL,0);  
  11.     wchar_t* pcwszFile = new wchar_t[dwNum];  
  12.   
  13.     if (!pcwszFile)  
  14.     {  
  15.         return FALSE;  
  16.     }  
  17.   
  18.     MultiByteToWideChar(CP_ACP,0,lpFileName,-1,pcwszFile,dwNum);  
  19.   
  20.     BOOL bRet =  ThreadCheckFileTrustW(pcwszFile);  
  21.   
  22.     delete pcwszFile;  
  23.   
  24.     return bRet;  
  25. }  


根据进程名称枚举进程:

[cpp] view plain copy
 
  1. static DWORD GetProcessID(wchar_t *ProcessName)  //获得进程PID  
  2. {  
  3.     PROCESSENTRY32 pe32;  
  4.     pe32.dwSize=sizeof(pe32);  
  5.     //获得系统内所有进程快照  
  6.     HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  
  7.     if(hProcessSnap==INVALID_HANDLE_VALUE)  
  8.     {  
  9.         OutputDebugStringA("CreateToolhelp32Snapshot error");  
  10.         return 0;  
  11.     }  
  12.     //枚举列表中的第一个进程  
  13.     BOOL bProcess=Process32First(hProcessSnap,&pe32);  
  14.     while(bProcess)  
  15.     {  
  16.         //比较找到的进程名和我们要查找的进程名,一样则返回进程id  
  17.         if(wcscmp(wcsupr(pe32.szExeFile),wcsupr(ProcessName))==0)  
  18.             return pe32.th32ProcessID;  
  19.         //继续查找  
  20.         bProcess=Process32Next(hProcessSnap,&pe32);  
  21.     }  
  22.     CloseHandle(hProcessSnap);  
  23.     return 0;  
  24. }  


提升进程权限:

 

[cpp] view plain copy
 
    1. static int EnableDebugPriv(const char * name)  //提升进程为DEBUG权限--"SeDebugPrivilege"  
    2. {  
    3.     HANDLE hToken;  
    4.     TOKEN_PRIVILEGES tp;  
    5.     LUID luid;  
    6.     if(!OpenProcessToken(GetCurrentProcess(),  
    7.         TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,  
    8.         &hToken) )  
    9.     {  
    10.         printf("OpenProcessToken error\n");  
    11.         return 1;  
    12.     }  
    13.     if(!LookupPrivilegeValueA(NULL,name,&luid))  
    14.     {  
    15.         printf("LookupPrivilege error!\n");  
    16.     }  
    17.     tp.PrivilegeCount = 1;  
    18.     tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;  
    19.     tp.Privileges[0].Luid = luid;  
    20.   
    21.     if(!AdjustTokenPrivileges(hToken,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL) )  
    22.     {  
    23.         printf("AdjustTokenPrivileges error!\n");  
    24.         return 1;  
    25.     }  
    26.     return 0;  
    27. }  

http://blog.csdn.net/chence19871/article/details/37881101

以上是关于工具函数(代码块的大小,代码块起始地址,提升进程权限)的主要内容,如果未能解决你的问题,请参考以下文章

java基础第五天

C++ - 从结束地址获取函数的起始地址/获取函数的大小

如何获取内存管理中下一个块的地址?

Linux 多进程多线程相关概念

分块查找

8.小数据池,代码块