2011-09-27 116 views
1

我在網上遇到這個關鍵記錄器,想知道下面這段代碼實際上做了什麼。有兩個連續的命令,令我困惑。那裏還有什麼命令? 全碼,可以發現: 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 

回答

2

LODSD裝載來自任何ESI點一個DWORD到到EAX,然後通過4遞增ESI(指向下一個雙字)。 您正在查看low level keyboard hook callback,根據MSDN調用回調會在lParam中放置一個指向KBDLLHOOKSTRUCT的指針,MOV ESI,[lParam]將該指針放在ESI中供LODSD稍後使用。

該結構包含虛擬鍵碼,後跟掃描碼,一些標誌,時間戳和指向額外信息的指針,每個DWORD長。因此,第一個LODSD將vkcode讀入EAX,接下來將掃描代碼讀入(並覆蓋)EAX。然後它將掃描碼從0-7位移到16-23位,以便以後使用GetKeyNameText。然後交換EAX和ECX。 下一個LODSD讀取與按鍵相關的標誌,指示擴展的鍵(Fxx或鍵盤等的鍵)是否被按下的標誌在位0,其它位移到位24及其後的位,用0填充低位.OR然後在ECX中的位16-23處執行掃描碼的二進制或,並且在EAX中將位24中的擴展密鑰標記組合到ECX中。 (當一個或兩個源位設置爲1時,二進制OR將每個位設置爲1,否則爲0),然後將該信息傳遞給GetKeyNameText以獲取按下的鍵的文本表示,如CAPSLOCK或LEFT SHIFT,以32字節字符緩衝。