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 指向的任何 dword 加载到 EAX 中,然后将 ESI 递增 4(指向下一个 dword)。您正在查看低级键盘挂钩回调,根据 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 时,二进制或将每个位设置为 1,否则为 0),然后将该信息传递给 GetKeyNameText 以获取按下的键的文本表示形式,如 CAPSLOCK 或 LEFT SHIFT,在 32 字节字符中缓冲。

于 2011-09-29T01:35:31.423 回答