c++指针本身不能实现dll注入,真正完成注入的是windows api调用链(createremotethread+loadlibrarya);指针仅负责地址传递、内存拷贝和类型转换,用错类型或忽略地址空间差异会导致静默失败或访问冲突。

直接说结论:C++ 指针本身不能“实现”代码注入,它只是内存操作的底层工具;真正完成 DLL 注入的是 Windows API 调用链(CreateRemoteThread + LoadLibraryA),而指针在这里只负责地址传递、内存拷贝和类型转换——用错指针类型或忽略地址空间差异,注入会静默失败或触发 AV。
为什么不能直接用指针写入目标进程代码
指针是进程私有的逻辑地址,p 在你的进程里指向 0x12345678,这个值在目标进程中大概率是非法地址、未映射页或被 ASLR 随机化过。你无法通过 *p = ... 直接改写另一个进程的内存——那属于跨进程写入,必须走 WriteProcessMemory,且目标进程需有 PROCESS_VM_WRITE 权限。
常见错误现象:
- 调用
WriteProcessMemory返回FALSE,GetLastError()是 5(拒绝访问)→ 权限不足或目标进程为保护模式(如 Chrome、Win10/11 的 PPL 进程) - 注入后目标进程崩溃或
LoadLibraryA返回 NULL → 字符串路径指针没正确写入远程内存,或路径含中文/空格未转义 -
VirtualAllocEx分配的内存不可执行 → 忘记设PAGE_EXECUTE_READWRITE,或目标进程启用了 DEP
关键指针操作:远程字符串与函数地址怎么传过去
你需要把 DLL 路径字符串和 LoadLibraryA 地址“搬运”到目标进程空间,这一步全靠指针配合 API:
-
VirtualAllocEx返回的是远程内存地址(LPVOID),你要把它当指针用:auto remotePath = VirtualAllocEx(hProc, nullptr, pathLen, MEM_COMMIT, PAGE_READWRITE); - 用
WriteProcessMemory把本地路径字节拷过去:WriteProcessMemory(hProc, remotePath, localPath.c_str(), pathLen, nullptr);—— 注意这里localPath.c_str()是const char*,不是char*,强制转要小心 -
GetModuleHandleA("kernel32.dll")+GetProcAddress(..., "LoadLibraryA")得到的是当前进程里的函数地址,它和目标进程无关;但 Windows 保证 kernel32 中的导出函数在所有进程地址空间中 RVA 相同(ASLR 下基址不同,但偏移固定),所以可直接用LoadLibraryA的地址作为CreateRemoteThread的起始地址 -
CreateRemoteThread第四个参数(lpParameter)填的就是remotePath,它会被当作LoadLibraryA的唯一参数传入 —— 这个指针值在远程线程上下文中才有效
32/64 位混用时指针长度引发的硬坑
如果你的注入器是 32 位,目标进程是 64 位(或反过来),sizeof(LPVOID) 不同(4 vs 8),所有指针相关 API 全部失效:WriteProcessMemory 写错字节数、CreateRemoteThread 参数错位、远程线程一启动就 crash。
必须严格匹配:
- 注入器和目标进程架构一致(都 x64 或都 x86)
- 不要用
DWORD存 64 位地址(会截断),该用ULONG_PTR或uintptr_t -
VirtualAllocEx的dwSize参数是SIZE_T,不是DWORD;x64 下传DWORD可能导致高位清零 - 调试时用
IsWow64Process检查目标是否为 Wow64 子系统,避免误判
实际注入流程中指针最易错的三处
这不是理论步骤,是实操中反复翻车的位置:
-
remotePath分配后没检查返回值是否为NULL,后续WriteProcessMemory对空指针写入 → 注入器自己崩 - 调用
CreateRemoteThread后没等线程结束就调CloseHandle→ 远程线程可能还在跑,DLL 未完全加载就被卸载 - 用
std::string构造路径但没确保以\0结尾(比如用.data()而非.c_str()),导致LoadLibraryA读越界 → 加载失败或随机模块被拉起
指针在这里不炫技,只干一件事:让地址准确、完整、可解释地抵达目标进程。少一次强制转换,多一次 NULL 检查,比背一百行 shellcode 更接近成功。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











