1

Visual Studio 2010 (または Windows 上の他のツール) に、16 進数のオペコード命令を使用できる手段はありますか?

EB D2

そして、これらを人間が読める形式の asm に「デコード」またはその他の方法で変換しますか?

または、16 進命令を__asmブロック内で直接実行する方法はありますか?

4

2 に答える 2

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は 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 が実行を許可しないセグメントに文字列がある場合、この種のソリューションは機能しません。

于 2012-12-28T18:38:22.977 に答える
4

デバッガーの逆アセンブリ ウィンドウは、その点で非常に優れています。

Visual Studio には 1 つがあります。WinDbg には 1 つ (またはuコマンド ラインで「アンアセンブル」するため) があります。OllyDbg や IDA Pro などの他のデバッガーが適している場合があります。

または、スタンドアロンの逆アセンブラを探すこともできます。

さらに言えば、インタラクティブなオンライン逆アセンブラーを見つけることができます。

http://www.onlinedisassemblyr.com/odaweb/run_hexは、EB D2 がジャンプ命令であると述べています。

于 2012-12-28T18:33:53.517 に答える