【发布时间】: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