Visual Studio 2010(或Windows上的其他工具)中是否有任何方法可以接受十六进制操作码指令,例如。
EB D2
然后“解码”或者以其他方式将它们翻译成人类可读的asm?
或者,有没有办法直接在__asm块中运行十六进制指令?

最佳答案

因为您提到了Visual Studio,所以我认为您正在寻找内部工具,或者可能正在使用MASMNASM有自己的反汇编程序,但其语法与MASM的不同。
我知道有一个老把戏,至少多年前用过。可以将字符串强制转换为C语言中的函数,如下所示:

/*
 * Illustration of executing machine code as a C string.  Works on an
 * IA-32 processor.
 */

#include <stdio.h>

int (*f)() = "\xb0\x64\x0f\xb6\xc0\xc3";

int main() {
    printf("%d\n", f());
    return 0;
}

在这里,函数f将值100移到eax寄存器中并返回它(C3是返回的操作码)不确定这是否适用于Visual Studio的C语言,如果使用的是64位处理器,则可能需要对其进行更新它确实为__asm块提供了一个有趣的替代方案。
附录
该程序在MacBook Pro running Mountain Lion上仍然运行良好:
$ cat hundred.c
#include <stdio.h>

int (*f)() = "\xb0\x64\x0f\xb6\xc0\xc3";

int main() {
    printf("%d\n", f());
    return 0;
}

$ gcc hundred.c && ./a.out
hundred.c:3: warning: initialization from incompatible pointer type
100

正如下面的注释所指出的,如果字符串位于O.S.不允许执行的段中,这种解决方案将不起作用。

关于c - 将十六进制操作码解码为asm或在__asm中运行十六进制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14074040/

10-14 17:06