首页 > 其他 > 详细

将动态链接库注入到EXE中

时间:2021-07-16 15:32:08      阅读:17      评论:0      收藏:0      [点我收藏+]

1. 引入头文件

 #include<Windows.h>

2. 获取窗口句柄

char testTitle[]="XXXXXXXX.exe";
char testClass[]="XXXXXXXClass";
HWND windowHandle= FindWindowA(testClass, testTitle);

FindWindowA()中的参数

参数类型
参数1 lpClassName 字符串 要获取的窗口的类名
参数2 lpWindowName 字符串 要获取的窗口的标题
返回值 HWND 窗口句柄

3. 获取目标进程的PID

 DWORD processID;
 GetWindowThreadProcessId(windowHandle,&processID);

GetWindowThreadProcessId()的参数

参数类型
参数1 hWnd 句柄 目标进程的窗口句柄
参数2 lpdwProcessId 地址 将获取到的PID值写入这个地址
返回值 DWORD 返回值为创建窗口的线程标识,也就是TID

4. 获取目标进程的相应权限的进程句柄

 HANDLE threadHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, processID);

OpenProcess()的参数

参数类型
参数1 dwDesiredAccess DWORD 获取该进程的访问权限
参数2 bInheritHandle 布尔 表示所得到的进程句柄是否可以被继承
参数3 dwProcessId DWORD 打开进程的PID值
返回值 HANDLE 如成功,返回值为指定进程的句柄。失败则返回NULL

5. 在目标进程分配内存空间

void* 目标内存空间 = VirtualAllocEx(threadHandle, NULL, 4 * 1024, MEM_COMMIT, 0x40/*PAGE_EXECUTE_READWRITE 内存属性*/);

VirtualAllocEx()的参数

参数类型
参数1 hProcess HANDLE 要在其中分配空间的进程的句柄
参数2 lpAddress LPVOID(地址) 要获取的地址区域
参数3 dwSize SIZE_T 要分配的内存大小
参数4 flAllocationType DWORD 内存分配的类型
参数5 flProtect DWORD 内存页保护
返回值

6. 在目标进程写入代码

char DLLPath[]="XXXXXXXXXXXXX.dll"
WriteProcessMemory(threadHandle, 目标内存空间, DLLPath, 0x300, 0);

WriteProcessMemory()的参数

参数类型
参数1 hProcess HANDLE(句柄) 要写入的进程的句柄
参数2 lpBaseAddress LPVOID 用来接收写入数据的地址
参数3 lpBuffer LPVOID 写入数据的地址
参数4 nSize DWORD 要写入的字节数
参数5 lpNumberOfBytesWritten LPDWORD
返回值 布尔 返回值非0即代表成功

7. 在目标进程调用写入的代码

CreateRemoteThread(threadHandle, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, 目标内存空间/*要注入的DLL*/, 0, 0);

CreateRemoteThread()的参数

参数类型
参数1 hProcess 要被调用的目标进程
参数2 lpThreadAttributes
参数3 dwStackSize
参数4 lpStartAddress 目标进程中,要被调用的函数的地址
参数5 lpParameter 传给被调用的函数的参数
参数6 dwCreationFlags
参数7 lpThreadId
返回值 HANDLE 成功返回新线程句柄,失败返回NULL

LoadLibraryA //将DLL加载到调用进程,并获取模块的基址

8. 全部代码

```c++
#include <iostream>
#include <Windows.h>

char 要注入的DLL路径[] = R"(X:\XXXXXX\XXXX\XXXXXX\XXXX\XXXXXXXX\XXXXXXX.dll)";

int main()
{
    char testTitle[] = R"(XXXXXXXXXXX.exe)";//R"()" 忽略括号内的转义字符
    char testClass[] = "XXXXXXXXXXClass";
    //在目标进程分配内存
    //获取目标窗口的句柄
    HWND windowHandle = FindWindowA(testClass, testTitle);
    //获取目标进程的PID
    DWORD processID = 0;
    GetWindowThreadProcessId(windowHandle, &processID);
    //获取目标进程的相应权限的进程句柄
    HANDLE threadHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, processID);
    //在目标进程分配内存空间
    void* 目标内存空间 = VirtualAllocEx(threadHandle, NULL, 4 * 1024, MEM_COMMIT, 0x40/*PAGE_EXECUTE_READWRITE 内存属性*/);
    printf("目标内存空间 DLL路径=%p \n", 目标内存空间);
    //在目标进程写入代码
    bool 写入结果 = WriteProcessMemory(threadHandle, 目标内存空间, 要注入的DLL路径, 0x300, 0);
    printf("写入结果=%d\n", 写入结果);
    //在目标进程调用写入的代码
    CreateRemoteThread(threadHandle, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, 目标内存空间/*要注入的DLL*/, 0, 0);
    getchar();//等待键盘输入,可以暂停在这里等待
}
```

将动态链接库注入到EXE中

原文:https://www.cnblogs.com/FstBlog/p/15019360.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!