C++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 파일 특징 코드 인식 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu 1717 소수 화 점수 2 (수학)소수 화 점수 2 레이 는 수학 시간 에 선생님 의 말씀 을 듣 고 모든 소수 가 점수 로 표시 되 는 형식 이 라 고 말 했다. 그 는 녹 기 시 작 했 고 곧 완성 되 었 다. 그러나 그 는 또 하나의 문 제 를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.