1

Visual Studio 2010(或 Windows 上的其他工具)中是否有任何方法可以采用十六进制操作码指令,例如

EB D2

和“解码”或以其他方式将它们翻译成人类可读的汇编?

或者,有没有办法直接在一个__asm块中运行十六进制指令?

4

2 回答 2

4

调试器反汇编窗口在这方面做得很好。

Visual Studio 有一个。WinDbg 有一个(或u在命令行中用于“反汇编”)。其他调试器,如 OllyDbg 或 IDA Pro 可能符合要求。

或者你可以寻找一个独立的反汇编程序。

就此而言,您可以找到交互式在线反汇编程序。

http://www.onlinedisassembler.com/odaweb/run_hex说 EB D2 是一个跳转指令。

于 2012-12-28T18:33:53.517 回答
4

因为您提到了 Visual Studio,所以我假设您正在寻找内部工具,或者您正在使用 MASM。NASM 有自己的反汇编器,但它的语法与 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块。

附录

该程序在运行 Mountain Lion 的 MacBook Pro 上仍然可以正常运行:

$ 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

正如在下面的评论中所指出的,如果字符串位于操作系统不允许执行的段中,这种解决方案将不起作用。

于 2012-12-28T18:38:22.977 回答