内联asm将值写入内存

时间:2012-12-19 17:51:33

标签: c++ c assembly

我如何在内联asm中写这个?我想把数据包的值写入内联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“相同的方法。

1 个答案:

答案 0 :(得分:3)

如果您想要做的事情本质上是在内联汇编中重写WriteProcessMemory(),那就忘了它,它就不会发生。 WriteProcessMemory()是一个操作系统界面,允许您更改另一个进程的虚拟内存空间的内容,无论您使用何种指令,都无法直接从用户空间进程执行此操作。无论是内联还是在单独的汇编源文件中,任何数量的汇编都无法投射所需的魔法,以允许您的进程在其虚拟内存沙箱中运行,无需通过操作系统写入另一个进程的虚拟内存沙箱这样做。在用户模式程序中运行时,MMU设置为允许您的进程访问自己的内存和存储器。没有其他的。即使尝试访问未分配给您的进程的内存也会给您带来某种访问冲突错误(在Linux版本中称为SIGSEGV;但我知道您在Windows上)。

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