Dtrace показывает, что posix_spawn вызывается только с 3 аргументами. Попытка запустить вручную

409
Alex Popov

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

Что привлекло мое внимание, так это строка вывода 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, и я почти готов сдаться.

2

1 ответ на вопрос

0
Birchlabs

Если вы читаете исходный код для 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 не поддерживает циклы. Я думаю, потому что для трассировки недопустимо вводить возможность бесконечного цикла внутри ядра.