• 标 题:贴个初级问题,高手莫入:调用PE文件中引入表中的函数的方法 (1千字)
  • 作 者:Spring.W
  • 时 间:2002-11-3 20:07:53
  • 链 接:http://bbs.pediy.com

当我们补丁一个PE文件时,常常要用到调用这个PE文件引入表中的函数,那么怎样来调用呢?要想很透彻的了解其原理,需要对引入表很熟悉,并且要对PE文件的加载机制有所了解。
    对于引入表的介绍和PE加载机制,看雪老大的著作上已经介绍的很清楚,只要花点时间,很容易弄清楚。按照下面步骤,即使对不太熟悉引入表的朋友,也能直接使用其中的函数。

准备的工具:LoadPe、Softice或TRW2000

步骤:
1、用LoadPe打开PE文件,查看其目录中的导入表,选中要使用的DLL并纪
  录下它的FirstThunk的值(这是IAT表的起始RVA),假设为:E1B7。
2、找到要在这个DLL中要使用的函数,假设为:LoadLibraryA。
3、数一数这个函数在这个DLL函数列表中是第几个,假设为:第3个。
4、那么在补丁中调用这个函数就是:
  call dword ptr[e1b7+ImageBase][(3-1)*4]
5、ImageBase的获得:
  当我们补丁一个程序时,补丁的起始RVA是已知的(可以根据VA用LoadPe
  的FLC计算出来),请看下面程序:
  假设补丁开始地址(VA)为:0040d000,通过计算知道对应的RVA为n
  0040d000:pushad
  0040d001:call  0040d006
  0040d006:pop  ebp
  xxxxxxxx:sub  ebp-n-6  ;此时,ebp就是ImageBase,减6是
                          ;pushad 和 call 0040d006的指令长度
  xxxxxxxx:call dword ptr[ebp+e1b7][(3-1)*4]  ;调用
                                              ;LoadLibraryA
            .
            .    
            .
  xxxxxxxx:popad

  仅此抛砖引玉,欢迎高手赐教其他方法。

                              Spring.W
                              2002/11/3