【问题标题】:Why some functions need to be injected as DLL files to work为什么需要将某些函数作为 DLL 文件注入才能工作
【发布时间】:2015-05-21 18:54:26
【问题描述】:

所以我最近一直在学习C++,这部分我看不懂,我看到有人在他注入的dll文件中使用了这个函数:

void WriteToMemory(DWORD AddressToWrite, char* ValueToWrite, int byteNum){
unsigned long oldProtection;
VirtualProtect((LPVOID)AddressToWrite, byteNum, PAGE_EXECUTE_READWRITE, &oldProtection);memcpy((LPVOID)AddressToWrite, ValueToWrite, byteNum);

VirtualProtect((LPVOID)AddressToWrite, byteNum, oldProtection, NULL);}

但是当我用普通脚本尝试这个功能时,我的程序一直在崩溃,那么为什么需要先注入它,注入 DLL 文件有什么意义呢?

【问题讨论】:

  • 这与 C++ 无关,真的。 DLL 注入需要对 Windows 进程和内存体系结构有很好的了解。也许另一个项目会更好地开始,比如写一个记事本克隆?
  • 没有明显的原因导致该代码崩溃,您可能只是调用不正确。另一方面,很难想象你一开始会用它做什么。
  • 好吧,我用它来改变游戏的 Opcodes 值,首先我尝试使用 WriteProcessMemory() 函数,但它不起作用,然后我看到这个家伙使用 memcpy() 并且它适用于他,但他必须先注入一个 DLL 文件。

标签: c++ windows memory dll inject


【解决方案1】:

memcpy 是一个函数,旨在用于您拥有且仅此而已的内存。它只会在调用它的当前进程中起作用。

每个进程都有自己的内存。一个进程可以在 0x14141 分配一些东西,另一个可以在 0x14141 分配,并且不会发生冲突,因为该地址是该进程的本地地址。 memcpy 的工作方式相同。它复制到当前进程的地址,不会影响其他进程的内存。

当您尝试在另一个进程拥有的内存上使用它时,如果内存未共享/映射,它将崩溃。它实际上将复制到您当前进程的地址,而不是其他进程。

另一方面,WriteProcessMemory 将在属于其他进程的内存上工作,前提是您具有正确的权限/访问权限。

当这个人将模块注入到另一个进程中时,该模块现在本质上是该进程的一部分,因此可以使用memcpy。就好像进程加载了模块本身一样。该模块是“新”当前进程的一部分。也就是注入进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2013-02-09
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多