2

我怎样才能在内联汇编中写这个?我想将packet的值写入cave in inline asm的内存位置,怎么办?我可以用 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”相同的方法。

4

1 回答 1

3

如果你想要做的基本上是在内联汇编中重写 WriteProcessMemory(),算了吧,这不会发生。WriteProcessMemory() 是一个操作系统接口,允许您更改另一个进程的虚拟内存空间的内容,无论您使用什么指令,您都无法直接从用户空间进程执行此操作。无论是内联还是在单独的程序集源文件中,任何程序集都无法施展魔法,让您的进程在其虚拟内存沙箱中运行,无需通过操作系统即可写入另一个进程的虚拟内存沙箱。这样做。在您的用户模式程序中运行时,MMU 被设置为让您的进程访问它自己的内存而没有别的。甚至试图访问内存

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

于 2012-12-19T18:00:32.303 回答