gpt4 book ai didi

c++ - 内联 asm 将值写入内存

转载 作者:搜寻专家 更新时间:2023-10-31 01:51:20 24 4
gpt4 key购买 nike

我怎样才能在内联汇编中写这个?我想在内联汇编中将数据包的值写入洞穴的内存位置,如何?我可以用 WriteProcessMemory 做到这一点,但我想摆脱它并用 asm 替换

int SendToClient(BYTE *packet, int Length)
{
int cave = (int)VirtualAllocEx(hProcess, NULL, Length, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

if (WriteProcessMemory(hProcess, (void*)cave, packet, Length, NULL))
{

}

__asm
{
//how?
}
}

例如,假设我想从地址 senderOffset 读取我会做的:

int GetSenderID()
{
int value;

__asm
{
mov eax, senderOffset
mov value, eax
}


return *(int*)value;
}

这是在做“ReadProcessMemory(GetCurrentProcess(), (VOID*)senderOffset, &value, 0) 会做的事情,我只是在寻找与使用内联 asm 的“WriteProcessMemory”相同的方法。

最佳答案

如果您想做的实际上是在内联汇编中重写 WriteProcessMemory(),那就算了,这不会发生。 WriteProcessMemory() 是一个操作系统接口(interface),它允许您更改另一个进程的虚拟内存空间的内容,无论您使用什么指令,您都不能直接从用户空间进程执行此操作。再多的程序集,无论是内联的还是在单独的程序集源文件中,都无法施放允许您的进程在其虚拟内存沙箱中运行所需的魔法,无需通过操作系统即可写入另一个进程的虚拟内存沙箱这样做。在您的用户模式程序中运行时,MMU 设置为让您的进程访问它自己的内存而不是其他任何东西。即使尝试访问未分配给您的进程的内存也会给您带来某种访问冲突错误(在 Linux 领域称为 SIGSEGV;不过我知道您使用的是 Windows)。

要访问另一个进程地址空间中的内存,您必须调用操作系统来执行此操作。每个系统都有一种可控的方式来进行操作系统调用,将处理器从用户模式切换到内核模式。在 x86 中,这些被称为“环”,操作系统在最高权限的“环 0”中运行,用户模式代码在最低权限的“环 3”中运行。司机在另外两个环中运行。您不能简单地将 CPU 从 ring 3 切换到 ring 0;尝试这样做会触发特权冲突。在 ring 3 内,您不能更改 MMU 以允许您的进程访问(读取或写入或执行)另一个进程的内存空间。

关于c++ - 内联 asm 将值写入内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13958190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com