C++PE 파일 특징 코드 인식 을 위 한 절차

8686 단어 c + +pe
PE 파일 맵 열기:
PE 구 조 를 읽 기 전에 먼저 해 야 할 일 은 PE 파일 을 메모리 로 여 는 것 입 니 다.여기 서 파일 을 열 면 CreateFile()함 수 를 사 용 했 습 니 다.이 함 수 는 파일 을 열 고 파일 핸들 을 되 돌려 줄 수 있 습 니 다.이 어 Create FileMapping()함수 로 파일 의 메모리 이미 지 를 만 들 고 나중에 MapViewOfFile()을 사용 하여 맵 의 메모 리 를 읽 고 핸들 을 되 돌려 줍 니 다.뒤의 프로그램 은 이 핸들 을 통 해 열 린 파일 을 조작 할 수 있 습 니 다.

#include <stdio.h>
#include <Windows.h>
#include <ImageHlp.h>

#pragma comment(lib,"Imagehlp.lib")

//   PE     
HANDLE OpenPeFile(LPTSTR FileName)
{
	HANDLE hFile, hMapFile, lpMapAddress = NULL;
	DWORD dwFileSize = 0;

	// CreateFile        ,       ,           
	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;
}

int main(int argc, char * argv[])
{
	HANDLE lpMapAddress = NULL;

	lpMapAddress = OpenPeFile("c://lyshark.exe");
	printf("      : %d 
", lpMapAddress); system("pause"); return 0; }
PE 파일 인지 판단 하기:
파일 이 열 렸 을 때 다음 에 파일 이 올 바른 PE 파일 인지 판단 해 야 합 니 다.여기 서 먼저 미 러 를 PIMAGE 로 변환 합 니 다.DOS_HEADER 형식 및 pDosHead->emagic 속성 PIMAGE 찾기NT_HEADERS 구 조 는 PE 파일 규범 에 부합 되 는 지 판단 하면 됩 니 다.여기 서 32 비트 PE 구조 에 사용 되 는 구조 정의 가 약간 다 르 고 코드 에서 구분 되 었 음 을 주의해 야 합 니 다.

#include <stdio.h>
#include <Windows.h>
#include <ImageHlp.h>

#pragma comment(lib,"Imagehlp.lib")

//   PE     
HANDLE OpenPeFile(LPTSTR FileName)
{
	HANDLE hFile, hMapFile, lpMapAddress = NULL;
	DWORD dwFileSize = 0;

	// CreateFile        ,       ,           
	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;
}

//      PE  
BOOL IsPeFile(HANDLE ImageBase, BOOL Is64 = FALSE)
{
	PIMAGE_DOS_HEADER pDosHead = NULL;
	if (ImageBase == NULL)
		return FALSE;

	//        DOS  ,        MZ
	pDosHead = (PIMAGE_DOS_HEADER)ImageBase;
	if (IMAGE_DOS_SIGNATURE != pDosHead->e_magic)
		return FALSE;

	if (Is64 == TRUE)
	{
		//    IMAGE_DOS_HEADER   e_lfanew      64  NT     
		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)
	{
		//    IMAGE_DOS_HEADER   e_lfanew      32  NT     
		PIMAGE_NT_HEADERS pNtHead32 = NULL;
		pNtHead32 = (PIMAGE_NT_HEADERS)((DWORD)pDosHead + pDosHead->e_lfanew);
		if (pNtHead32->Signature != IMAGE_NT_SIGNATURE)
			return FALSE;
	}
	return TRUE;
}

int main(int argc, char * argv[])
{
	HANDLE lpMapAddress = NULL;

	//       PE  
	lpMapAddress = OpenPeFile("c://lyshark.exe");

	//      PE  ,         1,    0
	BOOL ret = IsPeFile(lpMapAddress, 0);
	printf("   PE  : %d 
", ret); system("pause"); return 0; }
PE 파일 특징 코드 판단:
프로그램 이 어떤 컴 파 일 러 를 사 용 했 는 지 판단 합 니 다.일반적으로 파일 의 입구 코드 와 특징 코드 를 일치 시 켜 야 합 니 다.일반적으로 프로그램 시작 32 개의 바이트 만 일치 하면 차이 가 많 지 않 습 니 다.물론 일치 정밀도 가 높 기 위해 서 는 여러 필드 를 검증 할 수 있 습 니 다.여 기 는 대체적인 윤곽 만 쓰 십시오.

#include <stdio.h>
#include <Windows.h>
#include <ImageHlp.h>

#pragma comment(lib,"Imagehlp.lib")

//   PE     
HANDLE OpenPeFile(LPTSTR FileName)
{
	HANDLE hFile, hMapFile, lpMapAddress = NULL;
	DWORD dwFileSize = 0;

	// CreateFile        ,       ,           
	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;
}

//      PE  
BOOL IsPeFile(HANDLE ImageBase, BOOL Is64 = FALSE)
{
	PIMAGE_DOS_HEADER pDosHead = NULL;
	if (ImageBase == NULL)
		return FALSE;

	//        DOS  ,        MZ
	pDosHead = (PIMAGE_DOS_HEADER)ImageBase;
	if (IMAGE_DOS_SIGNATURE != pDosHead->e_magic)
		return FALSE;

	if (Is64 == TRUE)
	{
		//    IMAGE_DOS_HEADER   e_lfanew      64  NT     
		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)
	{
		//    IMAGE_DOS_HEADER   e_lfanew      32  NT     
		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];    //        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;

	//    FilePath          
	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 
", Sign[x].FileName); } } CloseHandle(hFile); } int main(int argc, char * argv[]) { GetPeSignature(L"c://lyshark.exe"); system("pause"); return 0; }
서로 다른 컴 파일 러 의 특징 필드 를 추출 한 다음 에 제 가 쓴 형식 에 따라 증가 해 야 합 니 다.예 를 들 어 저 는 vs 2013 으로 컴 파일 했 습 니 다.그러면 검 측 결 과 는 vs 2013 일 수 있 습 니 다.특징 코드 추출 은 가능 한 한 일치 성 을 확보 해 야 합 니 다.

출처:https://www.cnblogs.com/lyshark
이상 은 C++PE 파일 특징 코드 인식 을 실현 하 는 절차 의 상세 한 내용 입 니 다.C+PE 파일 특징 코드 인식 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기