| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 462 人关注过本帖
标题:[真心求助]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
快速回复:[真心求助]PE文件里的一些指针运算的问题!!!
数据加载中...
 
   



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

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