首页
论坛
课程
招聘
[原创]清除 PE 文件里的数字签名
2011-9-3 21:42 13520

[原创]清除 PE 文件里的数字签名

2011-9-3 21:42
13520
在 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 文件是否有效
// 判断 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;
}


再获取数字签名的位置和大小:
__forceinline BOOL GetPeSignOffsetAndSize(LPVOID pBase, LPDWORD lpOffset, LPDWORD lpSize)
{
	if (NULL == pBase || NULL == lpOffset || NULL == lpSize)
		return FALSE;

	*lpOffset = *lpSize = 0;

	if (IsInvalidPe(pBase))
		return FALSE;

	PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pBase;
	PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pBase + pDosHeader->e_lfanew);
	*lpOffset = pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress;
	*lpSize = pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].Size;

	if (0 == *lpOffset || 0 == *lpSize)
		return FALSE;

	return TRUE;
}


清除数字签名:
__forceinline BOOL RemovePeSign(LPVOID pBase, PLARGE_INTEGER lpFileSize, LPCWSTR pwzNewFile)
{
	BOOL bRet = FALSE;

	if (NULL == pBase || NULL == lpFileSize)
		return FALSE;

	if (IsInvalidPe(pBase))
		return FALSE;

	DWORD dwOffset;
	DWORD dwSize;

	GetPeSignOffsetAndSize(pBase, &dwOffset, &dwSize);

	if (0 == dwOffset || 0 == dwSize)
		return FALSE;

	LPVOID pNewBase = VirtualAlloc(NULL, lpFileSize->LowPart, MEM_COMMIT, PAGE_READWRITE);
	if (NULL == pNewBase)
		return FALSE;

	DWORD dwRealFileSize = lpFileSize->LowPart - dwSize;
	memcpy(pNewBase, pBase, dwRealFileSize);
	PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pNewBase;
	PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pNewBase + pDosHeader->e_lfanew);
	pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress = 0;
	pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].Size = 0;
	pNtHeaders->OptionalHeader.CheckSum = 0;
	// 重新计算校检和
	DWORD dwHeaderSum, dwCheckSum;
	CheckSumMappedFile(pNewBase, dwRealFileSize, &dwHeaderSum, &dwCheckSum);
	pNtHeaders->OptionalHeader.CheckSum = dwCheckSum;

	HANDLE hFile = CreateFile(pwzNewFile,
						GENERIC_WRITE,
						FILE_SHARE_READ,
						NULL,
						CREATE_ALWAYS,
						FILE_ATTRIBUTE_NORMAL,
						NULL);

	if (INVALID_HANDLE_VALUE == hFile)
		goto _exit;

	DWORD dwBytes;
	bRet = WriteFile(hFile, pNewBase, dwRealFileSize, &dwBytes, NULL);
	CloseHandle(hFile);
_exit:
	VirtualFree(pNewBase, 0, MEM_RELEASE);

	return bRet;
}


最后的清理工作:
__forceinline void UnmapPeFile(LPVOID pBase)
{
	if (NULL != pBase)
		UnmapViewOfFile(pBase);
}


一个简单的图形界面:

安卓应用层抓包通杀脚本发布!《高研班》2021年3月班开始招生!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 2299
活跃值: 活跃值 (281)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
非虫 活跃值 7 2011-9-3 21:45
2
0
沙发支持
雪    币: 232
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
HearTring 活跃值 2011-9-3 22:09
3
0
我一直用 stub_pe,也很便捷,就是删除末尾添加节,再编辑pe头里面的证书偏移为0
一直懒得自己写程序
雪    币: 526
活跃值: 活跃值 (258)
能力值: ( LV12,RANK:212 )
在线值:
发帖
回帖
粉丝
shuax 活跃值 2 2011-9-3 22:59
4
0
以前用的CELESIGN,不错,这个更小巧了。
雪    币: 153
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
softsword 活跃值 2011-9-4 00:40
5
0
对 SpeedCommander 这一招不管用...
http://www.speedproject.de/download.html
雪    币: 1480
活跃值: 活跃值 (63)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
cntrump 活跃值 13 2011-9-4 01:58
6
0
数字签名已经清除了,是因为没有认证的数字签名,被提示的。
雪    币: 229
活跃值: 活跃值 (11)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
cxthl 活跃值 2 2011-10-5 09:31
7
0
部分程序清除之后直接失效
雪    币: 109
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
龙心 活跃值 2011-10-5 09:39
8
0
嗯。没有全部成功
雪    币: 49
活跃值: 活跃值 (16)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-10-5 14:22
9
0
数字签名效验技术
雪    币: 49
活跃值: 活跃值 (16)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-10-5 14:23
10
0
顶啊!!!!!!!!!!!!!!!!!
游客
登录 | 注册 方可回帖
返回