CreateProcessA не запускает cmd

Тема в разделе "WASM.X64", создана пользователем Archimag, 4 фев 2022.

  1. Archimag

    Archimag New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2020
    Сообщения:
    4
    Всем доброго времени суток
    Есть код который выделяет на стеке структуры для STARTUPINFOA+PROCESS_INFORMATION - и запускает cmd используя CreateProcessA. Все работает кроме одного: когда я передаю имя cmd.exe не через заранее объявленную переменную, а также выделяя память на стеке - ошибка в дебагере 0000007B (ERROR_INVALID_NAME) . наверное, что то очень простое должно быть - может кто-то подсказать что не правильно делаю?

    Код (ASM):
    1. ;ml64.exe CreateProcessA_memory_from_stack.asm /link /subsystem:console /entry:main /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x64" /defaultlib:kernel32.lib
    2.  
    3. extrn CreateProcessA : proc
    4. extrn ExitProcess : proc
    5.  
    6. .const
    7. NORMAL_PRIORITY_CLASS equ 020h
    8.  
    9. .data
    10. szProcName db "cmd.exe"
    11.  
    12. .code
    13.     main proc
    14.         sub   RSP, 28h                 ; 40 bytes of shadow space
    15.         and   RSP, 0FFFFFFFFFFFFFFF0h   ;Align the stack to a multiple of 16 bytes
    16.        
    17.         ;------------------------------- чистим пам¤ть сразу под STARTUPINFOA+PROCESS_INFORMATION
    18.         lea rsi,qword ptr [rsp-200h] ;
    19.         mov rcx,rsi
    20.         mov rdx,rsi
    21.         add rdx, 80h                  
    22.         Z:
    23.         MOV BYTE PTR [RSI],00h
    24.         INC rsi
    25.         CMP rsi,rdx
    26.         JLE Z
    27.        
    28.         mov rsi,rcx                              
    29.         mov dword ptr [rsi],68h                ; начало STARTUPINFOA
    30.         add rcx, 68h                        ; начало PROCESS_INFORMATION
    31.         push rcx
    32.         push rsi
    33.         push 00h                          
    34.         push 00h                  
    35.         push NORMAL_PRIORITY_CLASS
    36.         push 00h                  
    37.         sub rsp, 20h
    38.         mov r9, 00h
    39.         mov r8, 00h
    40.         mov rdx, 00h
    41.         ;------------------------------НЕ РАБОЧИЙ ВАРИАНТ КОДА
    42.         lea rax,qword ptr [rsp-100h]
    43.         mov rcx, 6578652E646D63h          ; cmd.exe
    44.         mov qword ptr [rax],rcx  ;
    45.         lea rcx,qword ptr [rsp-100h]
    46.         ;------------------------------
    47.        
    48.         ;------------------------------ А ВОТ ЧЕРЕЗ ПЕРЕМЕННУЮ szProcName ВСЕ РАБОТАЕТ
    49.         ;lea rcx, szProcName
    50.         call CreateProcessA
    51.        
    52.         xor rcx, rcx
    53.         call ExitProcess
    54.  
    55.     main endp
    56. end
     
  2. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    rsp-100h это что? Память над указателем стека? Я не вижу чтоб вы поднимали стек.
    --- Сообщение объединено, 4 фев 2022 ---
    Ух ты ж блин, а я и не в курсе что такое есть. Каким туториалом пользуетесь?
     
  3. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Я было испугался, что отныне можно использовать адреса младше верхушки стека, ан нет. Твою строчку с адресом младше rsp вендовые функции закономерно сжирают под свои нужды, а когда дело доходит до ее использования, оказывается, что там шляпа. Не выёживайся и выделяй локальные переменные, если в этом во всём плывешь.
     
  4. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Ой да ладно, новичку вполне может быть непонятно что API вызовы тоже используют стек, это нифига неочевидно. Он может еще сам бы догадался, если бы получил краш, но ему "повезло".
    Он наверное это и хотел, но не понял как.
    --- Сообщение объединено, 4 фев 2022 ---
    f13nd, где почитать про shadow space и подобные приколы? Я похоже тоже в этом плыву )
     
  5. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-170
    Похоже этим очередным пафосным термином обозначают 4 кворда, где по идее должны быть 4 первых аргумента, но не бывают. Потому что находятся в rcx,rdx,r8 и r9.
     
  6. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.191
    Адрес:
    подполье
    Зачем этот дроч, если masm это МАКРОассемблер? Юзайте invoke! http://dsmhelp.narod.ru/environment.htm#id_newinvoke
    или вот нашел у себя, сам когда то юзал, вродебы:
    Код (Text):
    1.  
    2.   uinvoke    macro p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12, \  
    3.     p13,p14,p15,p16,p17,p18,p19,p20,p21,p22
    4.      
    5.      count = 4
    6.      FOR arg,<p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,\
    7.         p15,p16,p17,p18,p19,p20,p21,p22>
    8.        IFNB <arg>
    9.          mov    qword ptr[rsp+count*8],arg
    10.          count   =   count + 1
    11.        ENDIF
    12.       ENDM
    13.      IFNB <p1>
    14.        IF (OPATTR (p1)) AND 00010000y   ;; Is a register value
    15.          IFDIFI <p1>, <rcx>       ;; do not move ecx onto itself
    16.            mov rcx, p1
    17.          ENDIF
    18.        ELSEIF (OPATTR (p1)) AND 00000100y   ;; Is an immediate value
    19.          IF p1 EQ 0
    20.            xor rcx, rcx
    21.          ELSEIF p1 EQ 1
    22.            xor rcx, rcx
    23.            inc rcx
    24.          ELSEIF p1 EQ -1
    25.            or rcx, -1
    26.          ELSE
    27.            mov rcx, p1
    28.          ENDIF
    29.        ELSE
    30.          mov ecx, r1
    31.        ENDIF
    32.        IFNB <p2>
    33.          IF (OPATTR (p2)) AND 00010000y   ;; Is a register value
    34.            IFDIFI <p2>, <rdx>     ;; do not move edx onto itself
    35.              mov rdx, p2
    36.            ENDIF
    37.          ELSEIF (OPATTR (p2)) AND 00000100y   ;; Is an immediate value
    38.            IF p2 EQ 0
    39.              xor rdx, rdx
    40.            ELSEIF p2 EQ 1
    41.              xor rdx, rdx
    42.              inc rdx
    43.            ELSEIF p2 EQ -1
    44.              or rdx, -1
    45.            ELSE
    46.              mov rdx, p2
    47.            ENDIF
    48.          ELSE
    49.            mov rdx, p2
    50.          ENDIF
    51.          IFNB <p3>
    52.            IF (OPATTR (p3)) AND 00010000y   ;; Is a register value
    53.              IFDIFI <p3>, <r8>     ;; do not move edx onto itself
    54.                mov r8, p3
    55.              ENDIF
    56.            ELSEIF (OPATTR (p3)) AND 00000100y   ;; Is an immediate value
    57.              IF p3 EQ 0
    58.                xor r8, r8
    59.              ELSEIF p3 EQ 1
    60.                xor r8, r8
    61.                inc r8
    62.              ELSEIF p3 EQ -1
    63.                or r8, -1
    64.              ELSE
    65.                mov r8, p3
    66.              ENDIF
    67.            ELSE
    68.              mov r8, p3
    69.            ENDIF
    70.            IFNB <p4>
    71.              IF (OPATTR (p4)) AND 00010000y   ;; Is a register value
    72.                IFDIFI <p4>, <r9>     ;; do not move edx onto itself
    73.                  mov r9, p4
    74.                ENDIF
    75.              ELSEIF (OPATTR (p4)) AND 00000100y   ;; Is an immediate value
    76.                IF p4 EQ 0
    77.                  xor r9, r9
    78.                ELSEIF p4 EQ 1
    79.                  xor r9, r9
    80.                  inc r9
    81.                ELSEIF p4 EQ -1
    82.                  or r9, -1
    83.                ELSE
    84.                  mov r9, p4
    85.                ENDIF
    86.              ELSE
    87.                mov r9, p4
    88.              ENDIF
    89.            ENDIF
    90.          ENDIF
    91.        ENDIF
    92.      ENDIF  
    93.      call    p0
    94.    endm
    95.  
     
    Последнее редактирование: 4 фев 2022
  7. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Дроч-то не в вызове, а в организации пространства под 3 переменных. В цикле чистки нулями я вижу мимикрию под модные цэ-компилеры, оно как бы с одной стороны хорошо, с другой - прекрасно налезет и на пачку локальных переменных. Да к тому же экономия пары байт не стоит того, чтобы так упарываться. Никого эта пара байт счастливыми не сделает.
     
  8. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.191
    Адрес:
    подполье
    да кто будет разбираться то даже в этих портянках, если они не в отладчике?^^ пардон за флуд, да
     
  9. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Аверы будут копаться своими эвристическими тентаклями.
     
  10. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.191
    Адрес:
    подполье
    да какие там аверы, если чел в отладчике не может посмотреть почему не работает? с макросами хотя бы код нагляден
     
    Indy_ и M0rg0t нравится это.
  11. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    [​IMG]
     
  12. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.191
    Адрес:
    подполье
    ormoulu, не, эту не юзал
     
  13. Vityacv

    Vityacv New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2011
    Сообщения:
    7
    Так можно это на nasm сделать:
    Код (Text):
    1. global main
    2. default rel
    3.  
    4. extern RtlZeroMemory
    5. extern CreateProcessW
    6. extern ExitProcess
    7.  
    8. struc STARTUPINFO
    9. .cb resd 1
    10. alignb 8
    11. .lpReserved resq 1
    12. .lpDesktop resq 1
    13. .lpTitle resq 1
    14. .dwX resd 1
    15. .dwY resd 1
    16. .dwXSize resd 1
    17. .dwYSize resd 1
    18. .dwXCountChars resd 1
    19. .dwYCountChars resd 1
    20. .dwFillAttribute resd 1
    21. .dwFlags resd 1
    22. .wShowWindow resw 1
    23. .cbReserved2 resw 1
    24. alignb 8
    25. .lpReserved2 resq 1
    26. .hStdInput resq 1
    27. .hStdOutput resq 1
    28. .hStdError resq 1
    29. endstruc
    30.  
    31. struc PROCESS_INFORMATION
    32. .hProcess resq 1
    33. .hThread resq 1
    34. .dwProcessId resd 1
    35. .dwThreadId resd 1
    36. endstruc
    37.  
    38. section .code
    39. main:
    40. struc .stack
    41. resq 4
    42. .5 resq 1
    43. .6 resq 1
    44. .7 resq 1
    45. .8 resq 1
    46. .9 resq 1
    47. .10 resq 1
    48. .StartupInfo resb STARTUPINFO_size
    49. .ProcessInfo resb PROCESS_INFORMATION_size
    50. alignb 16
    51. resq 1
    52. endstruc
    53. sub rsp,.stack_size
    54. lea rcx,[rsp+.StartupInfo]
    55. mov edx,STARTUPINFO_size
    56. call RtlZeroMemory
    57. xor rcx,rcx
    58. lea rdx,[CommandLine]
    59. mov r8,rcx
    60. mov r9,rcx
    61. mov [rsp+.5],rcx
    62. mov dword[rsp+.6],0x20 ;NORMAL_PRIORITY_CLASS
    63. mov [rsp+.7],rcx
    64. mov [rsp+.8],rcx
    65. lea rax,[rsp+.StartupInfo]
    66. mov [rsp+.9],rax
    67. lea rax,[rsp+.ProcessInfo]
    68. mov [rsp+.10],rax
    69. call CreateProcessW
    70. mov rcx,rax
    71. call ExitProcess
    72. add rsp,.stack_size
    73. ret
    74.  
    75. section .data
    76. align 4,db 0
    77. CommandLine dw __utf16__ 'cmd.exe',0
    сборка:
    Код (Text):
    1. nasm -f win64 main.asm
    2. gcc main.obj
     
  14. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Ладно хоть не tasm :resent:
    Код (ASM):
    1. format PE64 GUI 5.0
    2. entry main
    3. include 'win64ax.inc'
    4.  
    5. section '.text' code readable executable
    6. proc main
    7.             locals
    8.                 binStartupInfo    STARTUPINFO
    9.                 binProcessInfo    PROCESS_INFORMATION
    10.                 szCmd            rb MAX_PATH
    11.             endl
    12.             and rsp,not(32-1)
    13.             mov rax,rsp
    14.             neg rax
    15.             invoke memset,addr binStartupInfo,0,addr rax+rbp
    16.             mov DWORD[szCmd + 00],'cmd.'
    17.             mov DWORD[szCmd + 04],'exe'
    18.             mov [binStartupInfo.cb],sizeof.STARTUPINFO
    19.             invoke CreateProcessA,0,addr szCmd,0,0,0,NORMAL_PRIORITY_CLASS,0,0,addr binStartupInfo,addr binProcessInfo
    20.             invoke ExitProcess,0
    21.             ret
    22. endp
    23. section '.idata' import data readable
    24.     library kernel32,'KERNEL32.DLL',user32,'USER32.DLL',ntdll,'ntdll.dll'
    25.     include 'api\kernel32.inc'
    26.     include 'api\user32.inc'
    27.     import ntdll,\
    28.             memset,'memset'
     
  15. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Archimag,

    > ERROR_INVALID_NAME

    Дебилы, вас пора автоматикой банить за такие вопросы. Статус смотри дебил.
     
    Rel нравится это.
  16. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
     
  17. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Недавно был вопрос по статусным кодам. Ели человек самостоятельно не может инфу найти, но он же тут пост создал значит печатать может. О чём это может говорить, тем более есть сурки на всё это.
     
  18. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Если бы ты хоть один пост в треде прочитал, дошло бы, что все было чуть сложнее, чем тупо кривое имя файла. Таким образом твое глубокомысленное замечание характеризует тебя как дебила, который в очередной раз ничего не понял и влез лицом поторговать.
     
  19. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    f13nd,

    А зачем мне читать, в скрипт токен маркер добавить error_" и автоматикой банить автора темы.

    Твоё мнение - ты с кл, я вышел от туда. Ваш ресурс затролил школьник. Тут такое не выйдет. Лучше сказать не пройдёт.
     
  20. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Это норма...