Loader.exe + zzz.exe [%1 %*]

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

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Код (Text):
    1. start:
    2.         invoke ShellExecute,\
    3.         NULL,\            ;hwnd
    4.         lpOperation,\   ;edit, explore, find, print, NULL
    5.         lpFile,\
    6.         lpParameters,\
    7.         NULL,\            ;lpDirectory
    8.         nShowCmd
    9.         invoke  ExitProcess,0
    10.  
    11. section '.data' data readable writeable
    12.  
    13.         lpOperation db 'open',0
    14.         lpFile db 'HprSnap6.exe',0
    15.         lpParameters db ?
    16.         nShowCmd db 'SW_SHOWNORMAL'
    можно ли тут незамысловато чтонибуть придумать, чтоб параметры модулю шли (а не загрузчику) ?

    %SystemRoot%\system32\HprSnap.cmd:
    @start C:\~\Apps\HprSnap\HprSnap6.exe "%1" %*
    Надо чтоб то же самое через лоадер работало. Но как "%1" %* передать в модуль?
    %)
     
  2. AJAJA

    AJAJA New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2009
    Сообщения:
    21
    Через сплоет только в системе защиты.
     
  3. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Интересно я хотя бы это нормально написал nShowCmd db 'SW_SHOWNORMAL'
    Да нет же, сейчас чтонить с cmd.exe /k start /w ... & echo %1 замутим...
     
  4. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    AJAJA, у тебя на всё один ответ? .D
     
  5. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    ага =)
     
  6. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    плин, в AutoIt3 одной строкой ShellExecute("HprSnap6.exe", $CmdLineRaw, @ScriptDir)
     
  7. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Semiono
    Попробуй так.
    Код (Text):
    1. start:
    2.         invoke ShellExecute,\
    3.         NULL,\            ;hwnd
    4.         lpOperation,\   ;edit, explore, find, print, NULL
    5.         lpFile,\
    6.         lpParameters,\
    7.         NULL,\            ;lpDirectory
    8.         nShowCmd
    9.         invoke  ExitProcess,0
    10.  
    11. section '.data' data readable writeable
    12.  
    13.         lpOperation db 'open',0
    14.         lpFile db 'HprSnap6.exe',0
    15.         lpParameters db '"%1" %*',0
    16.         nShowCmd = SW_SHOWNORMAL
    SW_SHOWNORMAL это константа, определена в заголовочном файле.
     
  8. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Тут какая-то загвоздка. Я уже сам так пробовал ещё раньше.. Проблемма, что если параметр пустой,
    то вызываемое приложение орёт file not found. Типа всегда с параметрами стартует, даже не знаю, может это командлайн проблеммы, собсно не асмовые.
    nShowCmd = SW_SHOWNORMAL +1
     
  9. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Нужно выставлять NULL,\ ;lpDirectory, т.к. запускаемый файл будет искать файл в ней, а если этот параметр пустой, то файл ищется в директории с lpFile.
    Вообще, на сколько я знаю, %1 само по себе значит - первый параметр коммандной строки.
    Если ты вызываешь сам лоадер с параметром, то нужно получить его функцией GetCommandLine, "вырезать" сам параметр и передать в ShellExecute.
     
  10. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Код (Text):
    1. section 'data' data readable writeable
    2. lpParameters dd ?
    3. lpOperation db 'open',0
    4. lpFile db 'notepad.exe',0
    5. CurrentDir db 260 dup(?)
    6.  
    7. section 'code' code readable executable
    8. start:
    9.         invoke GetCommandLine
    10.  
    11.         cmp byte[eax],'"'
    12.         jnz @F
    13.         inc eax
    14.         jmp .loop_1
    15. @@:
    16.         cmp byte[eax],' '
    17.         jnz @B
    18.         jmp @F
    19. .loop_1:
    20.         cmp byte[eax],'"'
    21.         jz .loop1_
    22.         inc eax
    23.         jnz .loop_1
    24. .loop1_:
    25.         add eax,2
    26.  
    27.  
    28. @@:
    29.         mov [lpParameters],eax
    30.         invoke GetCurrentDirectory,260,CurrentDir
    31.  
    32.         invoke ShellExecute,\
    33.         NULL,\
    34.         lpOperation,\
    35.         lpFile,\
    36.         [lpParameters],\
    37.         CurrentDir,\
    38.         SW_SHOWNORMAL
    Примерно так. Алгоритм такой.
    После ассемблирования получаем Loader.exe и в его директории Loader.asm
    открываем cmd, заходим в папку с Loader.exe и пишем в коммандной строке:
    C:\Path_to_File>Loader.exe Loader.asm

    GetCommandLine возвратит в eax указатель на строку
    Далее, парсингом, в eax окажется указатель на строку "Loader.asm", а GetCurrentDirectory запишет в CurrentDir строку "C:\Path_to_File".
    И будет осуществлён вызов
    Код (Text):
    1.         invoke ShellExecute,\
    2.         NULL,\               ; 0
    3.         lpOperation,\      ; open
    4.         lpFile,\              ;'notepad.exe'
    5.         [lpParameters],\ ;'Loader.asm'
    6.         CurrentDir,\        ;'C:\Path_to_File'
    7.         SW_SHOWNORMAL
    Если я всё правильно написал :)
     
  11. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Код (Text):
    1. start:
    2.         invoke GetCommandLine
    3.         test   eax,eax
    4.         jnz .input
    5.  
    6.         invoke ShellExecute,\
    7.         NULL,\
    8.         lpOperation,\
    9.         lpFile,\
    10.         NULL,\
    11.         NULL,\
    12.         SW_SHOWNORMAL
    13.         invoke  ExitProcess,0
    14.  
    15. .input:
    16.         invoke ShellExecute,\
    17.         NULL,\
    18.         lpOperation,\
    19.         lpFile,\
    20.         lpParameters,\
    21.         NULL,\
    22.         SW_SHOWNORMAL
    23.         invoke  ExitProcess,0
    24.  
    25. section '.data' data readable writeable
    26.  
    27.         lpOperation db 'open',0
    28.         lpFile db 'HprSnap6.exe',0
    29.         lpParameters db '"%1" %*'
    30.         ;nShowCmd = SW_SHOWNORMAL
    8-)
    мне кажется это может работать, тока я ошибок понаделал наверное как всегда.
     
  12. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    О! Спасиб, я не успел увидеть твой пример!
     
  13. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Semiono
    Мой пример почему-то зависает, если не под отладчиком, но ошибку пока не увидел.
     
  14. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    угу, у меня the memory culd not be written error выскакивает.
    но ты там сам накрутил лупов :) слишком сложно.

    интересно что у еня не так?
    Код (Text):
    1.         invoke GetCommandLine
    2.         test   eax,eax
    а вообще в eax что тут... как бы это выправить правильно :)
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    twgt
    > Мой пример почему-то зависает
    Код (Text):
    1. ...
    2.         invoke GetCommandLine
    3.  
    4.         cmp byte[eax],'"'
    5.         jnz @F
    6.         inc eax
    7.         jmp .loop_1
    8. @@:
    9.         cmp byte[eax],' '
    10.         jnz @B
    11. ...
    Допустим имя исполняемого файла не в кавычках, значит сработает первый jnz @F, а дальше бесконечный (потому что EAX не меняется) цикл поиска пробела после имени исполняемого файла.
     
  16. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
     
  17. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    У тебя где-то должен быть invoke ExitProcess,0 - скорее всего это причина, тока я в твоих джампах нигде приткнуть это не смог :)
     
  18. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    q_q
    Точно, спасибо.
    Вот так работает:
    Код (Text):
    1. start:
    2.         invoke GetCommandLine
    3.  
    4.         cmp byte[eax],'"'
    5.         jnz @F
    6.         inc eax
    7.         jmp .loop_1
    8. @@:
    9.         cmp byte[eax],' '
    10.         jz  .loop
    11.         inc eax
    12.         jmp @B
    13. .loop_1:
    14.         cmp byte[eax],'"'
    15.         jz .loop1_
    16.         inc eax
    17.         jnz .loop_1
    18. .loop1_:
    19.         add eax,2
    20. .loop:
    21.         inc eax
    22.  
    23.  
    24. @@:
    25.         mov [lpParameters],eax
    26.         invoke GetCurrentDirectory,260,CurrentDir
    27. ...
     
  19. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    я имел ввиду моё великое произведение :)
    Код (Text):
    1. invoke GetCommandLine
    2.         test   eax,eax
    3.         jnz .input
    но не знаю наверное не правильно парсит
     
  20. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Semiono
    Лучше, наверное, будет крутить строку с конца.
    Код (Text):
    1.         invoke GetCommandLine
    2.          mov ebx,eax
    3.          invoke lstrlen,eax
    4.          mov ecx,eax
    5.          add eax,ebx
    6.  
    7. @@:
    8.          cmp byte[eax],'"'
    9.          jz @no_spaces
    10.          cmp byte[eax],' '
    11.          jz @F
    12.          dec eax
    13.          loop @B
    14.          ;сюда попадём если строка кончилась, а пробелов нет, либо встретились кавычки, тогда нужно запустить без параметров
    15. @no_spaces:
    16.          mov eax,0
    17.    
    18. @@:      
    19.  mov [lpParameters],eax
    По идее GetCommandLine не может возвратить 0(т.е. test eax,eax делать не нужно), потому, как она минимум возвращает указатель на строку с именем запускаемого файла, в данном случае это Loader.exe.