注册 登录
编程论坛 VC++/MFC

[真心求助]PE文件里的一些指针运算的问题!!!

weilexuebian 发布于 2011-04-26 22:42, 462 次点击
if (fKernel32)
 {
  fread( &dos_header, 1, sizeof(IMAGE_DOS_HEADER), fKernel32 );  //dos_header是IMAGE_DOS_HEADER的实例
  fseek( fKernel32, dos_header.e_lfanew, 0 );
  fread( &header, 1, sizeof(IMAGE_NT_HEADERS), fKernel32 ); //到此为止已经找到了IMAGE_NT_HEADERS的位置

  int k = 0;
  for ( int i = 0; i < header.FileHeader.NumberOfSections; i++ )
   
   IMAGE_SECTION_HEADER section;
   memset( §ion, 0, sizeof(IMAGE_SECTION_HEADER) );
   fread( §ion, 1, sizeof(IMAGE_SECTION_HEADER), fKernel32 );
   if ( strcmp( ".text", (char*)§ion.Name ) == 0 )
   k = section.VirtualAddress - section.PointerToRawData;
   
  HMODULE module = LoadLibrary( Kernel32 );
  void *proc = GetProcAddress( module, "GetTickCount" );
  int offset = (int)proc - header.OptionalHeader.ImageBase;
  int file_offset = offset - k;
  Log::Error("%16x\n",file_offset);
  fseek( fKernel32, file_offset, 0 );


为了上下文,所以代码有些长。不过我的问题不复杂,熟悉PE文件的哥哥请接着往下看

我的问题是:k = section.VirtualAddress - section.PointerToRawData; //这里的k是否可以理解成节头和节数据之间的距离?不然,k的意义是什么?

module和proc分别获得了Kernel32的实际地址及其输出函数GetTickCount的实际地址,那么接下来的offset的意义是什么?用输出函数的实际地址减去PE文件的虚拟地址,这有什么意义吗?   接着最后面的file_offset = offset - k 的意义又是什么?

懂的哥哥请不吝赐教,刚注册,分不多,感谢!
0 回复
1