QQ登录

只需一步,快速开始

搜索
查看: 3980|回复: 4

[C/C++] 随机文件PE头信息 小工具

[复制链接]

253

积分

27

主题

2

精华

坛主

Rank: 9Rank: 9Rank: 9

违规
0 点
JmPoint
12839 点
声望
20 点
赏金币
1 枚
发单信誉
0
接单信誉
0
注册时间
2015-7-24
最后登录
2018-10-15
在线时间
200 小时

4st TeAm成员论坛元勋奖章特殊贡献勋章

发表于 2017-4-18 10:36:43 | 显示全部楼层 |阅读模式
这个工具是方便自己不用重编译程序,防止被别人提取特征查杀的而写的。主要随机以下信息  用法 rFile.exe 目标文件名 参数
******************************************************
支持 x86/x64文件,exe|dll|sys|ocx
/l       随机连接器版本
/t       随机时间戳
/s       随机区段名
/oep     随机入口点  不支持大于4G文件
/ssize   随机区段大小 只随机 VSize和最后一个区段的RSize
          Ver 0.1
******************************************************


代码:
[C++] 纯文本查看 复制代码
// rFile.cpp : 定义控制台应用程序的入口点。
//

#include <windows.h>
#include <stdio.h>
#include <string>
#include <vector>


DWORD Search_Bin(byte *pSrc, byte *pTrait, size_t nSrcLen, size_t nTraitLen)//内存搜索
{
	if (IsBadReadPtr(pSrc, sizeof(void*)) == TRUE)
	{
		return -1;
	}
	ULONG i, j, k;
	for (i = 0; i <= (nSrcLen - nTraitLen); i++)
	{
		if (pSrc[i] == pTrait[0])
		{
			k = i;
			j = 0;
			while (j < nTraitLen)
			{
				k++; j++;
				if (pSrc[k] != pTrait[j])
				{
					break;
				}
			}

			if (j == nTraitLen)
			{
				return i;
			}

		}

	}
	return -1;
}


int main(int argc, char* argv[])
{
	if (argc < 2)
	{
		puts("******************************************************");
		puts("支持 x86/x64文件,exe|dll|sys|ocx");
		puts("/l       随机连接器版本 ");
		puts("/t       随机时间戳 ");
		puts("/s       随机区段名 ");
		puts("/oep     随机入口点  不支持大于4G文件");
		puts("/ssize   随机区段大小 只随机 VSize和最后一个区段的RSize");
		puts("          Ver 0.1");
		puts("******************************************************");

		return 0;
	}
	srand(GetTickCount());

	HANDLE		hFile;
	DWORD		dwFileSize = 0,dwHighSize = 0,dwReadSize = 0;
	byte		*pFile = NULL;
	BOOL		bRead = FALSE;
	hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		printf("打开文件失败 错误代码 = %d", GetLastError());
		return 0;
	}
	dwFileSize = GetFileSize(hFile, &dwHighSize);
	pFile = (byte*)calloc(dwFileSize * 2, sizeof(byte));
	bRead = ReadFile(hFile, pFile, dwFileSize, &dwReadSize, NULL);
	if (!bRead)
	{
		printf("读取文件失败 错误代码 = %d", GetLastError());
		return 0;
	}
	CloseHandle(hFile);

	PIMAGE_DOS_HEADER	pDosHead = (PIMAGE_DOS_HEADER)pFile;
	if (pDosHead->e_magic != IMAGE_DOS_SIGNATURE)
	{
		puts("非标准PE文件");
		return 0;
	}
	PIMAGE_NT_HEADERS pNtHead = (PIMAGE_NT_HEADERS)((LONG)pDosHead + pDosHead->e_lfanew);
	PIMAGE_NT_HEADERS64 pNtHead64 = (PIMAGE_NT_HEADERS64)((LONG)pDosHead + pDosHead->e_lfanew);
	if (pNtHead->Signature != IMAGE_NT_SIGNATURE)
	{
		puts("非标准PE文件");
		return 0;
	}

	BOOL	bX86 = FALSE;
	if (pNtHead->FileHeader.Characteristics & IMAGE_FILE_32BIT_MACHINE)
		bX86 = TRUE;
	printf("文件系统: %s\n", bX86 ? "32Bits" : "64Bits");

	for (int i = 0; i < argc; i++)
	{
		if (strcmp(argv[i], "/l") == 0)//随机连接器版本
		{
			pNtHead->OptionalHeader.MajorLinkerVersion = rand() % 88;//连接器版本随机
			pNtHead->OptionalHeader.MinorLinkerVersion = rand() % 88;
			puts("随机链接器版本 成功...");
		}

		if (strcmp(argv[i], "/t") == 0)//随机时间戳
		{
			pNtHead->FileHeader.TimeDateStamp = *(DWORD*)((DWORD)pFile + rand() % dwFileSize);//时间戳随机
			puts("随机时间戳 成功...");
		}

		if (strcmp(argv[i], "/s") == 0)//随机区段名
		{
			int nSection = pNtHead->FileHeader.NumberOfSections;
			DWORD tmp = (DWORD)pNtHead + sizeof(IMAGE_FILE_HEADER) + pNtHead->FileHeader.SizeOfOptionalHeader + sizeof(IMAGE_NT_SIGNATURE);
			PIMAGE_SECTION_HEADER	pSection = (PIMAGE_SECTION_HEADER)tmp;
			for (int i = 0; i < nSection; i++)
			{
				for (int j = 0; j < IMAGE_SIZEOF_SHORT_NAME; j++)
				{
					pSection->Name[j] = (rand() % ('z' - 'a')) + 'a';
				}
				pSection++;
			}
			puts("随机区段名 成功...");
		}

		if (strcmp(argv[i], "/oep") == 0)//随机入口点
		{
			DWORD		dwEntryPoint = 0;
			if (bX86)
				dwEntryPoint = pNtHead->OptionalHeader.AddressOfEntryPoint;
			else
				dwEntryPoint = pNtHead64->OptionalHeader.AddressOfEntryPoint;

			int nSection = pNtHead->FileHeader.NumberOfSections;
			DWORD tmp = (DWORD)pNtHead + sizeof(IMAGE_FILE_HEADER) + pNtHead->FileHeader.SizeOfOptionalHeader + sizeof(IMAGE_NT_SIGNATURE);
			PIMAGE_SECTION_HEADER	pSection = (PIMAGE_SECTION_HEADER)tmp;

			for (int i = 0; i < nSection; i++)
			{
				if (dwEntryPoint >= pSection->VirtualAddress && dwEntryPoint <= (pSection->VirtualAddress + pSection->Misc.VirtualSize))//找到了代码区段
				{
					break;
				}
				pSection++;
			}
			byte	byCode[] = { 0xCC, 0xCC, 0xCC, 0xCC, 0xCC };
			byte*	pSearch = pFile + pSection->PointerToRawData;
			DWORD	dwSearch = pSection->SizeOfRawData;
			DWORD	dwTemp = 0;
			std::vector<DWORD> dwResult;
			while (TRUE)
			{
				dwTemp = Search_Bin(pSearch, byCode, dwSearch, sizeof(byCode));
				if (dwTemp != -1)
					dwResult.push_back(dwTemp +(DWORD)pSearch);
				else
					break;
				pSearch += dwTemp; pSearch += sizeof(byCode);
				dwSearch -= dwTemp; dwSearch -= sizeof(byCode);
			}
			if (dwResult.size() == 0)
			{
				puts("随机入口点失败,找不到间隔代码...");
				goto _FAIL_RAND_OEP;
			}

			DWORD	dwRAddr = dwResult[rand() % dwResult.size()];
			DWORD	dwRAddrOffset = dwRAddr - pSection->PointerToRawData - (DWORD)pFile;
			DWORD	dwVAddr = pSection->VirtualAddress + dwRAddrOffset;//文件偏移地址转换为虚拟地址

			byte	jmp[] = { 0xE9, 0, 0, 0, 0 };
			dwTemp = dwEntryPoint - dwVAddr - 5;
			memcpy(&jmp[1], &dwTemp, sizeof(void*));
			memcpy((void*)dwRAddr, jmp, sizeof(jmp));

			if (bX86)
				pNtHead->OptionalHeader.AddressOfEntryPoint = dwVAddr;
			else
				pNtHead64->OptionalHeader.AddressOfEntryPoint = dwVAddr;

			puts("随机入口点 成功...");
_FAIL_RAND_OEP:
			;
		}


		if (strcmp(argv[i], "/ssize")  == 0)//随机区段大小
		{
			int nSection = pNtHead->FileHeader.NumberOfSections;
			DWORD tmp = (DWORD)pNtHead + sizeof(IMAGE_FILE_HEADER) + pNtHead->FileHeader.SizeOfOptionalHeader + sizeof(IMAGE_NT_SIGNATURE);
			PIMAGE_SECTION_HEADER	pSection = (PIMAGE_SECTION_HEADER)tmp;
			DWORD	dwAlig = 0;
			DWORD	dwRandAddSize = 0;  
			if (bX86)
				dwAlig = pNtHead->OptionalHeader.SectionAlignment; //区段对齐
			else
				dwAlig = pNtHead64->OptionalHeader.SectionAlignment;

			for (int i = 0; i < nSection; i++)//随机VSize
			{
				dwRandAddSize = rand() % (dwAlig - (pSection->Misc.VirtualSize % dwAlig)); 
				pSection->Misc.VirtualSize += dwRandAddSize;
				pSection++;
			}
		
			puts("随机VSize 成功...");


			DWORD	dwFileAlig;
			DWORD	dwRandAddFileSize = 0;
			DWORD	dwSizeofImage = 0;
			if (bX86)
				dwFileAlig = pNtHead->OptionalHeader.FileAlignment; //文件对齐
			else
				dwFileAlig = pNtHead64->OptionalHeader.FileAlignment;

				
			dwRandAddFileSize = rand() % 18 + 1; 
			dwRandAddFileSize *= dwFileAlig;

			pSection = (PIMAGE_SECTION_HEADER)tmp;
			for (int i = 0; i < nSection -1 ; i++)//跳转到最后一个区段
				pSection++;

			if (pSection->SizeOfRawData + pSection->PointerToRawData != dwFileSize)
			{
				puts("文件存在附加数据,改变RSize失败...");
				goto _FAIL_RAND_RSIZE;
			}

			pSection->Misc.VirtualSize += dwRandAddFileSize;
			pSection->SizeOfRawData += dwRandAddFileSize;
			dwSizeofImage = pSection->VirtualAddress + pSection->Misc.VirtualSize;
			for (int i = 0; i < (dwSizeofImage / dwAlig * 2); i++)
			{
				if (i * dwAlig >= dwSizeofImage)
				{
					if (bX86)
						pNtHead->OptionalHeader.SizeOfImage = i*dwAlig;
					else
						pNtHead64->OptionalHeader.SizeOfImage = i*dwAlig;
					dwFileSize += dwRandAddFileSize;
					puts("随机RSize 成功...");
					break;
				}
			}

_FAIL_RAND_RSIZE:
			;
		}

	}

	FILE	*fp;
	std::string	strPrev(argv[1]),strName, strFileEx,strFileName;
	int nPos = 0, nnPos = 0;

	nPos = strPrev.rfind(".");
	strName = strPrev.substr(0, nPos);
	strFileEx = strPrev.substr(nPos, strPrev.length() - nPos);
	strFileName = strName; strFileName += ".r"; strFileName += strFileEx;
	fp = fopen(strFileName.c_str(), "wb+");
	fwrite(pFile, dwFileSize, 1, fp);
	fclose(fp);
	return 0;
}







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即加入

x

评分

参与人数 2JmPoint +11 声望 +1 收起 理由
只是路过 + 1 良心贴,前排支持!!!!!
拓海真一 + 10 + 1 零日安全有你更精彩。

查看全部评分

回复

使用道具 举报

87

积分

11

主题

0

精华

正式会员

Rank: 1

违规
0 点
JmPoint
2698 点
声望
10 点
赏金币
0 枚
发单信誉
0
接单信誉
0
注册时间
2015-8-17
最后登录
2018-8-2
在线时间
445 小时
发表于 2017-4-18 17:07:14 | 显示全部楼层
膜拜小俊师傅,这个可以很好的防提特征码了,不错。
回复 支持 反对

使用道具 举报

38

积分

6

主题

0

精华

正式会员

Rank: 1

违规
0 点
JmPoint
452 点
声望
4 点
赏金币
0 枚
发单信誉
0
接单信誉
0
注册时间
2015-7-28
最后登录
2018-9-6
在线时间
45 小时
发表于 2017-4-19 21:25:04 | 显示全部楼层
爱你哦 小俊师傅
回复 支持 反对

使用道具 举报

8

积分

2

主题

0

精华

普通会员

违规
0 点
JmPoint
179 点
声望
0 点
赏金币
0 枚
发单信誉
0
接单信誉
0
注册时间
2016-6-23
最后登录
2018-10-18
在线时间
44 小时
发表于 2017-4-25 21:53:30 | 显示全部楼层
拿走了小俊师傅,试了一下,的确是可以起到作用
回复 支持 反对

使用道具 举报

4

积分

1

主题

0

精华

普通会员

违规
0 点
JmPoint
151 点
声望
0 点
赏金币
101 枚
发单信誉
0
接单信誉
0
注册时间
2017-4-25
最后登录
2018-10-16
在线时间
49 小时
发表于 2017-4-26 23:16:25 | 显示全部楼层
不错不错!但是对于驱动文件SYS,是不是还要修正校验和?
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即加入

本版积分规则

关闭

站长推荐上一条 /2 下一条

QQ|Archiver|手机版|小黑屋|零日安全论坛 ( 吉ICP备15004039号 ) 点击这里给我发消息

GMT+8, 2018-10-19 05:13 , Processed in 0.128466 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表