-
-
[原创]清除 PE 文件里的数字签名
-
发表于:
2011-9-3 21:42
16668
-
在 PE 可选头的数据目录里,DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY] 保存着数字签名的位置和大小。要清除数字签名,只要根据这些信息删除掉数字签名,再把字段清零就可以了。
关键代码如下:
先把文件映射到内存:
__forceinline LPVOID MapPeFile(LPCWSTR pwzFile, PLARGE_INTEGER lpFileSize)
{
if (StrSafeLen(pwzFile) <= 0) // 如果传入的文件路径为空
return NULL;
HANDLE hFile = CreateFileW(pwzFile,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
return NULL;
GetFileSizeEx(hFile, lpFileSize);
HANDLE hMapFile = CreateFileMappingW(hFile,
NULL,
PAGE_READONLY,
0,
0,
NULL);
CloseHandle(hFile);
if (NULL == hMapFile)
return NULL;
LPVOID pRet = MapViewOfFile(hMapFile,
FILE_MAP_READ,
0,
0,
0);
CloseHandle(hMapFile);
return pRet;
}
// 判断 PE 文件格式是否是无效的
__forceinline BOOL IsInvalidPe(LPVOID pBase)
{
if (NULL == pBase)
return TRUE;
PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pBase;
if (IMAGE_DOS_SIGNATURE != pDosHeader->e_magic)
return TRUE;
PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pBase + pDosHeader->e_lfanew);
if (IMAGE_NT_SIGNATURE != pNtHeaders->Signature)
return TRUE;
return FALSE;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课