Visual Studio 2010(或Windows上的其他工具)中是否有任何可以采用十六进制操作码指令的方法,例如
EB D2
和“解码”或以其他方式将这些翻译成人类可读的asm?
或者,有没有办法直接在__asm
块中运行十六进制指令?
答案 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.的段中,则这种解决方案将不起作用。不会允许执行。