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/