2

Я запустил dtruss для процесса, который запускает еще один: запускает League of Legends запускает основной игровой процесс с определенными аргументами, которые я не могу передать через командную строку.

Что привлекло мое внимание, так это строка вывода dtruss:

PID/THRD  RELATIVE  ELAPSD    CPU SYSCALL(args)          = return
9386/0x47dac:     19625    3013   1805 posix_spawn(0x2A634FC, 0x38A2A00, 0xB06A56E0)         = 0 0

Я посмотрел справочную страницу для posix_spawn , и он должен принять 6 аргументов. Это, по порядку, PID , /path/to/file , file_actions , aatrp , argv и envp .

Я проходил через GDB в то же время, что и запуск dtruss , так что я смог проверить нужную память.

  • Первый аргумент указал на 0x000024d2, который был в PID.
  • Второй аргумент указывает на массив символов: путь к исполняемому файлу для LeagueofLegends
  • Третий аргумент всегда указывает на одну и ту же вещь, неразборчивое строковое представление которой равно \026l<?

Я не знаю, что с этим делать. В конечном счете, я хочу иметь возможность запускать этот процесс самостоятельно через C с моими пользовательскими аргументами, но я думаю, что первый шаг, который нужно сделать, это понять, как он вызывается системой, и каков этот третий аргумент.

Мои вопросы: что еще я могу сделать, чтобы узнать, что это за третий аргумент (?) и возможно ли то, что я пытаюсь сделать (обойти лаунчер)?

Это возможно непосредственно в командной строке Windows через

 @start "" "League of Legends.exe" "8394" "LoLLauncher.exe" "" "spectator fspectate.op.gg:4081 tjJbtRLQ/HMV7HuAxWV0XsXoRB4OmFBr 1391881421 NA1"

но на Mac это просто перезапускает лаунчер.

Для контекста, я уже написал длинный (и без ответа) вопрос, описывающий все, что я сделал.

Пожалуйста, дайте мне знать, как я могу улучшить этот вопрос. Я потратил более 50 часов, пытаясь выяснить это самостоятельно, путем грубого форсирования вывода dtruss, и я почти готов сдаться.

1 ответ1

0

Если вы читаете исходный код для dtruss:

cat `which dtruss`

Вы обнаружите, что количество аргументов жестко закодировано.

Вступление:

 syscall:::entry
 /(OPT_command && pid == $target) || 
  (OPT_pid && pid == PID) ||
  (OPT_name && NAME == strstr(NAME, execname)) ||
  (OPT_name && execname == strstr(execname, NAME)) ||
  (self->child)/
 {
    /* set start details */
    self->start = timestamp;
    self->vstart = vtimestamp;
    self->arg0 = arg0;
    self->arg1 = arg1;
    self->arg2 = arg2;

    /* count occurances */
    OPT_counts == 1 ? @Counts[probefunc] = count() : 1;
 }

Вернуть:

 /* print 3 arg output - default */
 syscall:::return
 /self->start/
 {
    /* calculate elapsed time */
    this->elapsed = timestamp - self->start;
    self->start = 0;
    this->cpu = vtimestamp - self->vstart;
    self->vstart = 0;
    self->code = errno == 0 ? "" : "Err#";

    /* print optional fields */
    /* OPT_printid  ? printf("%5d/%d:  ",pid,tid) : 1; */
    OPT_printid  ? printf("%5d/0x%x:  ",pid,tid) : 1;
    OPT_relative ? printf("%8d ",vtimestamp/1000) : 1;
    OPT_elapsed  ? printf("%7d ",this->elapsed/1000) : 1;
    OPT_cpu      ? printf("%6d ",this->cpu/1000) : 1;

    /* print main data */
    printf("%s(0x%X, 0x%X, 0x%X)\t\t = %d %s%d\n",probefunc,self->arg0,
        self->arg1,self->arg2,(int)arg0,self->code,(int)errno);
    OPT_stack ? ustack()    : 1;
    OPT_stack ? trace("\n") : 1;
    self->arg0 = 0;
    self->arg1 = 0;
    self->arg2 = 0;
 }

Некоторые системные вызовы имеют индивидуальную обработку (/* mmap has 6 arguments */).

Я сделал копию сценария и вставил несколько копий self->arg* и , 0x%X

Я был в состоянии изменить значение по умолчанию на 6 аргументов, достигнув результата, как это:

posix_spawn(0x700003AA66B4, 0x7FF7B215BF10, 0x700003AA6570, 0x700003AA6610, 0x700003AA6720, 0x0)         = 0 0

Что касается того, почему мы должны копировать-вставлять аргументы, а не просто увеличивать счетчик: DTrace не поддерживает циклы. Я думаю, потому что для трассировки недопустимо вводить возможность бесконечного цикла внутри ядра.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .