1

私はこのキーロガーにオンラインで出くわし、次のコードが実際に何をするのか疑問に思いました。連続して2つのlodsdコマンドがあり、それは私を混乱させます。また、orコマンドの目的は何ですか?完全なコードは次の場所にあります:http: //www.rohitab.com/discuss/topic/21205-asm-keylogger-in-4k-d/

コードの抜粋(295行目以降)は次のとおりです。

get_name_of_key:        ; no need for large table of pointers to get asciiz

mov esi, [lParam]

lodsd           ; skip virtual key code

lodsd           ; eax = scancode

shl eax, 16

xchg    eax, ecx

lodsd           ; extended key info

shl eax, 24

or  ecx, eax



push    32

lea edi, [lpCharBuf]

push    edi

push    ecx

call    GetKeyNameTextA ; get the key text
4

1 に答える 1

3

LODSDは、ESIが指しているものからEAXにdwordをロードし、ESIを4ずつインクリメントします(次のdwordを指します)。低レベルのキーボードフックコールバックを表示しています。MSDNによると、コールバックを呼び出すと、lParamのKBDLLHOOKSTRUCTへのポインターが配置されます。MOVESI 、[lParam]は、後でLODSDで使用できるようにそのポインターをESIに配置します。

この構造には、仮想キーコード、スキャンコード、いくつかのフラグ、タイムスタンプ、および追加情報へのポインターが含まれ、それぞれがDWORDの長さです。したがって、最初のLODSDはvkcodeをEAXに読み込み、次のLODSDはスキャンコードをEAXに読み込みます(そして上書きします)。次に、スキャンコードをビット0〜7からビット16〜23にシフトして、後でGetKeyNameTextで使用できるようにします。。その後、EAXとECXが交換されます。次のLODSDは、キーの押下に関連するフラグを読み取ります。拡張キー(Fxxまたはテンキーからのキーなど)が押されたかどうかを示すフラグはビット0にあり、それと他のビットはビット24以降にシフトされます。次に、ORは、ECXのビット16〜23でスキャンコードのバイナリORを実行し、EAXのビット24で拡張キーフラグを実行して、すべてのビットをECXに結合します。(バイナリORは、ソースビットのいずれかまたは両方が1に設定されている場合は各ビットを1に設定し、それ以外の場合は0に設定します)、その情報はGetKeyNameTextに渡され、CapsLockやLEFTSHIFTなどの押されたキーのテキスト表現を32バイト文字で取得します。バッファ。

于 2011-09-29T01:35:31.423 に答える