一些在编程中经常要用到的功能编写成函数,方便使用.
#include <windows.h>
//系统类型
typedef enum SystemType
{
WINDOWS_2000 = 1, //5.0
WINDOWS_XP, //5.1
WINDOWS__SERVER_2003, //5.2
WINDOWS__SERVER_2003_R2, //5.2
WINDOWS_VISTA, //6.0
WINDOWS__SERVER_2008, //6.0
WINDOWS__SERVER_2008_R2, //6.1
WINDOWS_7, //6.1
WINDOWS_SERVER_2012,//6.2
WINDOWS_8//6.2
}ST;
/*******获取系统类型*******/
ST GetSystemType()
{
OSVERSIONINFO osvi;
ST st;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
if (osvi.dwMajorVersion==5)
{
if (osvi.dwMinorVersion==0)
{
st = WINDOWS_2000; //5.0
}
else if (osvi.dwMinorVersion==1)
{
st = WINDOWS_XP; //5.1
}
else if (osvi.dwMinorVersion==2)
{
st = WINDOWS__SERVER_2003; //5.2
}
}
else if(osvi.dwMajorVersion==6)
{
if (osvi.dwMinorVersion==0)
{
st = WINDOWS_VISTA; //6.0
}
else if (osvi.dwMinorVersion==1)
{
st = WINDOWS_7; //6.1
}
else if (osvi.dwMinorVersion==2)
{
st = WINDOWS_8; //6.2
}
}
return st;
}
/*找到代码块的大小*/
DWORD GetCodeSize(HANDLE hModule)
{
if (!hModule) return 0;
unsigned int nSize = 0;
unsigned int v1;
DWORD result;
DWORD p = (DWORD)hModule;
if ( *(WORD *)p == 0x5A4D && (v1 = p + *(DWORD *)(p + 0x3c), *(WORD *)v1 == 0x4550) )
result = *(DWORD *)(v1 + 0x1c);
else
result = 0;
return result;
}
/*找到代码块起始地址*/
DWORD GetCodeStart(HANDLE hModule)
{
if (!hModule) return 0;
unsigned int nSize = 0;
unsigned int v1;
DWORD result;
DWORD p = (DWORD)hModule;
if ( *(WORD *)p == 0x5A4D && (v1 = p + *(DWORD *)(p + 0x3c), *(WORD *)v1 == 0x4550) )
result = *(DWORD *)(v1 + 0x2c);
else
result = 0;
return (DWORD)hModule + result;
}
/*搜索代码特征,找到挂钩地址*/
BYTE* SearchOpcode(BYTE* pOpcodeBytes, unsigned int nOpcodeLen, const char* pLibName)
{
BYTE * pCode = pOpcodeBytes;
int nCodeLen = nOpcodeLen;
HANDLE hModule;
hModule = GetModuleHandleA(pLibName);
DWORD dwCodeSize = GetCodeSize(hModule);
DWORD dwCodeStart = GetCodeStart(hModule);
for (DWORD i = 0; i<dwCodeSize; i++)
{
BYTE* p = (BYTE*)dwCodeStart+i;
int j;
for (j=0; j<nCodeLen; j++)
{
if (*(p+j)==pCode[j])
continue;
else
break;
}
if (j==nCodeLen)
return p;
else
continue;
}
return NULL;
}
BOOL Is64Bit_OS()
{
BOOL bRetVal = FALSE;
IsWow64Process(NULL, &bRetVal);
return bRetVal;
}
单字节转多字节:
BOOL ThreadCheckFileTrust(CHAR* lpfileName)
{
if (lpFileName == NULL)
{
return TRUE;
}
HCATADMIN hCatAdmin = NULL;
DWORD dwNum = MultiByteToWideChar(CP_ACP,0,lpFileName,-1,NULL,0);
wchar_t* pcwszFile = new wchar_t[dwNum];
if (!pcwszFile)
{
return FALSE;
}
MultiByteToWideChar(CP_ACP,0,lpFileName,-1,pcwszFile,dwNum);
BOOL bRet = ThreadCheckFileTrustW(pcwszFile);
delete pcwszFile;
return bRet;
}
根据进程名称枚举进程:
static DWORD GetProcessID(wchar_t *ProcessName) //获得进程PID
{
PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(pe32);
//获得系统内所有进程快照
HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
OutputDebugStringA("CreateToolhelp32Snapshot error");
return 0;
}
//枚举列表中的第一个进程
BOOL bProcess=Process32First(hProcessSnap,&pe32);
while(bProcess)
{
//比较找到的进程名和我们要查找的进程名,一样则返回进程id
if(wcscmp(wcsupr(pe32.szExeFile),wcsupr(ProcessName))==0)
return pe32.th32ProcessID;
//继续查找
bProcess=Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
return 0;
}
提升进程权限:
static int EnableDebugPriv(const char * name) //提升进程为DEBUG权限--"SeDebugPrivilege"
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
if(!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
&hToken) )
{
printf("OpenProcessToken error\n");
return 1;
}
if(!LookupPrivilegeValueA(NULL,name,&luid))
{
printf("LookupPrivilege error!\n");
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid = luid;
if(!AdjustTokenPrivileges(hToken,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL) )
{
printf("AdjustTokenPrivileges error!\n");
return 1;
}
return 0;
}