zoukankan      html  css  js  c++  java
  • 工具函数(代码块的大小,代码块起始地址,提升进程权限)

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

    [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 ");  
      11.         return 1;  
      12.     }  
      13.     if(!LookupPrivilegeValueA(NULL,name,&luid))  
      14.     {  
      15.         printf("LookupPrivilege error! ");  
      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! ");  
      24.         return 1;  
      25.     }  
      26.     return 0;  
      27. }  

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

  • 相关阅读:
    关于近期
    Tips on Importons and Irradiance Particles in mental ray
    给她的歌
    Fatal In Code Generation Of Visual C++
    kdtree vs octree
    疯子的胜利——记6.18毕业晚会
    转凉
    事件与委托的匿名方法使用方法示例
    VS2008使用技巧
    硬链接和软连接的区别
  • 原文地址:https://www.cnblogs.com/findumars/p/5636499.html
Copyright © 2011-2022 走看看