aq
Size: a a a
aq
E
aq
E
aq
aq
E
push arg1На x64 читай тут:
push arg2
call dword[Function]
aq
E
{
В самом начале есть функция, которой требуется дескриптор, дескриптор получается другой функцией. Желательно сначала получить нужные дескрипторы для работы, а потом работать с основной функцией.
ReadConsoleA нужен дескриптор на ввод в консоль - hConsoleInput
Заходишь на ссылку в описании аргумента (Console Buffer Security and Access Rights), и видишь функции, в которых упоминается этот раздел - CreateFile, CreateConsoleScreenBuffer, GetStdHandle, внимательно прочитав каждую, ты поймёшь, что тебе нужен GetStdHandle (Retrieves a handle to the specified standard device) - в нём есть аргумент STD_INPUT_HANDLE, отвечающий за "The standard input device. Initially, this is the console"
Передаёшь функции определение STD_INPUT_HANDLE, которое ниже - "-10", и он тебе возвращает хэндл для hConsoleInput:
push -10
call dword[GetStdHandle]
}
(Итак, слева-направа (с конца), через стэк - x86):push 0 ; Последний параметр ReadConsoleA - pInputControl, читаешь - "For ANSI mode, set this parameter to NULL.", пишешь 0 для ANSI
Потом следующий аргумент с конца - lpNumberOfCharsReadcharsRead dd 0И передаёшь указатель:
push charsReadДальше - nNumberOfCharsToRead - читаешь - (в общем) "сколько нужно считать символов", и пишешь:
push 128 ; Вместо 128 передаёшь сколько тебе нужно. Обычно нужно передавать размер, равный размеру массива, в который ты считываешьlpBuffer - сам массив, куда ты считываешь данные, нужен указатель
buf db 128 dup(0)И передаёшь адрес (указатель):
push bufДалее нужен полученный ранее дескриптор на ввод. GetStdHandle должен был вернуть тебе его в EAX, после проверки на то, правильное ли он значение тебе вернул (смотри в MSDN раздел "Return value", там написаны значения, которые функция возвращает при неверном поведении), передаёшь его в
ReadConsoleA
push eaxНу и вызываешь функцию:
call dword[ReadConsoleA]
Общий код будет выглядеть так:; Это в .data
charsReaded dd 0 ; Сколько байтов успешно прочитано
buf db 128 dup(0) ; Здесь будут прочитанные данные
sizeof.buf = $ - buf
; Код
push -10 ; STD_INPUT_HANDLE
call dword[GetStdHandle]
test eax, eax
jle .error ; Прыгнуть на .error, если вернулся неверный дескриптор для ввода в консоль
push 0
push charsReaded
push sizeof.buf
push buf
push eax
call dword[ReadConsole]
P
LG
ВН
ВН
ВН