这段代码做了什么?

时间:2011-09-27 02:46:24

标签: masm masm32

我在网上看到了这个关键记录器,并想知道下面的代码实际上做了什么。连续有2个lodsd命令让我感到困惑。那个或命令的目的是什么? 完整代码可在以下位置找到: 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

1 个答案:

答案 0 :(得分:2)

LODSD将任何ESI点的双字加载到EAX中,然后将ESI递增4(指向下一个双字)。 您正在查看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处执行扫描码的二进制OR,在EAX中的位24处执行扩展键标记,将所有位组合成ECX。 (当一个或两个源位都设置为1时,二进制OR将每个位设置为1,否则为0),然后将该信息传递给GetKeyNameText,以获得32字节字符中按下的键的文本表示,如CAPSLOCK或LEFT SHIFT缓冲液中。