C++ 加载库与将二进制dll加载到进程中?

C++ 加载库与将二进制dll加载到进程中?,c++,c,winapi,dll,dll-injection,C++,C,Winapi,Dll,Dll Injection,我尝试使用ifstream将dll文件的内容注入远程进程。我使用char*缓冲区来存储dll的内容,然后使用WriteProcessMemory将dll文件的二进制文件注入进程。我使用CheatEngine查看由VirtualAllocEx的结果指向的内存区域,因此我知道写入的数据,因为我看到了我创建的函数之一的文本参数。我只是好奇,LoadLibrary与仅将dll的原始二进制文件加载到进程中有什么不同。简而言之,LoadLibrary执行以下操作: 在内存中映射和重新定位节 处理导入描述符表

我尝试使用
ifstream
将dll文件的内容注入远程进程。我使用
char*
缓冲区来存储dll的内容,然后使用
WriteProcessMemory
将dll文件的二进制文件注入进程。我使用CheatEngine查看由
VirtualAllocEx
的结果指向的内存区域,因此我知道写入的数据,因为我看到了我创建的函数之一的文本参数。我只是好奇,
LoadLibrary
与仅将dll的原始二进制文件加载到进程中有什么不同。

简而言之,
LoadLibrary
执行以下操作:

  • 在内存中映射和重新定位节

  • 处理导入描述符表,加载任何依赖项(如果需要),并填写导入地址表(IAT)

  • 将必要的信息写入流程环境块(PEB),以便在模块列表中找到模块

  • 调用模块加载通知(通常在内核中)

  • 清理新模块上下文

  • 创建激活上下文(如果有清单)

  • 调用入口点(
    DllMain
    ),如果它存在


  • 将二进制映射为图像,但不是线性映射,重新定位和解析导入(可能加载其他DLL)创建激活上下文,如果存在清单,则调用入口点。这是众所周知的。有许多库实现内存模块装入器。阅读他们的来源。很明显这是一次大规模的黑客攻击。你为什么不直接打电话给LoadLibrary呢?或者,如果你想要更多的控制,LoadLibraryEx。我想不出一个好的理由来进行反向工程,这样你就可以手动完成。为什么你认为简单地将DLL文件的内容从一个内存缓冲区复制到另一个就足以“加载”DLL?就复制而言,它只是任意字节,操作系统不会尝试解释被复制的字节。