首页
社区
课程
招聘
[求助]关于获取IAT表的问题
发表于: 2013-4-20 19:09 4252

[求助]关于获取IAT表的问题

2013-4-20 19:09
4252
function ImageDirectoryEntryToData(Base:Pointer;MappedAsImage:ByteBool;DirectoryEntry:Word;var Size:ULONG):PIMAGE_IMPORT_DESCRIPTOR;stdcall;external 'IMAGEHLP.DLL';

procedure TForm1.ErgodicIat ;
var
  pImportDir:PIMAGE_IMPORT_DESCRIPTOR;//IID数组 结束符号为NULL
  pITD:PIMAGE_THUNK_DATA32 ;
  pIIBN:PIMAGE_IMPORT_BY_NAME ;
  Hand:Cardinal ;
  Size:Cardinal ;
  IatName:^PAnsiChar ;
  L:Cardinal ;
  B:Byte ;
begin

Hand:=GetModuleHandle(PChar('ws2_32.dll'));
  if Hand=0 then
  begin
    Hand:=Loadlibrary(PChar('ws2_32.dll')) ;
    if Hand=0 then
    begin
     Memo1.Lines.Add('获取模块句柄失败...')  ;
     Exit ;
    end;
  end;
pImportDir:=ImageDirectoryEntryToData(Pointer(Hand),True,IMAGE_DIRECTORY_ENTRY_IMPORT,Size);
if pImportDir^.FirstThunk=0 then
begin
    Memo1.Lines.Add('获取导入表失败...')  ;
    Exit ;
end;

while pImportDir^.FirstThunk<>0 do
  begin
    L:=Hand+pImportDir^.Name ;
    IatName:=@L ;
    Memo1.Lines.Add(Format('RVA %X %10S FirstThunk%15X,Name %s',[pImportDir^.FirstThunk,'',L,IatName^])) ;

    ///---------------------------------------------------上面的代码是正确的
    ///
    ///
    ///
    pITD:=Pointer(Hand+pImportDir^.FirstThunk) ;
    while pITD^.ForwarderString<>0 do
    begin

     //为什么这里得到就信息就不对那? 我是看书上说的应该是这样的啊,加解密第三版上上的用改是这样写吧
      Memo1.Lines.Add(Format('Ord%10X,%20X,%20X',[pITD^.Ordinal,pITD^._Function,pITD^.AddressOfData])) ;
      Inc(pITD);
    end;

    Inc(pImportDir);
  end;

end;

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 282
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
终于搞定了,结贴,原始是我自己理解错了, OD跟踪下就知道原理了,加密与解密还真是本好书,谢谢看雪

上传的附件:
2013-4-20 22:16
0
游客
登录 | 注册 方可回帖
返回
//