首页
社区
课程
招聘
[求助]通过导出表获得指定函数的地址
发表于: 2009-12-14 18:47 5378

[求助]通过导出表获得指定函数的地址

2009-12-14 18:47
5378
为什么这个函数在Ring3下可以返回正确的地址,而在驱动程序中总是返回0哦
给点提示吧
//Get the function address
ULONG GetFuncAddress( ULONG hModule, char* FuncName )
{
  ULONG PeHeaderVA;
  ULONG ExportVA;
  ULONG EntVA;
  ULONG EntIndexVA;
  ULONG EatVA;
  ULONG EntCount;
  ULONG IndexBase;
  ULONG i;
  ULONG FuncIndex;
  ULONG FuncVA;
  
  //Get the offset address of PEHeader
  if( 'M' == *(PUCHAR)hModule  && 'Z' == *(PUCHAR)(hModule +1) )
  {
    PeHeaderVA = hModule + *(PULONG)(hModule + 0x3C);
    DbgPrint("PeHeaderVA: \n");
   
    if( 'P' == *(PUCHAR)PeHeaderVA && 'E' == *(PUCHAR)(PeHeaderVA + 1) )
    {
      DbgPrint("Is Valid PE File \n");
      //得到导出表的VA
      ExportVA = hModule + *(PULONG)( PeHeaderVA + 0x78 );
      
      //得到ENT的VA
      EntVA = hModule +  *(PULONG)(ExportVA + 0x20);
      
      //函数序号表的VA
      EntIndexVA = hModule + *(PULONG)(ExportVA + 0x24);
      //EAT
      EatVA = hModule + *(PULONG)(ExportVA + 0x1C);
      
      //由函数名导出的函数的个数
      EntCount = *(PULONG)( ExportVA + 0x18 );
      
      //序号的基数
      IndexBase = *(PULONG)( ExportVA + 0x10 );
      
      for( i = 0; i < EntCount; i++ )
      {
        if( strstr( (char*)(*(PULONG)EntVA + hModule ), FuncName ) )
        {
          DbgPrint("Find The Function!\n");
         
          //得到函数的序号
          FuncIndex = (USHORT)(EntIndexVA + i*2) - IndexBase;
         
          //通过序号得到地址
          FuncVA = *(PULONG)(FuncIndex * 4 + EatVA);
          return FuncVA;
        }
        EntVA += 4;
      }
      
      DbgPrint("Can't Find The Function!\n");
      return 0;
    }
    else
    {
      DbgPrint("PEHeader Error!\n");
      return 0;  
    }
  }
  else
  {
    DbgPrint("DosHeader Error!\n");
    return 0;
  }
  
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
那就不是函数问题吧  你贴这谁知道为什么啊
2009-12-14 18:53
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
你要搜导出表是绝对可以的
2009-12-14 18:54
0
雪    币: 240
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
那我应该放到哪里啊
2009-12-14 18:57
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
发现ring3跟ring0还是有点不一样的
2009-12-14 20:56
0
雪    币: 240
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
弱弱的问一下,应该怎样解决这个问题呢,请指教
2009-12-14 21:01
0
雪    币: 4797
活跃值: (3792)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
7
你直接搬这个吧,看你这么痛苦

http://alter.org.ua/en/docs/nt_kernel/procaddr/

如果愿意,也可以改进成二分查找的。但是,未处理forwarded情形,此时返回NULL。
2009-12-16 09:43
0
雪    币: 240
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
呵呵,不好意思啊,看了你推荐的资料还是不懂。
1 通过DriverObject查找的时候,为什么还要进行forwarded查找啊?
2 通过ZwQuerySystemInformation找到了ntkrnl.exe的基址了,但是查找其导出函数的时候,返回的函数地址总是零,和forwarded查找有什么联系哦??
呵呵,再推荐些资料吧,谢谢啦
2009-12-16 19:07
0
游客
登录 | 注册 方可回帖
返回
//