Код (Text): start: invoke ShellExecute,\ NULL,\ ;hwnd lpOperation,\ ;edit, explore, find, print, NULL lpFile,\ lpParameters,\ NULL,\ ;lpDirectory nShowCmd invoke ExitProcess,0 section '.data' data readable writeable lpOperation db 'open',0 lpFile db 'HprSnap6.exe',0 lpParameters db ? nShowCmd db 'SW_SHOWNORMAL' можно ли тут незамысловато чтонибуть придумать, чтоб параметры модулю шли (а не загрузчику) ? %SystemRoot%\system32\HprSnap.cmd: @start C:\~\Apps\HprSnap\HprSnap6.exe "%1" %* Надо чтоб то же самое через лоадер работало. Но как "%1" %* передать в модуль? %)
Интересно я хотя бы это нормально написал nShowCmd db 'SW_SHOWNORMAL' Да нет же, сейчас чтонить с cmd.exe /k start /w ... & echo %1 замутим...
Semiono Попробуй так. Код (Text): start: invoke ShellExecute,\ NULL,\ ;hwnd lpOperation,\ ;edit, explore, find, print, NULL lpFile,\ lpParameters,\ NULL,\ ;lpDirectory nShowCmd invoke ExitProcess,0 section '.data' data readable writeable lpOperation db 'open',0 lpFile db 'HprSnap6.exe',0 lpParameters db '"%1" %*',0 nShowCmd = SW_SHOWNORMAL SW_SHOWNORMAL это константа, определена в заголовочном файле.
Тут какая-то загвоздка. Я уже сам так пробовал ещё раньше.. Проблемма, что если параметр пустой, то вызываемое приложение орёт file not found. Типа всегда с параметрами стартует, даже не знаю, может это командлайн проблеммы, собсно не асмовые. nShowCmd = SW_SHOWNORMAL +1
Нужно выставлять NULL,\ ;lpDirectory, т.к. запускаемый файл будет искать файл в ней, а если этот параметр пустой, то файл ищется в директории с lpFile. Вообще, на сколько я знаю, %1 само по себе значит - первый параметр коммандной строки. Если ты вызываешь сам лоадер с параметром, то нужно получить его функцией GetCommandLine, "вырезать" сам параметр и передать в ShellExecute.
Код (Text): section 'data' data readable writeable lpParameters dd ? lpOperation db 'open',0 lpFile db 'notepad.exe',0 CurrentDir db 260 dup(?) section 'code' code readable executable start: invoke GetCommandLine cmp byte[eax],'"' jnz @F inc eax jmp .loop_1 @@: cmp byte[eax],' ' jnz @B jmp @F .loop_1: cmp byte[eax],'"' jz .loop1_ inc eax jnz .loop_1 .loop1_: add eax,2 @@: mov [lpParameters],eax invoke GetCurrentDirectory,260,CurrentDir invoke ShellExecute,\ NULL,\ lpOperation,\ lpFile,\ [lpParameters],\ CurrentDir,\ 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): invoke ShellExecute,\ NULL,\ ; 0 lpOperation,\ ; open lpFile,\ ;'notepad.exe' [lpParameters],\ ;'Loader.asm' CurrentDir,\ ;'C:\Path_to_File' SW_SHOWNORMAL Если я всё правильно написал
Код (Text): start: invoke GetCommandLine test eax,eax jnz .input invoke ShellExecute,\ NULL,\ lpOperation,\ lpFile,\ NULL,\ NULL,\ SW_SHOWNORMAL invoke ExitProcess,0 .input: invoke ShellExecute,\ NULL,\ lpOperation,\ lpFile,\ lpParameters,\ NULL,\ SW_SHOWNORMAL invoke ExitProcess,0 section '.data' data readable writeable lpOperation db 'open',0 lpFile db 'HprSnap6.exe',0 lpParameters db '"%1" %*' ;nShowCmd = SW_SHOWNORMAL 8-) мне кажется это может работать, тока я ошибок понаделал наверное как всегда.
угу, у меня the memory culd not be written error выскакивает. но ты там сам накрутил лупов слишком сложно. интересно что у еня не так? Код (Text): invoke GetCommandLine test eax,eax а вообще в eax что тут... как бы это выправить правильно
twgt > Мой пример почему-то зависает Код (Text): ... invoke GetCommandLine cmp byte[eax],'"' jnz @F inc eax jmp .loop_1 @@: cmp byte[eax],' ' jnz @B ... Допустим имя исполняемого файла не в кавычках, значит сработает первый jnz @F, а дальше бесконечный (потому что EAX не меняется) цикл поиска пробела после имени исполняемого файла.
У тебя где-то должен быть invoke ExitProcess,0 - скорее всего это причина, тока я в твоих джампах нигде приткнуть это не смог
q_q Точно, спасибо. Вот так работает: Код (Text): start: invoke GetCommandLine cmp byte[eax],'"' jnz @F inc eax jmp .loop_1 @@: cmp byte[eax],' ' jz .loop inc eax jmp @B .loop_1: cmp byte[eax],'"' jz .loop1_ inc eax jnz .loop_1 .loop1_: add eax,2 .loop: inc eax @@: mov [lpParameters],eax invoke GetCurrentDirectory,260,CurrentDir ...
я имел ввиду моё великое произведение Код (Text): invoke GetCommandLine test eax,eax jnz .input но не знаю наверное не правильно парсит
Semiono Лучше, наверное, будет крутить строку с конца. Код (Text): invoke GetCommandLine mov ebx,eax invoke lstrlen,eax mov ecx,eax add eax,ebx @@: cmp byte[eax],'"' jz @no_spaces cmp byte[eax],' ' jz @F dec eax loop @B ;сюда попадём если строка кончилась, а пробелов нет, либо встретились кавычки, тогда нужно запустить без параметров @no_spaces: mov eax,0 @@: mov [lpParameters],eax По идее GetCommandLine не может возвратить 0(т.е. test eax,eax делать не нужно), потому, как она минимум возвращает указатель на строку с именем запускаемого файла, в данном случае это Loader.exe.