Замена аргументов CommandLine

Июнь

Новичок
Автор темы
6
11
Версия MoonLoader
.026-beta
Мы можем получить аргументы командной строки таким способом:

code::
local ffi = require("ffi")

ffi.cdef[[
    const char* GetCommandLineA();
]]

print(ffi.string(ffi.C.GetCommandLineA()))

Пример получаемых данных:
samp.exe -h 127.0.0.1 -p 7777 -n Nick_Name

Есть ли способы/примеры замены аргументов активно процесса в ЛУА? Или это не получится так просто провернуть без погружения в PEB? Меня интересует замена аргументов параметров -h -n, что бы эти изменения были применены а не визуально установлены ( О_О, думаю такое может быть, к примеру если процесс не реагирует на изменение и строго следует параметру запуска по размеченной карте).

Сталкивался кто-то с заменой аргументов кмд.лайн на других языках программирования? В реализации, трудность замены Никнейма от замены IP будет сильно отличаться?
 

stool

Известный
477
401
-h -n, что бы эти изменения были применены а не визуально установлены
В этом нет абсолютно никакого смысла, ибо аргументы вряд ли будут снова использоваться после инициализации и парсинга аргументов, когда всё уже распихано по полям.
The GetCommandLine function reads the command line from a global variable. This variable is initialized during process startup, so if you change the command line after the process startup, the variable will not reflect the change.


не получится так просто провернуть без погружения в PEB?
Unfortunately GetCommandLineW doesn't return the command line from the PEB. In the BaseDllInitialize routine a copy is made of the PEB command line structure, and from then on this copy is used by GetCommandLineW. You would need to locate this copy in memory in order to modify it, which seems quite difficult and also dangerous/unreliable.
 
  • Нравится
Реакции: whyega52 и Июнь

Ma$$acre

Новичок
6
0
Мы можем получить аргументы командной строки таким способом:

code::
local ffi = require("ffi")

ffi.cdef[[
    const char* GetCommandLineA();
]]

print(ffi.string(ffi.C.GetCommandLineA()))

Пример получаемых данных:
samp.exe -h 127.0.0.1 -p 7777 -n Nick_Name

Есть ли способы/примеры замены аргументов активно процесса в ЛУА? Или это не получится так просто провернуть без погружения в PEB? Меня интересует замена аргументов параметров -h -n, что бы эти изменения были применены а не визуально установлены ( О_О, думаю такое может быть, к примеру если процесс не реагирует на изменение и строго следует параметру запуска по размеченной карте).

Сталкивался кто-то с заменой аргументов кмд.лайн на других языках программирования? В реализации, трудность замены Никнейма от замены IP будет сильно отличаться?
Изменить аргументы командной строки у уже запущенного процесса так, чтобы программа начала использовать новые значения, нельзя. Нужно либо перезапускать процесс, либо патчить память с переменными, которые программа использует после парсинга аргументов.
 

Tema05

Известный
1,523
494
Я успешно решал подобную задачу для некоторых своих целей. Тут выше какие-то сверх-заумные вещи пишут непонятно нахуя. Может я быдло в программировании, хз. Просто получал указатель на строку через GetCommandLineA и GetCommandLineW и напрямую в памяти менял содержимое (не забываем \0). От части это было для лаунчера Аризоны, который регулярно переиспользует командную строку для всех своих параметров, но и для некоторых дефолтных (как раз ник и сервер). Функция GetCommandLineA после этого в самом сампе, во всех плагинах, скриптах, cleo, lua и т.п. прекрасно возвращала обновлённую строку и ничего не ломалось.

К сожалению если ты хочешь изменить командную строку так, чтобы при запуске игры все сразу использовали обновлённые параметры, lua запускается слишком поздно и не успеет изменить командную строку. Нужно писать реализацию в формате asi, тогда всё будет как надо. Во время работы игры можно повторно менять содержимое командной строки откуда удобно и при последующих вызовах GetCommandLineA она будет обновлена. Если же самп уже достал твой сервер и ник из командной строки и не обращается к ней повторно то для этого вообще-то существует реконнект. Актуальный ник и адрес сервера хранится в конкретном месте структуры CNetGame и для всех версий сампа это максимально подробно документировано. Так что ты можешь иметь полный контроль над всеми параметрами в реальном времени без перезагрузки чего-либо
 
Последнее редактирование:
  • Нравится
Реакции: stool