我在网上看到了这个关键记录器,并想知道下面的代码实际上做了什么。连续有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
答案 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缓冲液中。