(在Windows 8上工作)我试图得到一个exe文件(PE32格式)部分标题的大小与c。 从我读到的,这个字段的偏移是60,所以我试着从那里读。
这是我使用的代码:
unsigned char offset; fseek(file,60,SEEK_SET); fread(&offset,sizeof(offset),1,file); printf("%hu",offset);
我的问题是如何获得部分标题的大小? 如果它不在抵消60,我怎么能find这个?
PE / COFF符号types字段
如何在Linux中将PE(Portable Executable)格式转换为ELF格式
加载PE文件的资源时
Windows便携式可执行文件如何在机器体系结构中移植
PE文件格式 – 节表和第一节之间是什么?
PE是每个DLL还是每个exe的“IMPORT ADDRESS TABLE”?
澄清二进制文件(PE / COFF&ELF)格式和术语
什么是64位Windows上的PE文件的最大大小?
这应该工作:
void main() { FILE *file = fopen("your_exe_file.exe","rb") ; long peheaderoffset ; // read the offset of the PE header which is located at offset 0x3c fseek(file,0x3c,SEEK_SET) ; fread(&peheaderoffset,sizeof(long),file) ; char PEHeader[4] ; // PE header: contains normally 'P','E',0 fseek(file,peheaderoffset,SEEK_SET) ; fread(&PEHeader,4,file) ; short machine ; short NumberofSections ; fread(&machine,sizeof(short),file) ; // read machine identifier fread(&NumberofSections,file) ; // read Number of sections printf ("PE Header = %sn",PEHeader) ; // should always print "PE" // we should check if PEHEeader actually // contains "PE". If not it's not a PE file printf ("machine = %xn",machine) ; // 14c for Intel x86 printf ("Number of sections = %dn",NumberofSections) ; // skip to size of optional header fseek(file,12,SEEK_CUR) ; short SizeOfOptionalHeader ; fread (&SizeOfOptionalHeader,file) ; printf ("Sizeof optional PE header = %dn",SizeOfOptionalHeader) ; short characteristics ; fread (&characteristics,file) ; printf ("characteristics = %xn",characteristics) ; // Now we are at the PE optional header short signature ; fread (&signature,file) ; printf ("Signature of optioan PE Header = %d (should be 267)n",signature) ; // skip to image Base at offset 0x1c // (the -2 is because we have already read the signature just above) fseek(file,0x1c - 2,SEEK_CUR) ; long imageBase ; fread (&imageBase,file) ; printf ("Image base = %xn",imageBase) ; }
尝试使用fread而不是fscanf,并且(如Joachim)指出这是一个二进制文件,所以确保你已经以二进制模式打开文件(file = fopen(filename,“rb”))
您试图读取的字段是4个字节长,但您正试图从那里读取一个NULL终止的字符串。 你可能得到了正确的值,但是然后你打印它就好像它是一个可打印的字符串(也许你正在打印类似“216”或“D8”的东西,但是这些字符串不是被存储的)。
可打印的字符串包含一系列代码,每个代码表示一个字符(至少在ASCII中),后面跟着一个' 0'终止符。 这就是“%s”scanf / printf格式选项处理的内容。 但这不是数据通常存储在二进制文件中的方式。 你可以试试这个来得到你想要的号码:
unsigned int offset; fseek(file,file); printf("%u",offset);
可能最好使用的名字是uint32_t ,但是这需要你包含<inttype.h>才能工作。
fscanf()是不恰当的 – 它读取ASCII数据,而PE32是二进制格式 – 你想要读取一个32位整数,而不是一个数字字符串(类似的打印“%s”是一个不适当的格式说明符。
您还必须确保以二进制模式打开文件,否则序列将被转换为单个文件, fseek()将无法正常工作。
uint32_t sizeOfheaders = 0 ; FILE* file = fopen( filename,"rb" ) ; // Open in binary mode fseek( file,SEEK_SET ) ; fread( &sizeOfheaders,sizeof(sizeOfheaders),file ) ; printf("%u",sizeOfheaders ) ;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。