问题描述:
在PE文件修改或扩展时,最容易出现的错误就是,修改好PE文件后,双击打开却出现".exe不是有效的Win32应用程序"。
使用 PE Explorer工具加载该exe,提示 "Raw数据大小 > 文件映像大小.更新区段“SizeOfRawData”内在值?" 。
解决办法:
这是因为在修改PE文件的末尾节时,利用CreateFileMappingA函数创建的内存映射大小小于实际扩展后的PE文件大小。这样就会导致PE文件的Raw数据大小 > 文件映像大小。比如一般创建PE文件的内存映射时一般是PE文件大小+扩展大小:
CreateFileMappingA(hFileHandle ,0 ,PAGE_READWRITE | SEC_COMMIT,0 ,
PeFileSize + EnlargeSize ,0 ) ;
其实这样不太严谨,没有考虑到文件对齐。应该这样:
CreateFileMappingA(hFileHandle ,0 ,PAGE_READWRITE | SEC_COMMIT,0 ,
PeFileSize + AlignToFile(EnlargeSize) ,0 ) ;
这样扩展后的PE文件也就能打开了。