• 标 题:再贴一篇稍微复杂点的:对于DLL通过增加重定位项直接调用引入表函数 (2千字)
  • 作 者:Spring.W
  • 时 间:2002-11-4 4:35:12
  • 链 接:http://bbs.pediy.com

对于DLL文件,还有一种比较简单的方法,通过在冲定位表中增加IAT的重定位项实现。
  先看下面补丁程序:
                . 
0167:01077228  PUSH      EBX  ;函数名字
0167:01077229  PUSH      EDX  ;Kernel32的hModule
0167:0107722A  NOP
0167:0107722B  NOP
0167:0107722C  NOP
0167:0107722D  NOP
0167:0107722E  NOP
0167:0107722F  NOP
0167:01077230  CALL      [KERNEL32!GetProcAddress]
0167:01077236  TEST      EAX,EAX
0167:01077238  JZ        010772AC
                .
                .
  在SoftIce中写补丁时候就像上面一样写,完成后,0167:01077230处的指令代码将为:FF 15 xx xx xx xx,我们需要做的就是将xx xx xx xx处写入冲定位表。在本例子中,基地址为1040000,所以1077230处的RAV为37230,由于重定位表都是1000对齐的,所以要在重定位表中RVA为37000的索引中增加。
  1、找到重定位表中索引为37000的地方,如果没有这个索引,就给
      它加上,并将它的长度字段(第2个双字)加2
  2、计算重定位项目值:37230 - 37000 + 2 = 232,加2是跳过指令
      字FF 15,指令字之后才是要重定位的地址。
  3、加上属性:232 or 3000 = 3232,项目值是字单位,高4位是属
      性。
  4、将项目值3232按照内存存放规律--低地址放低字节,高地址放高
      字节加到这个索引(37000)中,在这个例子中,高低一样了。
  5、将重定表最后为0的字节删掉2个。同理,你要增加2个项目,就
      要删掉4个0;增加了索引,最好删掉同样长度的0字节。否则如
      果.reloc节不是最后一个节的话,这个节后面的数据或程序就出
      错了。若是最后一个节,可以不删,但要注意对齐PE文件。
  6、将导入表长度加2;若增加了n个项目,就要加n*2;若增加了索
      引,要加上同样的长度。

    现在一切ok了,程序运行时,你调用的引入表函数被PE装载器给重定位了。可以用LoadPe查看改造后的.reloc表,将会多了一项:
Index RVA  偏移  Type    Far Address  Data Interpretion
5  37232  37232  HIGHLOW(3) 1002C1A8  IAT thunk of "Kernel32"

  需要注意的事项:增加索引或项目时,要注意PE文件对齐,并要注意当.reloc不是最后一个节的特殊情况(往往是加了壳或打了补丁的才会这样)。

  EXE文件往往没有重定位表,能不能这样做呢?没有试过。


                                        Spring.W
                                        2002/11/4