1

X64 用に作成された ASM ファイルがあります。リーフ機能を提供します。このファイルは MASM64/ML64 でアセンブルされています。

署名付きの C 疑似コードは次のとおりです。

int GenerateBlock(byte* ptr, size_t size, unsigned int safety)
{
    if (ptr == NUL) return 0; /*FAIL*/
    ...
}

ASM コードの同じ部分を次に示します。

;; RCX (in): byte* buffer
;; RDX (in): size_t bsize
;; R8d (in): unsigned int safety
;; RAX (out): bool, success (1), failure (0)

ASM_GenerateBlock PROC buffer:QWORD,bsize:QWORD,safety:DWORD
    LOCAL val:QWORD         ;; local variables
    MWSIZE EQU 8            ;; machine word size

            ;; Validate pointer
    cmp     buffer, 0
    je      ASM_GenerateBlock_Cleanup
            ;; Cleanup will set RAX to 0 and return
    ...
ENDP

呼び出しを実行するfastcallと、使用されているように見えますが、これはドキュメントと一致しています。最初の 2 つの引数は と に表示されますがRCXRDXこれも一貫しています。

しかし、NULLポインターを使用したテスト ケースは、予期しない結果を生成しています。使用されているテストケースは次のとおりです。

ASM_GenerateBlock(NULL /*ptr*/, 64 /*size*/, 20 /*safety*/);

コードをステップ実行すると、 (its ) のように見えますが、(its ) のRCXように見えますが、未知の値に対して比較が行われています。即時ウィンドウから:bufferNULLRDXbsize0x40cmp buffer, 0

buffer
0x000000013f82bcd0
*(__int64*)buffer
0x000000013f62aba8
bsize
0x000000013f14871b
*(__int64*)bsize
0xccccccc348c48348

13f82bcd0命令ポインターのアドレス (EIP は13F50D268) のように見えます。ESPまたはとは似ていないようEBPです。

いくつかの質問を聞きたいんです...

  • ML64 が変数に使用しているアドレッシング モードは何bufferですか?
  • 変数の値はどこbufferから来ていますか?
  • なぜ変数に使用しML64 ないのですか?ECXbuffer
  • どうすればこれを修正できますか?

32 ビットに短縮された同じコードは、正常にアセンブルおよび実行されます。ただし、ML はbufferbsizeをスタックに置き、 に対して相対的にアドレス指定しますEBP

にも変更してみましcmp QWORD PTR buffer, 0たが、だめでした。


ここに画像の説明を入力

4

2 に答える 2

2

最後のスクリーンショットの分解から、

cmp  buffer, 0

に組み立てています

cmp  qword ptr [buffer], 0   # memory operand.  rip-relative?  or stack-relative?  Not enough insn bytes for an absolute 32bit address

それ以外の

cmp  RCX, 0

したがって、使用しているアセンブリ構文はbuffer、レジスタのエイリアスとしてではなく、シンボルまたはメモリ オフセットなどとして宣言します。そうです、x86-64 Windows ABI はレジスタ呼び出し規則を使用します (残念ながら、Linux とは異なるものです)。fastcall32ビットABI に似ていると思います。Agner Fogは、32 ビットおよび 64 ビット OS のさまざまな呼び出し規則を説明するドキュメントを持っています。


即値ゼロの cmp は、ほとんどの場合、 よりも悪い選択であることに注意してくださいtest rcx, rcx。insn エンコーディングが短くなり、jccIntel と AMD の次のマクロと融合します。

于 2015-10-15T01:35:09.743 に答える