将十六进制操作码解码为asm或在__asm中运行十六进制?

时间:2012-12-28 18:28:55

标签: c visual-c++ assembly

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

EB D2

和“解码”或以其他方式将这些翻译成人类可读的asm?

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

2 个答案:

答案 0 :(得分:4)

调试器反汇编窗口相当不错。

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

或者您可以查找独立的反汇编程序

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

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

答案 1 :(得分: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

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