内联ASM将值写入内存

inline asm write value to memory

本文关键字:内存 ASM 内联      更新时间:2023-10-16

如何在inline 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)会做的,我只是在寻找使用Inline ASM的" writeProcessMemory"的方法。

如果您想做的是在内联汇编中重写writeProcessMemory(),请忘记它,它不会发生。writeProcessMemory()是一个OS接口,可让您更改另一个过程的虚拟内存空间的内容,无论使用哪种说明,您都无法直接从用户空间过程中进行操作。无论是内联还是在单独的汇编源文件中,没有任何装配物都能够施放允许您的过程所需的魔法法术,从编写到另一个过程的虚拟内存沙盒中,而无需通过OS到另一个过程的虚拟内存沙盒这样做。在您的用户模式程序中操作时,设置了MMU,以使您的流程访问其自己的内存&没有其他的。即使尝试访问未分配给您的过程的内存也会给您某种访问违规错误(这在Linux-Land中称为SigSeGV;我知道您在Windows上)。

要在另一个过程的地址空间中访问内存,您必须在操作系统上呼叫。每个系统都有一种控制操作调用的控制方法,可以将处理器从用户模式切换到内核模式。在X86中,这些被称为"环",其中OS在最私密的" Ring 0"中运行,并且在最不私有的" Ring 3"中运行的用户模式代码。驾驶员在其他两个环中操作。您不能简单地将CPU从环3转换为环0;试图这样做会引发特权侵犯。在环3中,您无法更改MMU以允许您的过程访问(读取或写下或执行)其他过程的内存空间。