Visual Studio 2010(或 Windows 上的其他工具)中是否有任何方法可以采用十六进制操作码指令,例如
EB D2
和“解码”或以其他方式将它们翻译成人类可读的汇编?
或者,有没有办法直接在一个__asm
块中运行十六进制指令?
Visual Studio 2010(或 Windows 上的其他工具)中是否有任何方法可以采用十六进制操作码指令,例如
EB D2
和“解码”或以其他方式将它们翻译成人类可读的汇编?
或者,有没有办法直接在一个__asm
块中运行十六进制指令?
调试器反汇编窗口在这方面做得很好。
Visual Studio 有一个。WinDbg 有一个(或u
在命令行中用于“反汇编”)。其他调试器,如 OllyDbg 或 IDA Pro 可能符合要求。
或者你可以寻找一个独立的反汇编程序。
就此而言,您可以找到交互式在线反汇编程序。
http://www.onlinedisassembler.com/odaweb/run_hex说 EB D2 是一个跳转指令。
因为您提到了 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
正如在下面的评论中所指出的,如果字符串位于操作系统不允许执行的段中,这种解决方案将不起作用。