-
-
未解决
[求助][求助]在EXE中添加节成功 在dll中添加节就失败
-
发表于:
2018-12-26 03:33
7336
-
未解决 [求助][求助]在EXE中添加节成功 在dll中添加节就失败
这是提示的错误
这是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
被麻木的时间编辑
,原因: 今天重新试了下