16

x86/x64 アセンブリ文字列をオペコードにアセンブルするための C ライブラリはありますか?

コード例:

/* size_t assemble(char *string, int asm_flavor, char *out, size_t max_size); */

unsigned char bytes[32];
size_t size = assemble("xor eax, eax\n"
                       "inc eax\n"
                       "ret",
                       asm_x64, &bytes, 32);

for(int i = 0; i < size; i++) {
    printf("%02x ", bytes[i]);
}

/* Output: 31 C0 40 C3 */

asmpureを見てきましたが、Windows 以外のマシンで実行するには変更が必要です。

実際にはアセンブラと逆アセンブラの両方が必要ですが、両方を提供するライブラリはありますか?

4

7 に答える 7

9

幽霊のように見える図書館があります。その存在は広く知られていません:

XED (X86 エンコーダー デコーダー)

インテルが書いた: https://software.intel.com/sites/landingpage/pintool/docs/71313/Xed/html/

Pin でダウンロードできます: https://software.intel.com/en-us/articles/pintool-downloads

于 2015-05-06T20:11:21.910 に答える
2

You might want libyasm (the backend YASM uses). You can use the frontends as examples (most particularly, YASM's driver).

于 2014-11-06T17:42:41.587 に答える
1

fasm.dll を使用しています: http://board.flatassemblyr.net/topic.php?t=6239 PE 形式でない場合は、コードの先頭に「use32」と書くことを忘れないでください。

于 2015-03-07T05:33:09.623 に答える
0

アセンブリを独自のファイルに書き込んでから、 を使用して C プログラムから呼び出しますextern。Makefile のトリックを少し行う必要がありますが、それ以外はそれほど悪くはありません。アセンブリ コードは C の規則に従う必要があるため、次のようになります。

          global _myfunc 
_myfunc:  push ebp               ; create new stack frame for procedure 
          mov ebp,esp            ;
          sub esp,0x40           ; 64 bytes of local stack space 
          mov ebx,[ebp+8]        ; first parameter to function 
          ; some more code 
          leave                  ; return to C program's frame
          ret                    ; exit

C 変数の内容を取得したり、C がアクセスできる変数を宣言したりするには、名前を GLOBAL または EXTERN として宣言するだけで済みます。(繰り返しになりますが、名前には先頭にアンダースコアが必要です。) したがって、int i として宣言された C 変数は、アセンブラーから次のようにアクセスできます。

extern _i 
mov eax,[_i]

また、C プログラムが extern int j としてアクセスできる独自の整数変数を宣言するには、次のようにします (必要に応じて、_DATA セグメントでアセンブルしていることを確認してください)。

    global _j 
_j        dd 0

Cコードは次のようになります

extern void myasmfunc(variable a);

int main(void)
{
    myasmfunc(a);
}

ファイルをコンパイルし、次を使用してそれらをリンクします

gcc mycfile.o myasmfile.o
于 2013-07-03T14:03:47.560 に答える