深入理解导入表4-导入表实验

 

.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc

includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\windows.lib
.const
	lpHello db "Hello",0
      lpTitle db "Test",0
.code
start:
	invoke MessageBox,0,addr lpTitle,addr lpHello,0
	invoke ExitProcess,0
end start

  用汇编编写一个简单程序,准备做4个实验。

1、修改导入表

2、添加导入表

3、无效导入表

4、导入表超长函数名称

******************************************************************

1、修改导入表

 先找到导入表位置0x201C <===>0x41C

 源程序中只用到了user32.MessageBoxA这1个函数,由于只用到了一个函数,因为把导入表中的dll的Name和IAT,直接修改为我们自己编写dll和函数,进行劫持:把user32.MessageBoxA变成我们自己编写的IATInject.dll.IATInFun

,那么调用user32.MessageBoxA相当于调用了我们自己IATInject.dll.IATInFun。

 因此我们只需要修改user32.dll和函数名称就行了,修改如下:

 就会发现程序运行 并 成功注入dll。

 2、添加导入表

      如果例子程序中引用的user32.dll函数很多,不只是一个,那么一种方法是:可以添加新的导入表的方法。另一种方法是写一个同名的dll,函数个数也一样,参数也一样,把程序中用到的函数先实现自己的代码,然后进行一个函数转发。

      我们这里添加导入表,第一步先移动导入表到一个新的位置。

然后修改数目目录表中的RVA指向新的导入表的位置,把SIZE改为00 00 00 00 为了证明为参考字段。

 然后添加新的导入表,把我们的TInject.dll和IATInFun函数的位置好,这个位置相当于Name和函数名称字段。

然后把对应的IAT和INT填充,最后填充我们新的导入表。我们先用0xCC标记出来要填的位置

 首先填INT和IAT的RVA

 然后填入新的导入表的Name和FirstThunk、Original的值。

  然后程序继续,成功运行。

 3、无效导入表

    当FirstThunk指向的Thunk_DATA(IAT)数据为0时候,操作系统认为这个DLL为无效的,不进行装载,会继续读取下一个导入表,

    但是一些工具(原版的OD、PE工具CFF)没有按照操作系统的这种处理,仍然对读取这个无效的dll,按照原来的方式读取函数名称,获取函数的地址。

  我们把实验2中添加的导入表和原导入表换换位置,放在中间,

 然后把我们自己添加的导入表结构中的FIrstThunk指向的THUNK_DATA变为0x00 00 00 00,设置为无效的dll。

 记住是导入表指向的IAT变为0,不是导入表。

观察一下加载情况:程序正常运行,

 正常加载其他的dll

 CFF这个工具仍然还会加载这个无效的dll。

4、导入表超长函数名称,生成一个超长的函数名称,目前实验生成了500字符的函数名,在win7环境下发现还可以识别。有可能500还是太短了。

void jPNDKELgm7K1Z1sxlglQBKPWKKolacFysYk3dumItUTgkRqK0ZGZnux8SxzYgNv4XlPD6k0BUh1xhTU6urH2Ur4QbAPuZNJg87z6DkO7OiePAV5o2sCYbSs3RFxhWYdklxUNb4Ps3YZnnGR3Frw9yA5YswpR1fpAc2iUZs86lDkZJndCnxbmMavqFeY8D8ZzPUXcvWBTCPrGhGQK4Zsn1N7AhrsGtTxVaNyGbLFPz6c6g7zC3nUqKrdJXyhHaEP8UOcYKWWvKLvMZUy5XvazzBwpNhhTesOodZeL98vPBaEC9lMtJeYNHX6GJxBIuz0rJftu46mWRdn7ukqpy9bM24Mfl6fQjlM9SXKs18gBvFOC9o7BrRcGcRyAsthVnCo9uzcrGRqdK7qYZWPjttHEHo8R5DEkYNjotMCC0plAnZSYzD9gfAnY3UtYrUmFtYQSpGHGi8F6uf6iWVe4FkWZIac1wJZl7dSoIiUg3XGy1h5nUL1gOJWo()    500个字节 作为导出函数。

 使用denpcy发现函数名被破坏了。

_zRayPGKWF2R9dsoTAupfiJ8DtFoU5APBz5aHHoSAScGt4gjW9scQpjn4D6FTj9sstpiaN7A5awbjw7khjkxsQddJqEIVdcRBtgb2EMAntzXwGqBFK7JVkebkU4m8JDbm9NGz6ZTHJlfCdH9ppEyixLi3vCvFdWCRJRqJljWk3TyyZ6h6uptw4xkectByFlzHrcIxgEvvTf5FLZSWGCSATFcO9NiqtPV6h61qLjDOWK3tizUvaslwgMT7apKFJ4PwzRZiTmyttltAc3UAMe8wyslPLNM5QXxPAPbNj8nDR8MCZJPRnMz8Q1B9aSzWsH4ywdXOM4osMrtttRaTXdzefc5uJkmDY5nxcdTGXksVAuPhyoMEyYSueovvaJeVxvDY1v8U4ZiF2VUVTDBoLzf6MnWMaEPjkmcliORGsUnYCveCYQxbQgVIkpr1Cv6VtyW4BjB9gf5yW3l9h9fujMZs7SNgC14zSdZjTIfozUCxPfNyIKjxEUfq@0

posted @ 2023-08-17 18:13  一日学一日功  阅读(70)  评论(0)    收藏  举报