标题:[真心求助]PE文件里的一些指针运算的问题!!!
只看楼主
weilexuebian
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-4-26
 问题点数:0 回复次数:0 
[真心求助]PE文件里的一些指针运算的问题!!!
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 的意义又是什么?

懂的哥哥请不吝赐教,刚注册,分不多,感谢!
搜索更多相关主题的帖子: 真心 
2011-04-26 22:42



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-338027-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.297610 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved