从内存注入DLL - InjectFromBuffer
函数简介
从内存缓冲区直接注入DLL到指定窗口进程,无需落地文件,隐蔽性最强。(部分模式文件会落盘)
接口名称
InjectFromBuffer
DLL调用
int32_t InjectFromBuffer(int64_t instance, int64_t hwnd, int64_t bufferAddr, int32_t bufferSize, int32_t type, int32_t bypassGuard);
参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| instance | 长整数型 | OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。 |
| hwnd | 长整数型 | 目标窗口句柄, 可以通过SetMemoryHwndAsProcessId接口设置成传入进程ID |
| bufferAddr | 长整数型 | DLL数据在内存中的起始地址 |
| bufferSize | 整数型 | DLL数据的大小(字节) |
| type | 整数型 | 注入类型:1 标准注入(CreateRemoteThread),2 驱动注入模式1,3 驱动注入模式2,4 驱动注入模式3 |
| bypassGuard | 整数型 | 是否绕过保护:0 不绕过,1 尝试绕过常见反注入保护 |
示例
// 创建OLA对象
int64_t instance = CreateCOLAPlugInterFace();
// 读取DLL文件到内存
FILE* fp = fopen("C:\\MyDlls\\inject.dll", "rb");
if (fp != NULL) {
// 获取文件大小
fseek(fp, 0, SEEK_END);
int32_t fileSize = ftell(fp);
fseek(fp, 0, SEEK_SET);
// 分配内存并读取文件
unsigned char* buffer = (unsigned char*)malloc(fileSize);
fread(buffer, 1, fileSize, fp);
fclose(fp);
// 查找目标窗口
int64_t hwnd = FindWindow(instance, "", "目标程序", "", 0);
if (hwnd != 0) {
// 从内存注入DLL
int32_t result = InjectFromBuffer(
instance,
hwnd,
(int64_t)buffer,
fileSize,
3, // 手动映射注入(推荐用于内存注入)
1 // 绕过保护
);
if (result == 1) {
printf("从内存注入DLL成功\n");
} else {
printf("从内存注入DLL失败\n");
}
}
// 释放内存
free(buffer);
}
// 释放资源
DestroyCOLAPlugInterFace(instance);
返回值
整数型:1 成功,0 失败。
注意事项
- DLL数据必须完整且有效,缓冲区不能损坏。
- 内存注入无需落地文件,隐蔽性最强。
- 推荐使用手动映射注入(type=3)以获得最佳兼容性。
- 标准注入(type=0)可能无法从内存加载。
- 确保bufferAddr指向的内存在注入完成前保持有效。
- 注入完成后可以立即释放bufferAddr指向的内存。
- 目标进程必须有足够的权限允许注入。
- 32位进程只能注入32位DLL,64位进程只能注入64位DLL。
- 注入系统进程或受保护进程需要管理员权限。
- bufferSize必须与实际DLL文件大小完全一致。
