从内存注入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(长整型数): 目标窗口句柄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);
高级示例 - 从资源加载并注入:
// 从程序资源中加载DLL数据
HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(IDR_DLL_DATA), RT_RCDATA);
if (hResource) {
HGLOBAL hLoadedResource = LoadResource(NULL, hResource);
if (hLoadedResource) {
int64_t bufferAddr = (int64_t)LockResource(hLoadedResource);
int32_t bufferSize = SizeofResource(NULL, hResource);
int64_t hwnd = FindWindow(instance, "", "目标程序", "", 0);
if (hwnd != 0) {
// 从资源内存注入
int32_t result = InjectFromBuffer(
instance,
hwnd,
bufferAddr,
bufferSize,
3, // 手动映射注入
1 // 绕过保护
);
}
}
}
返回值
整型数:
- 1: 成功
- 0: 失败
注意事项
- DLL数据必须完整且有效,缓冲区不能损坏
- 内存注入无需落地文件,隐蔽性最强
- 推荐使用手动映射注入(type=3)以获得最佳兼容性
- 标准注入(type=0)可能无法从内存加载
- 确保bufferAddr指向的内存在注入完成前保持有效
- 注入完成后可以立即释放bufferAddr指向的内存
- 目标进程必须有足够的权限允许注入
- 32位进程只能注入32位DLL,64位进程只能注入64位DLL
- 注入系统进程或受保护进程需要管理员权限
- 内存注入可以有效规避部分文件监控类反注入
- 某些杀毒软件的内存扫描仍可能检测到注入行为
- 建议对DLL数据进行加密,在注入前解密以提高隐蔽性
- bufferSize必须与实际DLL文件大小完全一致
