Konstantin18ko
@Konstantin18ko
Стоматолог

Что делает данный участок кода?

format PE console 4.0
 
include 'win32ax.inc'
ENABLE_PROCESSED_OUTPUT  = 00000001h
 
    invoke  AllocConsole
    invoke  GetStdHandle, STD_INPUT_HANDLE
        push    eax
        push    eax
    invoke  GetStdHandle, STD_OUTPUT_HANDLE
        push    eax
    invoke  SetConsoleMode, eax, ENABLE_PROCESSED_OUTPUT
        pop eax
    invoke  WriteConsole, eax, hello, msgsz, NULL, NULL
    invoke  FlushConsoleInputBuffer
        pop eax
    invoke  ReadConsole, eax, buf, bufsz, cnt, NULL
    invoke  FreeConsole
    invoke  ExitProcess,0
 
cnt dd  ?
buf db  10 dup(?)
bufsz   =   $ - buf
hello   db  'Hello World!',0
msgsz   =   $ - hello
 
data import
 
 library kernel32,'KERNEL32.DLL'
 
 import kernel32,\
    ExitProcess,'ExitProcess',\
    SetConsoleCP,'SetConsoleCP',\
    SetConsoleOutputCP,'SetConsoleOutputCP',\
    GetStdHandle,'GetStdHandle',\
    SetConsoleMode,'SetConsoleMode',\
    ReadConsole,'ReadFile',\
    WriteConsole,'WriteConsoleA',\
    FreeConsole,'FreeConsole',\
    FlushConsoleInputBuffer,'FlushConsoleInputBuffer',\
    AllocConsole,'AllocConsole'
end data

Интересует именно этот участок.
invoke  GetStdHandle, STD_INPUT_HANDLE
        push    eax
        push    eax
    invoke  GetStdHandle, STD_OUTPUT_HANDLE
        push    eax
    invoke  SetConsoleMode, eax, ENABLE_PROCESSED_OUTPUT
        pop eax
    invoke  WriteConsole, eax, hello, msgsz, NULL, NULL
    invoke  FlushConsoleInputBuffer
        pop eax
    invoke  ReadConsole, eax, buf, bufsz, cnt, NULL

Что мы проталкиваем в стек, и что оттуда тянем?
  • Вопрос задан
  • 1236 просмотров
Пригласить эксперта
Ответы на вопрос 2
@csar
c++
1. GetStdHandle извлекает дескриптор для стандартного ввода данных, стандартного вывода или стандартной ошибки устройства.
2. SetConsoleMode устанавливает режим ввода данных буфера ввода консоли или режима вывода экранного буфера консоли.
3. WriteConsole выводит в консоль Hello, World!
4. FlushConsoleInputBuffer выключает из работы консольный буфер ввода.
5. ReadConsole читает символ с консоли.
Ответ написан
@none7
Что возвращают функции то и заталкиваем, то есть:
invoke  AllocConsole
    invoke  GetStdHandle, STD_INPUT_HANDLE
        push    eax ;InputHandle
        push    eax ;InputHandle
    invoke  GetStdHandle, STD_OUTPUT_HANDLE
        push    eax ; OutputHandle
    invoke  SetConsoleMode, eax, ENABLE_PROCESSED_OUTPUT ; OutputHandle
        pop eax
    invoke  WriteConsole, eax, hello, msgsz, NULL, NULL ; OutputHandle
    invoke  FlushConsoleInputBuffer ; функция сама забирает 1 аргумент, InputHandle
        pop eax
    invoke  ReadConsole, eax, buf, bufsz, cnt, NULL ; InputHandle
    invoke  FreeConsole
    invoke  ExitProcess,0

Компиляторы кстати так делать не будут. Они или сохранят значения в ebx, esi, edi или будут сохранять в стек через [ebp-x].
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы