Не могу разобраться с SetConsoleCursorPosition

Тема в разделе "WASM.BEGINNERS", создана пользователем Entropy, 28 сен 2024.

  1. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    У этой функции есть второй аргумент структура COORD,передаю адрес структуры,функция возвращает ошибку,вроде делаю всё правильно

    Код (ASM):
    1. format PE console
    2.  
    3.  
    4. include 'win32axp.inc'
    5.  
    6.  
    7. section '.text' code readable executable
    8.  
    9.  
    10. invoke GetStdHandle,STD_OUTPUT_HANDLE
    11. mov word [coord.x],10
    12. mov  word [coord.y],10
    13.  
    14.  
    15. invoke SetConsoleCursorPosition,eax,coord
    16.  
    17. invoke ExitProcess,0
    18.  
    19.  
    20. section '.data' data readable writeable
    21.  
    22. struc coord
    23. {
    24. .x rw 1
    25. .y rw 1
    26. }
    27.  
    28. coord coord
    29.  
    30. section '.idata' import data readable writeable
    31.  
    32.  
    33. library kernel32,'kernel32.dll',
    34.  
    35.  
    36. import kernel32,\
    37.        GetStdHandle,'GetStdHandle',\
    38.        ExitProcess,'ExitProcess',\
    39.        SetConsoleCursorPosition,'SetConsoleCursorPosition',\
    40.        GetLargestConsoleWindowSize,'GetLargestConsoleWindowSize'
    41.  
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Структура, состоящая из двух полуслов. Можно было догадаться по МСДНу, где в прототипе нету звездочки.
    Код (Text):
    1. invoke SetConsoleCursorPosition,[hConsoleOutput],DWORD[binScreenBufferInfoCurrent.dwCursorPosition]
    Код (Text):
    1. BOOL WINAPI SetConsoleCursorPosition(
    2.   _In_ HANDLE hConsoleOutput,
    3.   _In_ COORD  dwCursorPosition
    4. );
    ЗЫ: снова "возвращает ошибку", анализировать LastError, как майкрософт советует, было видимо незачем.
     
  3. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    189
    Код (ASM):
    1. format PE console
    2. include 'win32ax.inc'
    3. ;-----------------------
    4. .code
    5. start:  invoke  GetStdHandle,STD_OUTPUT_HANDLE
    6.         mov     [pos.X],40
    7.         mov     [pos.Y],5
    8.         invoke  SetConsoleCursorPosition,eax,dword[pos]
    9.         invoke  Sleep,5000
    10.         invoke  ExitProcess,0
    11. .end start
    12. ;-----------------------
    13. .data
    14. struct  COORD
    15.         X dw ?
    16.         Y dw ?
    17. ends
    18. pos     COORD
    19.  
     
  4. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    Marylin, спасибо,работает
    --- Сообщение объединено, 30 сен 2024 ---
    ЗЫ:вообще команда PUSH работает интересно,ей в качесве операнда можно передать адрес памяти,и она возьмёт значение по этому адресу и переместит по другому адресу(указатель стека),ведь не нужно помещать значение в регистр а после в память
    --- Сообщение объединено, 30 сен 2024 ---
    f13nd, я когда в отладчике смотрел,функция возраващает STATUS_INVALID_PARAMETR
     
  5. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    189
    ..для ленивых имеется и другой вариант - собрать все аргументы по порядку в секции-данных,
    и просто переместить указатель стека ESP на начало этого блока. (т.е. не Магомед идёт к горе, а гора к Магомеду).
     
  6. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    96
    (Вопрос в воздух: и куда же потом будет это значение в esp двигаться...?) Если вы хотите упасть при доступе к не выделенному участку памяти или потереть свои же глобальные переменные, тогда вариант для ленивых идеален.
     
    miilalex нравится это.
  7. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    189
    ну так все нюансы предусмотреть-же нужно примерно так:

    Код (ASM):
    1. .data
    2. localVar    rb  256
    3. stackFrame  rd  64
    4.  
    5. .code
    6. start:   mov   esp,stackFrame
    7.          call  myFunc
    8. ;....
    по адресу "stackFrame" кладёшь адрес-возврата, и дальше аргументы..
     
  8. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    96
    Если пишите для себя и запускаете только у себя, тогда пойдет. Но вот что делать с другими версиями ОС (НТ - 11)/платформами (wine-vanilla, wine-staging, wine-proton). Там этого кусочка может не хватить. Предлагаете все пересмотреть и выяснить максимальную глубину, которая потребуется?
     
    miilalex нравится это.
  9. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    189
    Да это используется для разового вызова процедуры/функции, после чего указатель esp опять восстанавливается на место. Если функа вызывается много раз с одинаковыми аргументами (например Mbox с сообщением об ошибке), чем постоянно пушить одно и тоже (push - это тормознутая запись в память), проще сместить сам esp.
     
  10. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    96
    А много ли вы выиграете для вызова MessageBox, который внутри будет крутить длинный цикл, пока пользователь не нажмет окай? Ничего страшного от тормознутой записи в память при использовании MessageBox не произойдет. А вот программа явно станет работать не корректно (тем более для такой функции как MessageBox т.к. глубину вызовов в стеке вы точно не определите).
     
    miilalex нравится это.
  11. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    189
    какой ещё длинный цикл, когда Mbox синхронный/блокирующий вызов?
    а впрочем если боитесь, что код будет работать "не корректно", то не трогайте esp - никто не настаивает.
     
  12. miilalex

    miilalex New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2024
    Сообщения:
    8
    пока мессиджбокс на экране, в винде происходят тонны процессов АКА вызов процедур и передача параметров, разумеется через стек, и никому из них не понравится, если в какой-то момент esp указывает в непонятно что заведомо маленького размера (

    переставлять esp куда угодно, в произвольный момент времени, не запретив предварительно прерывания, многозадачность и прочий праздник жизни - это заявка на обрушение как минимум своего приложения
    а винда это и не даст пользовательскому коду

    поэтому с точки зрения затрат времени на отладку и поиск котов в черной комнате лучше esp не переставлять на "другой" стек
     
  13. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    189
    а ничё, что Win это ос с вытесняющей многозадачностью?
    Пусть в фоне крутятся не тонны, а хоть мульён процессов - у потоков каждого из них свои стеки и регистры, и к вашему esp они не имеют никакого отношения от слова совсем. О сегменте TSS ничего не слышали?

    Это во-первых, ..а во-вторых планировщик выделяет кванты времени только тредам активного окна, а остальные переходят в состояние "Wait" и не получают времени. Вытеснить активный поток (забрать его кванты) может только процесс/поток с более высоким приоритетом, и повторюсь у него будет свой стек. В противном случае о никакой безопасности не может быть и речи, т.к. по вашей схеме через стековую память можно было-бы передавать всякое дерьмо буквально всем процессам в системе.

    Ну вот, уже и до ядра добрались.. При чём вообще тут прерывания? Это абсолютно из другой оперы. Слышать подобного рода высказывания на васме не привычно, а потому если других аргументов нет, лучше зарыть эту тему, пока знающие люди не подняли на смех. Вот почитайте на досуге заметку "Ассемблерные извращения - натягиваем стек" Криса (земля ему пухом). Может что-то прояснится наконец..
     
    bizdon и Mikl___ нравится это.
  14. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    96
    Может на хрюше это и катило, но вот на 7 сп1 уже нет
    Код (Text):
    1.  
    2. format PE GUI 5.0
    3. include 'WIN32A.INC'
    4. section '.idat' import data readable writeable
    5. library kernel32,"KERNEL32.DLL",user32,"USER32.DLL"
    6. include 'API\KERNEL32.INC'
    7. include 'API\USER32.INC'
    8. section '.data' data readable writeable
    9. test_data       dd -1, -2, -3, -4, -5
    10. msg_box_param   dd 0, 0, msg_text, msg_caption, 0
    11. msg_caption     du 'Hello!',0
    12. msg_text        du 'Have a nice day.',0
    13. section '.text' code readable executable
    14. entry $
    15.       mov       esp, msg_box_param + 4
    16.       call      [MessageBoxW]
    17.       invoke    ExitProcess, eax
    18.  
    Берем программу использующую ваш способ. И ... получаем
    До входа https://disk.yandex.ru/d/0XrtZCpzr1FRXg
    После входа https://disk.yandex.ru/i/0RoDovYzO0aNOQ
    Бряк....
    Как можно видеть вершина стека уперлась в начало образа exe (т.е. стерт даже заголовок PE, не говоря уже о данных в секции).

    ЗЫ Те. MessageBox использовал больше 8216 байт стека. И вы думаете до сих пор, что ваше rd 64 что-то изменит?
    --- Сообщение объединено, 3 окт 2024 ---
    Если так хотите экономить на push'ах, то для вас придумали вот это
    https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxindirecta
     
    Последнее редактирование: 3 окт 2024
    miilalex нравится это.
  15. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    Перемещать указатель на стек на какой-то свой ограниченный буфер не нужно еще потому, что под windows драйвера режима ядра выполняются в контексте случайного процесса и они используют стек, т.е, указатель esp процесса в том числе. И вы не можете сказать, сколько при этом памяти стековой будет задействовано, поэтому есть хорошая возможность того, что данные в область младших адресов рядом с вашим буфером будут испорчены
     
    miilalex нравится это.
  16. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    189
    Так суть здесь не в ограниченном буфере (ничто не мешает увеличить его до нужных размеров),
    а чтобы избавиться от многочисленных пушей, когда аргументов много.

    Другое дело, что в штатном стеке Win помимо свободного пространства лежат и полезные данные, например SEH-фрейм, линк на который прописывается в TEB. Если сменить esp, тогда автоматом отваливаются и обработчики ошибок, которые через esp активно юзает под катом Win32API. Поэтому если и делать стековый фрейм, то только для своих процедур/функций, а не системных.
     
  17. miilalex

    miilalex New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2024
    Сообщения:
    8
    выше уже за меня ответили на все возражения, поэтому я только замечу, что если ПО спроектировано так, что некий набор параметров передается в вызываемую процедуру в том же порядке и количестве и их прям "много" настолько, что напрягает уже экстра-пуш в стек при вызове, то изначально эта архитектура/проект ущербна т.е. возможно вычленение процедур из большого куска кода сделано неграмотно

    что касается мыщьа, меня со времен бумажного Хакепа удивлял вопрос "зачем" т.е. практической применимости его изысканий.

    человек хороший публикатор, набил кучу статей, похайпил ассемблером, вовлек новичков и т.д. но условный софтайс, деде, олли, иду, насм и далее везде - написал не он.
    статья называется извращения, окей.
     
  18. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    189
    Так он и не ставил перед собой цель написать олю или деде. По сути он "воевал" на другой стороне, и делился интересными фишками, которые находил при реверсе всего/этого софта, и особенно малвари, где ставка делается именно на нестандартное решение типичных задач, а кастомный стек как-раз и попадает под эту категорию.