Обёртка для запуска приложений из консоли?

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

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    785
    Код (Text):
    1.  
    2. format PE64 Console
    3. include '%fasm%/win64ax.inc'
    4. section '.code' executable
    5. start:
    6.         sub rsp,8
    7.  
    8.         invoke GetCommandLine
    9.         mov ebx,eax
    10. @@:
    11.         cmp byte [ebx],NULL
    12.         je  sh
    13.         cmp byte [ebx],' '
    14.         je  @f
    15.         inc ebx
    16.         jmp @r
    17. @@:
    18.         inc ebx
    19.         cmp byte [ebx],' '
    20.         je  @r
    21.  
    22.         ;cmp byte [ebx],'*'
    23.         ;jne sh
    24.         ;jmp exit
    25. sh:
    26.         invoke wsprintf,a,'/c subinacl.exe /subdirectories %s /perm /setowner=Everyone /grant=Everyone=F',ebx
    27.         invoke ShellExecute,NULL,NULL,'cmd.exe',a,NULL,SW_HIDE
    28. exit:
    29.         invoke ExitProcess,NULL
    Даже не знаю, вроде бы работает. Мне хотелось бы использовать ключи
    '-f' = для файлов /subdirectories
    '-r'= для реестра /subkeyreg
    чтобы кроме ebx подставить ещё ключ, как это сделать?

    Ещё бы прикрутить какой-то диалог
    Код (Text):
    1.  
    2.         invoke  SetConsoleOutputCP,1251
    3.         invoke  SetConsoleCP,1251
    4.         invoke  GetStdHandle, STD_OUTPUT_HANDLE
    5.         mov     [stdout], eax
    6.         invoke  GetStdHandle, STD_INPUT_HANDLE
    7.         mov     [stdin], eax
    8.         invoke  WriteConsole,[stdout],cMsg,12,NULL,NULL
    9.         invoke  ReadConsole,[stdin],lpBuffer,1,lpCharsRead,NULL
    10.  
    правда обработку ввода я не нашёл как сделать, прочитал, напиал и на этом усё.
    Я на радостях ReadConsole,[stdin],lpBuffer хотел в ShellExecute выполнить, но не тут то было. Это просто текст :\

    Хочется писать, читать и ещё чтобы Execute делать
    --- Сообщение объединено, 2 сен 2024 ---
    subinacl.exe наверное с пустым вводом зависает, пытается что-то обработать, я закрываю консоль, при этом error memory read итд итп иногда вылетает. Поэтому как-то сомнительно.
    Видимо надо ещё и пустой путь что ли предусмотреть.
    --- Сообщение объединено, 2 сен 2024 ---
    ах, да и ещё, всё новые окна открываются, что не желательно, хочется в текущем CMD.exe видеть работу
     
  2. Prober

    Prober Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    43
    Для начала сделайте все дескрипторы и указатели 64-битными.
    cmp byte [ebx],' '
    mov [stdout], eax

    и пр. не катят.
     
  3. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    785
    Я понял что не так, ShellExecute делает дело, но вывод в консоль нужен.
    Иначе не видно что происходит. Наверняка есть готовый шаблон, пример, template.
    Только не Hello World. Мне бы exec с выводом в STDOUT.
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    wsprintf принимает произвольное количество аргументов, точно так же через запятую после ebx. Но определись сначала в х64 или в х32 режиме ты делаешь приложение. В x32 например надо самому стек выравнивать после wsprintf: add esp,n*4.
     
    Semiono нравится это.
  5. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    703
    можно не выравнивать cinvoke
     
    Semiono нравится это.
  6. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    785
    Можно ключи /subdirectories в wstprintf %s прямо подставить, но они такие длинные,
    что хотелось избавиться, а свой -d подставлять я понял довольно сложная задача.
    Это надо строку scasb-ом делить на PATH и KEY
    --- Сообщение объединено, 4 сен 2024 ---
    32-бит регистры чем плохи? А когда al, ah в 32-битном коде ничего?

    :)
     
  7. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    ет вы еще xmm/ymm/zmm не щупали :)
     
    Semiono нравится это.
  8. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    197
    В регистрах х32 нет ничего плохого, тем более что запись в eax автоматом обнуляет старшие 32-бита в rax (это касается и всех остальных 64-бит регистров, избавляя от префиксов REX). Более того, даже в режиме х64 почти все Win-API возвращают только 32-битные значения, а потому сохранять выхлоп в 8-байтные переменные нет никакого смысла. По большому счёту кодинг в х64 оправдывает себя лишь в требовательных к памяти приложениях (например игры), а так-же при огромных математических вычислениях.
     
    Mikl___ и Semiono нравится это.
  9. miilalex

    miilalex New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2024
    Сообщения:
    8
    на форуме fasm один из ответов
    вместо мессидж бокса wsprintf как вариант
    и format отрихтовать надо )

    Код (ASM):
    1. ; Example of 64-bit PE program
    2.  
    3. format PE64 GUI
    4. entry start
    5.  
    6. section '.text' code readable executable
    7.  
    8.   start:
    9.       sub     rsp,8*5         ; reserve stack for API use and make stack dqword aligned
    10.  
    11.        mov     r9d,0
    12.        lea     r8,[_caption]
    13.        lea     rdx,[_message]
    14.       mov     rcx,0
    15.        call    [MessageBoxA]
    16.  
    17.    mov     ecx,eax
    18.      call    [ExitProcess]
    19.  
    20. section '.data' data readable writeable
    21.  
    22.   _caption db 'Win64 assembly program',0
    23.   _message db 'Hello World!',0
    24.  
    25. section '.idata' import data readable writeable
    26.  
    27.   dd 0,0,0,RVA kernel_name,RVA kernel_table
    28.   dd 0,0,0,RVA user_name,RVA user_table
    29.   dd 0,0,0,0,0
    30.  
    31.   kernel_table:
    32.     ExitProcess dq RVA _ExitProcess
    33.     dq 0
    34.   user_table:
    35.     MessageBoxA dq RVA _MessageBoxA
    36.     dq 0
    37.  
    38.   kernel_name db 'KERNEL32.DLL',0
    39.   user_name db 'USER32.DLL',0
    40.  
    41.   _ExitProcess dw 0
    42.     db 'ExitProcess',0
    43.   _MessageBoxA dw 0
    44.     db 'MessageBoxA',0    
    вывод в STDOUT скорее всего WriteFileA или W с требуемым стандартным handle открываем CreateFileA для файла с именем CON, нет?
    или WriteConsole
     
    Semiono нравится это.