Dtrace zeigt, dass posix_spawn mit nur 3 Argumenten aufgerufen wird. Versuchen, von Hand zu starten

473
Alex Popov

Ich habe dtrusseinen Prozess ausgeführt, bei dem ein anderer gestartet wird: Der League of Legends Launcher startet den Hauptspielprozess mit bestimmten Argumenten, die ich scheinbar nicht über die Befehlszeile übergeben kann.

Was meine Aufmerksamkeit auf sich zog, war diese Zeile der Dtruss-Ausgabe:

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

Ich habe die Manpage nachgesehen posix_spawnund soll 6 Argumente akzeptieren. Sie sind in der Reihenfolge PID, /path/to/file, file_actions, aatrp, argvund envp.

Ich ging zur gleichen Zeit durch GDB dtruss, um den fraglichen Speicher zu überprüfen.

  • Das erste Argument wies auf 0x000024d2 hin, das in der PID enthalten war.
  • Das zweite Argument zeigte auf ein Zeichenarray: den ausführbaren Pfad für LeagueofLegends
  • Das dritte Argument zeigt immer auf dasselbe, dessen unverständliche Zeichenfolgendarstellung ist \026l<?

Ich weiß nicht, was ich davon halten soll. Letztendlich möchte ich diesen Prozess über C mit meinen benutzerdefinierten Argumenten selbst starten können, aber ich denke, der erste Schritt dazu ist zu verstehen, wie er vom System aufgerufen wird und was das dritte Argument ist.

Meine Fragen sind: Was kann ich noch tun, um herauszufinden, was das dritte Argument ist (?) Und was ich versuche zu tun (den Launcher zu umgehen)?

Es ist direkt in der Windows-Befehlszeile möglich über,

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

Bei Mac wird der Launcher jedoch neu gestartet.

Für den Kontext habe ich bereits eine lange (und unbeantwortete) Frage geschrieben, in der alles beschrieben ist, was ich getan habe.

Bitte lassen Sie mich wissen, wie ich diese Frage verbessern kann. Ich habe über 50 Stunden damit verbracht, dies selbst herauszufinden, brutale Zwangsarbeit durch Dtruss-Ausgabe, und ich bin gerade dabei, aufzugeben.

2

1 Antwort auf die Frage

0
Birchlabs

Wenn Sie den Quellcode für dtruss gelesen haben:

cat `which dtruss` 

Sie werden feststellen, dass die Anzahl der Argumente hartcodiert ist.

Eintrag:

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

Rückkehr:

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

Bestimmte Systemaufrufe haben ein spezielles Handling ( /* mmap has 6 arguments */).

Ich habe eine Kopie des Skripts und kopier eingefügt in ein paar mehr self->arg*und , 0x%X.

Ich konnte die Standardeinstellung auf 6 Args ändern und eine Ausgabe wie folgt erzielen:

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

Warum müssen wir args kopieren und einfügen, anstatt nur einen Zähler zu erhöhen: DTrace unterstützt keine Schleifen. Ich denke, weil es für das Tracing nicht akzeptabel ist, die Möglichkeit einer Endlosschleife im Kernel einzuführen.