Visual Studio 2010 (または Windows 上の他のツール) に、16 進数のオペコード命令を使用できる手段はありますか?
EB D2
そして、これらを人間が読める形式の asm に「デコード」またはその他の方法で変換しますか?
または、16 進命令を__asm
ブロック内で直接実行する方法はありますか?
Visual Studio 2010 (または Windows 上の他のツール) に、16 進数のオペコード命令を使用できる手段はありますか?
EB D2
そして、これらを人間が読める形式の asm に「デコード」またはその他の方法で変換しますか?
または、16 進命令を__asm
ブロック内で直接実行する方法はありますか?
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
は return のオペコードです)。それが 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
以下のコメントで指摘されているように、OS が実行を許可しないセグメントに文字列がある場合、この種のソリューションは機能しません。
デバッガーの逆アセンブリ ウィンドウは、その点で非常に優れています。
Visual Studio には 1 つがあります。WinDbg には 1 つ (またはu
コマンド ラインで「アンアセンブル」するため) があります。OllyDbg や IDA Pro などの他のデバッガーが適している場合があります。
または、スタンドアロンの逆アセンブラを探すこともできます。
さらに言えば、インタラクティブなオンライン逆アセンブラーを見つけることができます。
http://www.onlinedisassemblyr.com/odaweb/run_hexは、EB D2 がジャンプ命令であると述べています。