设为主页 | 加入收藏 | 繁體中文

实例熟练掌握输入表

  无论是在脱壳还是在PEDIY中,“输出表”这一观点总像阴魂一样缠绕在电脑屏幕前,令我等菜鸟彷徨叹息。遂于克日认真学习了一下PE格式,终于将此恶魔搞定。
  将实例PE.EXE载入LordPE中,依次点击“数据目录”,“输出表”旁的小点点,弹出以下窗口。我们勾选下面的"总是查看FirstThunk".
  只见有两个dll:user32.dll和kernel32.dll以及各dll引出的诸函数.
  可见每个dll有五个属性.
  我们临时只记住第一个dll的FirstThunk值如图:00002010,窗口下半部表明该值指向了名为DrawTextA的API函数.
  我们用OD载入实例.下断 bpx DrawTextA ,F9运转被断下,如图:
  抵达程序对DrawTextA的调用途,F7跟进
  双击一下,原来是直接跳转到[402010]的中央去了.
  我们在数据窗口中d 402010看看402010到底是什么。
  为方便查看,我们右键选择"长型","地点".
  原来,402010地点内里的值是77D3C6CA那么jmp dwort ptr [402010]就是跳到77D3C6CA了.这个地点就是DrawTextA函数的入口地点。
  现在我们大抵晓得输出表中这个First Thunk值的作用了,原来程序中对这些输出函数的调用都是jmp 402010 实现的。
  为进一步理解,我们在16进制编辑器(如winhex)中查看输出表。
  数据目录表第二项是 输出表的RVA:2050.将其转换成文件偏移650.该处就是输出表的开始。
  蓝色部门是2个IID数组。每个数组有五个属性,对应着一个DLL。这就是lordpe中输出表五个属性的由来,可与lordpe比较:
  OringinalFirstThunk TimeDateStamp  ForwarderChain  Name     FirstThunk
  9C200000            00000000       00000000        CA210000 10200000
  8C200000            00000000       00000000        0A220000 00200000
  且看第一个IID。
  他的OriginalFirstThunk 值为209C这是RVA值转化为文件偏移69C.即是图中淡黄色部门.
  FirstThunk值为2010转化为文件偏移610.即是图中深黄色部门.
  明眼人曾经看出来了,这两部门的数据是一模一样的。前者称为INT后者是IAT。
  这部门数据也是指针,22210000 转换后是00002122再转化成文件偏移722.看772处是什么?
  原来是DrawTextA这个字符串.再看2E210000转化文件偏移72e.看72e处是什么?原来是EndPaint字符串....后面再不逐一看了:)------------请注意到并不是恰好指向函数的字符串前面还多了两个字节称为hint值 可为0,此处不详讨.
  772,77e....是函数名的地点,这群地点构成的布局被称为IMAGE_IMPORT_BY_NAME.
  为什么INT和IAT两个都指向这一布局呢?
  体系在程序初始化时根据OrignalFirstThunk的值找到函数名,调用GetProcAddress函数(或类似功能的体系代码)且根据函数名取得函数的入口地点,
  然后用函数入口地点代替FirstThunk指向的地点串的值IAT.
  回首本文扫尾时我们OD的一段跟踪,这段话便不难理解了.当我们在OD中查看00402010(RVA2010加上基址400000)时,内里曾经是DrawTextA函数的入口地点。
  因为体系曾经用真正的函数入口地点代替IAT了。
  为增强理解,我们针对以上实际做以下实验.
  1.有时候程序不存在OrignalFirstThunk,我们将此程序的该值去掉以看结果.
  将650处的9C20以0添补,保存文件.双击。。程序运转正常.可见,在没有OrignalFisrtThunk的环境下,体系直接以IAT中的的函数名得到函数入口地点并添补IAT。
  2.OrignalFirstThunk值不变将INT以0添补以看结果.
  按CTRL+Z数次恢复对文件的修改,把上图淡黄色部门用0添补,保存文件。双击.弹出程序运转错误窗口.
  可见体系根据OrignalFirstThunk值只找到空的INT,程序便运转错误了.
  3.依照理解IAT反正会被根据OrignalFirstThunk得到函数入口地点所代替,彷佛IAT原始值没有存在的必要.
  按CTRL+Z数次恢复对文件的修改.这次将610处即上图深黄色部门用0添补,保存文件.双击.弹出程序运转错误窗口.
  按CTRL+Z数次恢复对文件的修改,程序又能运转了.由此可见纵然OrignalFirst值正常,INT也正常,IAT的值仍旧必不可少,由此可见IAT的重要性!
  相信至此 读者已对输出表有了一定水平的认识,无论是ImportREC重建输出表还是手工重建输出表亦或是增长输出函数都已不再是难事.
 


    文章作者: 福州军威计算机技术有限公司
    军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。

TAG:
评论加载中...
内容:
评论者: 验证码: