【问题标题】:Implementing reflection in x86 assembly (editing the program whilst running)在 x86 程序集中实现反射(在运行时编辑程序)
【发布时间】:2014-08-31 20:28:54
【问题描述】:

我想编写一个汇编程序,该程序一旦加载到内存中,就会在自身上写入新指令,但我不能 100% 确定如何进行,因为我对指令指针和其他汇编概念有一些疑问。我假设的方法:

_func:

    push rip    ; Not allowed to push RIP, how can I read from RIP?
    jmp stage1

    stage2:

    mov eax, 0
    ret

    stage1:

    pop rbx

    ; How many times should I increment rbx to point to ‘mov eax, 0’?
    ; Assuming this is done:

    ;Move opcodes for ‘mov eax, 1’ into memory where ‘mov eax, 0’ located

    mov [rbx], 0xB8
    mov [rbx+1], 0x01
    mov [rbx+2], 0x00
    mov [rbx+3], 0x00
    mov [rbx+4], 0x00

    jmp stage2

当它跳转到阶段 2 时,它会遇到操作码 'B8 01 00 00 00' 而不是 'mov eax, 0' 并解释 'mov eax, 1'。我的一般方法是否正确,有人可以填补代码中的空白吗?


其他困惑/问题

RBX 是指向指令行的第一个字节,还是“整个”行?上述方法是否正确,或者我应该写:

mov [rbx], B801000000h

操作系统: Mac OS X 10.9 汇编器: NASM

【问题讨论】:

标签: assembly


【解决方案1】:

在 16 位“实模式”下:

mov bx, stage2      ; NASM get offset address

mov cs:[bx], 0xB8
mov cs:[bx+1], 0x01
mov cs:[bx+2], 0x00
mov cs:[bx+3], 0x00
mov cs:[bx+4], 0x00

【讨论】:

    【解决方案2】:

    在 16 位“实模式”中,这样​​做很简单。当我开始汇编程序编程时,我使用反射实现了一个循环。

    但是在 16 位或 32 位“保护模式”或“长模式”(64 位)下,这更棘手:

    在这些模式下,可以保护内存不被覆盖。由于“Pentium Pro”处理器还可以保护内存不被执行。

    Windows 和 Linux 都使用这些功能,因此默认情况下可修改的内存不能包含可执行代码,并且包含可执行代码的内存不能被覆盖。

    您必须分配可写和可执行的内存(或更改现有内存的内存访问)。请参阅 Windows 中的“VirtualAlloc”和“VirtualProtect”函数或 Linux 中的“mmap”和“mprotect”。然后你必须将代码移动到那块内存中。

    顺便说一句:下面的命令是错误的:

    jmp stage1
    

    它必须是“call”而不是“jmp”,因为“jmp”不会将返回地址“压入”堆栈。

    【讨论】:

    • 在 Mac OS X 上,VirtualAlloc 等函数的等价物是什么?
    • 据我所知,Mac OS X 与 Linux 类似,所以它应该(我不确定!)也应该是“mmap”。但是我知道 iOS 不允许既可写又可执行的内存。也许 Mac OS X 也不允许。在这种情况下,反射是不可能的。
    • 如果我在内核权限级别(即 ring 0)运行代码,是否可以绕过使用 mmap?
    • 在内核级别,您需要不同于 mmap 或 VirtualAlloc 的函数。不幸的是,我对这三个操作系统中的内核编程知之甚少,所以我不知道在那里使用哪些函数。然而,在环 0 中,内存页面也有访问标志,因此您无法写入受写保护的内存,也无法在受执行保护的内存中执行代码。
    • 假设没有内存限制,我移动操作码的代码是否正确? (忽略其余代码,即加载 rip 等。只是最后几行。)
    猜你喜欢
    • 2011-02-08
    • 2012-03-20
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多