手动进行dll静态注入

大概思路是这样的:要注入一个dll文件,也就是需要修改输入表的中的IMPORT Directory Table结构,需要增加一个对应的结构体和该结构对应的IMAGE_IMPORT_DESCRIPTO和对输入表的size进行修改。所以我们只需要在原先的结构体数组后面增加对应的就够就行了,但是有时候往往在这些数据之后存在其他的数据,我们进行添加会对其进行覆盖,这是我们不想看到的。因此我们可选择考虑将整个IDT进行移动(因为节对齐的原因,会有大片的空白,可以进行修改,但需要保证所在节具有可写的属性,若不存足够得地方进行覆盖,那么就需要再新建一个节了),如果进行移动,那么同时还得修改输入表的RVA地址

1.进行dll文件编写

我们编写一个弹出messagebox的dll文件

// messdll.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "windows.h"
 __declspec(dllexport) void PrintNum()
 {
     for(int i=0;i<10;i++)
     {
         printf("%d ",i);
     }
     return;
 }
 __declspec(dllexport) void PrintName()
 {
     printf("%s\n","I am H");
     return;
 }
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(0,TEXT("HELLO"),TEXT("Attach"),0);
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

手动进行dll静态注入_第1张图片
编译后的函数名为?PrintName@@YAXXZ,而并不是PrintName,这是因为c++编译器基于函数重载的考虑,会更改函数名,这样使用显式调用的时候,也必须使用这个更改后的函数名,这显然给客户带来麻烦。为了避免这种现象,可以使用extern “C”指令来命令c++编译器以c编译器的方式来命名该函数

具体dll编写可以参考这个博客

http://www.blogjava.net/wxb_nudt/archive/2007/09/11/144371.html

2.修改PE文件

1. 我们对calc.exe进行注入
这下calc.exe的大致信息
手动进行dll静态注入_第2张图片
手动进行dll静态注入_第3张图片
2. 查看后发现无法继续写入,现在把IMPORT Directory Table整体移动到0x12AD0处

手动进行dll静态注入_第4张图片

手动进行dll静态注入_第5张图片
因此修改Data Directoriesc处导入表的RVA和size:
增加导入表的size+14h(20字节) 8C+14=A0
RVA=12AD0-400+1000=136D0

3.增加一个增加dll的一个IMAGE_IMPORT_DESCRIPTO表
设置Name、INT、IAT,填入之前的dll信息
Orignal FirstThunk:0x13770
Name RVA:0x013780
FirstThunk:0x013790
IID
对应关系
手动进行dll静态注入_第6张图片

4.查看是否存在绑定导入表,如果存在需要删除绑定导入表
–原因:IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT叫做绑定导入表,在第一种导入表导入地址的修正是在PE加载时完成,如果一个PE文件导入的DLL或者函数多那么加载起来就会略显的慢一些,所以出现了绑定导入,在加载以前就修正了导入表,这样就会快一些。 当PE文件中不存在绑定导入表时,IAT就与INT一样,此时导入表中的时间戳就为0;否则导入表中的时间戳为-1时,dll的真正时间戳存放于绑定导入表中(绑定导入表地址存放在数据目录的第12项,IAT是第13项)。
现在大多数情况,导入表的TimeDateStamp都为0,而Windows早期的自带软件(如WinXP的notepad.exe)基本都采用了TimeDateStamp为-1的情况即包含绑定导入表的情况。PE中包含导入表的优点是程序启动快,但是其缺点也十分明显,当存在dll地址重定位和dll修改更新,则绑定导入表也需要修改更新

5.确认所在区段可读写修改完毕运行结果,发现在双击calc.exe之后会先出现messagebox,表示成功注入dll.

手动进行dll静态注入_第7张图片
手动进行dll静态注入_第8张图片

你可能感兴趣的:(手动进行dll静态注入)