64ビット駆動で組み込みアセンブリを実現

1428 ワード

CPUの情報を取得するには、CPU IDコマンドを使用しなければならないなど、アセンブリ言語を使用しなければならない操作もありますが、64ビットのマイクロソフトコンパイラではアセンブリの組み込みが許可されていません.どうすればいいのでしょうか.標準的な方法はASMファイルとCファイルを混合してコンパイルすることであるが,この方法は特に小段のアセンブリを埋め込む場合に面倒である.だから私の解決策は、ソフトウェアでアセンブリをマシンコードに変換し、直接マシンコードを実行することです.64ビットアセンブリ変換マシンコードのツールは私のX 64 ASMを使うことができます.TO_X64BIN(http://www.vbasm.com/thread-5651-1-1.html).まずX 64 ASMの使い方についてお話ししますTO_X64BIN.X 64 ASM_を使用するにはTO_X 64 BINはまずMASM 64圧縮パッケージをダウンロードしなければならない(http://www.m5home.com/bbs/thread-5170-1-1.html).ダウンロードが完了したら、この圧縮パッケージをCディスクルートディレクトリに解凍する必要があります(つまり、解凍が完了した後、CディスクにMASM 64フォルダがあります):次に、インストールする必要があります.NET FRAMEWORK 4(http://www.microsoft.com/zh-cn/download/details.aspx?id=17718)をクリックします.この2つのステップを設定した後、アセンブリコードを入力し、『Get BIN with C/C++Style』ボタンを押すと、アセンブリコードをマシンコード(SHELCODE)に変換できます.
次に、埋め込まれたアセンブリサブルーチンに戻り値を持たせ、アセンブリサブルーチンにパラメータを渡す方法について説明します.まずtypedefを使ってあなたのアセンブリサブルーチンのプロトタイプを定義し、マシンコードをNonPagedPoolにコピーし、最後に直接NonPagedPoolのアドレスを関数としてCALLにします.コードの例は次のとおりです(4つの数値を入力して加算し、加算した値を返します).
typedef UINT64 (__fastcall *SCFN)(UINT64,UINT64,UINT64,UINT64);
VOID test()
{
SCFN scfn;
 UINT64 ret;
 UCHAR strShellCode[14]="\x48\x03\xCA\x49\x03\xC8\x49\x03\xC9\x48\x8B\xC1\xC3";
 /*
 add rcx,rdx
 add rcx,r8
 add rcx,r9
 mov rax,rcx
 ret
 */
 scfn=ExAllocatePool(NonPagedPool,14);
 memcpy(scfn,strShellCode,14);
 ret=scfn(11,22,33,44);
 DbgPrint("[x64Drv] Inline ASM return: %lld",ret);
 ExFreePool(scfn);
}