#include <stdio.h> #include <Windows.h> #include <ImageHlp.h>
#pragma comment(lib,"Imagehlp.lib")
HANDLE OpenPeFile(LPTSTR FileName) { HANDLE hFile, hMapFile, lpMapAddress = NULL; DWORD dwFileSize = 0;
hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) return 0;
dwFileSize = GetFileSize(hFile, NULL);
hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, dwFileSize, NULL); if (hMapFile == NULL) return 0;
lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, dwFileSize); if (lpMapAddress != NULL) return lpMapAddress; return 0; }
BOOL IsPeFile(HANDLE ImageBase, BOOL Is64 = FALSE) { PIMAGE_DOS_HEADER pDosHead = NULL; if (ImageBase == NULL) return FALSE;
pDosHead = (PIMAGE_DOS_HEADER)ImageBase; if (IMAGE_DOS_SIGNATURE != pDosHead->e_magic) return FALSE;
if (Is64 == TRUE) { PIMAGE_NT_HEADERS64 pNtHead64 = NULL; pNtHead64 = (PIMAGE_NT_HEADERS64)((DWORD64)pDosHead + pDosHead->e_lfanew); if (pNtHead64->Signature != IMAGE_NT_SIGNATURE) return FALSE; } else if (Is64 == FALSE) { PIMAGE_NT_HEADERS pNtHead32 = NULL; pNtHead32 = (PIMAGE_NT_HEADERS)((DWORD)pDosHead + pDosHead->e_lfanew); if (pNtHead32->Signature != IMAGE_NT_SIGNATURE) return FALSE; } return TRUE; }
void GetPeSignature(LPCWSTR FilePath) { typedef struct _SIGN { char FileName[64]; LONG FileOffset; BYTE VirusSign[32 + 1]; }SIGN, *pSIGN;
SIGN Sign[2] = { { "Microsoft Visual C/C++ x86 (2013)", 0x8a0, "\x55\x8B\xEC\x81\xEC\xC4\x00\x00\x00\x53\x56\x57\x8D\xBD\x3C\xFF" \ "\xFF\xFF\xB9\x31\x00\x00\x00\xB8\xCC\xCC\xCC\xCC\xF3\xAB\x8B\x45" \ }, { "Microsoft Visual C/C++ x64 (2013)", 0x400, "\xCC\xCC\xCC\xCC\xCC\xE9\x86\x02\x00\x00\xE9\x31\x05\x00\x00\xE9" \ "\x6C\x01\x00\x00\xE9\x57\x03\x00\x00\xE9\x22\x00\x00\x00\xCC\xCC" \ } };
DWORD dwNum = 0; BYTE buffer[32 + 1]; HANDLE hFile = NULL;
hFile = CreateFile(FilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
for (int x = 0; x <= 2; x++) { SetFilePointer(hFile, Sign[x].FileOffset, NULL, FILE_BEGIN); ReadFile(hFile, buffer, sizeof(buffer), &dwNum, NULL); if (memcmp(Sign[x].VirusSign, buffer, 32) == 0) { printf("检测结果: %s \n", Sign[x].FileName); } } CloseHandle(hFile); }
int main(int argc, char * argv[]) { GetPeSignature(L"c://lyshark.exe"); system("pause"); return 0; }
|