【问题标题】:inline asm write value to memory内联 asm 将值写入内存
【发布时间】:2012-12-20 02:12:51
【问题描述】:

我怎样才能在内联 asm 中写这个?我想将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) 会做的事情,我只是在寻找与内联汇编的“WriteProcessMemory”相同的方法。

【问题讨论】:

  • 您使用的是哪个编译器和操作系统?
  • 为什么是内联汇编?为什么不简单地memcpy((void*)cave, (void*)packet, length*sizeof(BYTE))
  • 你是为 64 位编译的吗?如果是这样,那么您对 ​​MSVS 不走运,因为它不支持 x86-64 的内联汇编。
  • 32bit,我想用 inline asm 来做,因为这就是我想要学习的。
  • 但是 ty memcopy 可以完成这项工作

标签: c++ c assembly


【解决方案1】:

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

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

【讨论】:

  • 不,我只是想将数据包复制到位于洞穴的内存中。我正在做这个进程内,而不是像 WriteProcessMemory 那样在外部工作
  • @Dean - 好的,那你为什么要使用 VirtualAllocEx() 来分配内存,为什么要使用 WriteProcessMemory() 在你自己的进程中复制内存?
  • 我分配内存来存储值,我试图不为此使用 WriteProcessMemory,这就是我寻求帮助的原因。
  • @Dean - 如果您在自己的进程空间内,那么 memcpy() 应该可以工作。如果 memcpy() 有效,您就不必在内联汇编中编写代码。 memcpy() 应该足够快。在一般情况下,你不能比 memcpy() 更快,因为大多数系统的 memcpy() 都是高度优化的。如果您将宽数据(比一个字节宽)从一个对齐位置写入另一个对齐位置,您只能比 memcpy() 快一点。
猜你喜欢
  • 2011-11-29
  • 1970-01-01
  • 2018-10-05
  • 2013-07-04
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多