Что делает этот кусок кода? - PullRequest
1 голос
/ 27 сентября 2011

Я наткнулся на этот регистратор ключей в Интернете, и мне было интересно, что на самом деле делает следующий фрагмент кода.Есть две команды 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 Ответ

2 голосов
/ 29 сентября 2011

LODSD загружает слово из того, на что указывает ESI, в EAX, а затем увеличивает ESI на 4 (указывая на следующее слово). Вы просматриваете низкоуровневый обратный вызов клавиатуры , в соответствии с MSDN вызов обратного вызова поместит указатель на KBDLLHOOKSTRUCT в lParam, MOV ESI, [lParam] помещает это указатель в ESI для последующего использования LODSD.

Структура содержит виртуальный ключевой код, за которым следуют код сканирования, некоторые флаги, временную метку и указатель на дополнительную информацию, каждая длиной в DWORD. Таким образом, первый LODSD считывает vkcode в EAX, а следующий читает код сканирования в (и перезаписывает) EAX. Затем он сдвигает код сканирования с битов 0-7 на биты 16-23 для последующего использования GetKeyNameText . EAX и ECX затем меняются местами. Следующий LODSD считывает флаги, связанные с нажатием клавиши, флаг, который указывает, была ли нажата расширенная клавиша (Fxx или клавиши от цифровой клавиатуры и т. Д.), На бит 0, он и другие биты сдвинуты на бит 24 и далее, заполняя младшие биты 0. Затем ИЛИ выполняет двоичное ИЛИ скан-кода в битах 16-23 в ECX и флаг расширенного ключа в бите 24 в EAX, объединяя все биты в ECX. (Двоичное ИЛИ устанавливает каждый бит в 1, когда один или оба исходных бита установлены в 1, в противном случае 0), эта информация затем передается в GetKeyNameText, чтобы получить текстовое представление нажатой клавиши, например CAPSLOCK или LEFT SHIFT, в 32-байтовом символе буфер.

...