Dtrace mostra posix_spawn chamado com apenas 3 argumentos. Tentando lançar à mão

2

Corri dtruss em um processo que lança outro: o League of Legends Launcher inicia o processo principal do jogo com certos argumentos que não consigo passar pela linha de comando.

O que me chamou a atenção foi essa linha de saída dtruss:

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

Eu procurei na página de manual por posix_spawn , e é suposto aceitar 6 argumentos. Eles são, em ordem, PID , /path/to/file , file_actions , aatrp , argv e envp .

Eu estava percorrendo o GDB ao mesmo tempo em que executava dtruss , então pude inspecionar a memória em questão.

  • O primeiro argumento apontou para 0x000024d2, que estava no PID.
  • O segundo argumento apontou para uma matriz char: o caminho do executável para LeagueofLegends
  • O terceiro argumento sempre aponta para a mesma coisa, da qual a representação de string ininteligível é 6l<?

Eu não sei o que fazer com isso. Em última análise, eu quero ser capaz de lançar este processo sozinho via C, com meus argumentos personalizados, mas acho que o primeiro passo para fazer isso é entender como é chamado pelo sistema, e qual é o terceiro argumento.

Minhas perguntas são: o que mais posso fazer para descobrir qual é o terceiro argumento (?) e o que estou tentando fazer (contornar o lançador) é possível?

É possível diretamente na linha de comando do Windows via,

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

mas no Mac isso apenas relança o lançador.

Para o contexto, eu já escrevi um longa (e não respondida) pergunta descrevendo tudo o que fiz.

Por favor, deixe-me saber como posso melhorar esta questão. Eu gastei mais de 50 horas tentando descobrir isso sozinho, brute forçando a saída do dtruss, e estou quase pronto para desistir.

    
por Alex Popov 03.06.2014 / 02:05

1 resposta

0

Se você ler o código-fonte para dtruss:

cat 'which dtruss'

Você descobrirá que o número de argumentos está codificado.

Entrada:

 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;
 }

Retorno:

 /* 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;
 }

Certos syscalls têm manipulação sob medida ( /* mmap has 6 arguments */ ).

Eu fiz uma cópia do script e copiei-colei em mais alguns self->arg* e , 0x%X .

Consegui alterar o padrão para 6 args, conseguindo uma saída assim:

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

Por que temos que copiar e colar args em vez de apenas incrementar um contador: o DTrace não suporta loops. Acho que é inaceitável que o rastreamento introduza a possibilidade de um loop infinito dentro do kernel.

    
por 04.09.2017 / 00:28