首页
社区
课程
招聘
未解决 [求助][求助]在EXE中添加节成功 在dll中添加节就失败
发表于: 2018-12-26 03:33 7337

未解决 [求助][求助]在EXE中添加节成功 在dll中添加节就失败

2018-12-26 03:33
7337
这是提示的错误

这是PE工具查看的信息

 这是添加前的节表信息 后面有足够的大小添加一个节表


这是添加后的节表         
我先用一个EXE试了下 添加成功 并且运行也成功了 在dll中就失败了 实在找不出问题
代码如下

	//读取文件到内存
	LPVOID pImageBuffer = NULL;
	DWORD dwFileSize = ReadFileToImage(lpszFileName, &pImageBuffer);
	//拉伸为内存状态
	LPVOID pNewBuffer = NULL;
	DWORD dwSizeofImage = ImageBufferToNewBuffer(pImageBuffer, &pNewBuffer);
	//申请内存 sizeofimage+dwSectionSize

	char* pAddBuffer = new char[dwSizeofImage + dwSectionSize];
	ZeroMemory(pAddBuffer, dwSizeofImage + dwSectionSize);
	//复制拉伸后的内存
	memcpy_s(pAddBuffer, dwSizeofImage + dwSectionSize, pNewBuffer, dwSizeofImage);
	LPVOID pFileHeader;
	GetPEFileHeader(pAddBuffer, &pFileHeader);
	//节数量+1
	((PIMAGE_FILE_HEADER)pFileHeader)->NumberOfSections += 1;

	//修改sizeofimage
	LPVOID pOptionHeader = NULL;
	GetPEOptionHeader(pAddBuffer, &pOptionHeader);
	((PIMAGE_OPTIONAL_HEADER32)pOptionHeader)->SizeOfImage += dwSectionSize;
	DWORD FileSigment = ((PIMAGE_OPTIONAL_HEADER32)pOptionHeader)->FileAlignment;
	DWORD ImageSigment = ((PIMAGE_OPTIONAL_HEADER32)pOptionHeader)->SectionAlignment;

	//修改节属性
	LPVOID pSectionTable = NULL;
	LPVOID pPrevSectionTable = NULL;
	GetPESectionTable(pAddBuffer, &pSectionTable, ((PIMAGE_FILE_HEADER)pFileHeader)->NumberOfSections);
	GetPESectionTable(pAddBuffer, &pPrevSectionTable, ((PIMAGE_FILE_HEADER)pFileHeader)->NumberOfSections-1);
	memcpy_s(((PIMAGE_SECTION_HEADER)pSectionTable)->Name, 8, ".dale",6);
	 ((PIMAGE_SECTION_HEADER)pSectionTable)->Characteristics = 0x40000040;
	 //在文件中的起始位置=上一个节表的起始位置+大小
	((PIMAGE_SECTION_HEADER)pSectionTable)->PointerToRawData= ((PIMAGE_SECTION_HEADER)pPrevSectionTable)->PointerToRawData+ 
		((PIMAGE_SECTION_HEADER)pPrevSectionTable)->SizeOfRawData;

	((PIMAGE_SECTION_HEADER)pSectionTable)->SizeOfRawData=dwSectionSize;
	//在内存中的RVA=前一个节表的RVA+在文件中的大小
	((PIMAGE_SECTION_HEADER)pSectionTable)->VirtualAddress = ((PIMAGE_SECTION_HEADER)pPrevSectionTable)->VirtualAddress+
	((PIMAGE_SECTION_HEADER)pPrevSectionTable)->SizeOfRawData;
	//在内存中的大小设置为在文件中的大小;
	((PIMAGE_SECTION_HEADER)pSectionTable)->Misc.VirtualSize = dwSectionSize;

	//还原为文件状态
	LPVOID pNewImage = NULL;
	DWORD dwNewFIleSize = 0;
	dwNewFIleSize = NewBufferToImageBuffer(pAddBuffer,&pNewImage);
	//保存文件
	ImageBufferToFile(pNewImage,"c:/new_TestDLL.dll");
	return 0;
///////////////////
今天在虚拟机xp里面试了下 结果在xp下没有问题 win7上就不行 有知道的老哥吗。。。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-12-26 14:48 被麻木的时间编辑 ,原因: 今天重新试了下
收藏
免费 0
支持
分享
最新回复 (1)
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2

这个应该是代码的问题  

最后于 2022-6-14 17:55 被By__王子编辑 ,原因:
2022-6-13 01:32
0
游客
登录 | 注册 方可回帖
返回
//