【问题标题】:How to inline in C++ self modifying assembly code?如何在 C++ 自修改汇编代码中内联?
【发布时间】:2011-10-22 06:34:18
【问题描述】:

如何在 C++ 函数中内联它。

0041F84E   . 7B 02          JPO SHORT Unmodifi.0041F852
0041F850     B8             DB B8
0041F851     00             DB 00
0041F852   . 8B46 38        MOV EAX,DWORD PTR DS:[ESI+38]
0041F855   . 8B56 24        MOV EDX,DWORD PTR DS:[ESI+24]
0041F858   . 8B4E 10        MOV ECX,DWORD PTR DS:[ESI+10]
0041F85B   . 81EA 8B4B8636  SUB EDX,36864B8B

我会怎么写 DB B8 DB 00

void test() {
    __asm {
        ...
        JPO label_0041F852
        __emit 0xB8
        __emit 00
label_0041F852:
        MOV EAX,DWORD PTR DS:[ESI+0x38]
        MOV EDX,DWORD PTR DS:[ESI+0x24]
        MOV ECX,DWORD PTR DS:[ESI+0x10]
        SUB EDX,0x36864B8B
        ...
    }
}

错误 C2400:“操作码”中的内联汇编语法错误;发现“常数” 执行 cl.exe 时出错。

我认为我不能把它放在 .data 部分,我已经读过我能做的就是包含这样的字节。

【问题讨论】:

  • 现代系统一般禁止both writable and executable的程序段。
  • 您是否打算在运行时从外部修改DB 00 字节?我在这个 sn-p 中看不到任何修改任何内容的代码。
  • umm JPO 指令是代码修饰符,如果没有跳转的话。
  • SMC 仍然可以正常工作,只需在可执行文件的 .text 部分指定可执行文件|可写。或者动态分配既可执行又可写的内存。
  • _emit 应该可以工作。

标签: c++ assembly x86 inline-assembly self-modifying


【解决方案1】:

这是回复 SSpoke 的示例请求的答案长度评论。很久以前,当模拟图灵机是一件很酷的事情时,我写了一个图灵机模拟器程序,在 DEC Vax 小型机上搜索busy beavers。当程序决定接下来要尝试哪台图灵机时,它会将图灵机的机器代码编译成一个数组,并像调用函数一样调用该数组。 (所有这些都写在C。)

这是自修改代码。要运行它,您需要一块同时可写和可执行的内存区域。

您的代码不是自我修改的——您根本不写它。所以你可以在一个只读的程序段中运行它。

【讨论】:

    猜你喜欢
    • 2011-06-16
    • 1970-01-01
    • 2012-05-06
    • 2015-02-21
    • 2021-01-19
    • 2015-03-17
    • 2016-05-08
    • 1970-01-01
    相关资源
    最近更新 更多