为什么有些函数需要作为DLL文件注入才能工作 我最近一直在学习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文件中使用这个函数: 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);},c++,windows,memory,dll,inject,C++,Windows,Memory,Dll,Inject,但是,当我用普通脚本尝试这个函数时,我的程序一直在崩溃,那么为什么需要先注入它,注入DLL文件又有什么意义呢?memcpy是一个要在您拥有的内存上使用的函数,仅此而已。它将只在调用它的当前进程中工作 每个进程都有自己的内存。一个进程可以在0x14141处分配某些内容,另一个进程可以在0x14141处分配,并且不会发生冲突,因为地址是该进程的本地地址memcpy的工作方式相同。它复制到当前进程的地址,不会影响其他进程中的内存 当您试图在另一个进程拥有的内存上使用它时,如果该内存未共享/映射,它将崩

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

memcpy
是一个要在您拥有的内存上使用的函数,仅此而已。它将只在调用它的当前进程中工作

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

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

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


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

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