1

Connaissais vous un programme permettant de capturer les échanges stdout/stderr entre un process A et un process B (sous windows) avec B fils de A ?

Merci
octopus
avatar

2

Pas simple...

Apparemment, la capture de stdout/stderr se fait en utilisant un pipe :
https://docs.microsoft.com/en-us/windows/desktop/procthread/creating-a-child-process-with-redirected-input-and-output

Il y a des outils pour observer les pipes nommés :
https://wiki.wireshark.org/CaptureSetup/Pipes
https://docs.microsoft.com/en-us/sysinternals/downloads/pipelist
http://ioninja.com/plugins/pipe-listener.html

Mais là ce sont des pipes anonymes, je ne sais pas si c'est utilisable.

Warpten a été invité sur ce sujet.

Toi qui aimes bien aller regarder à l'intérieur des processus, t'as peut-être une idée ?
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3

Tu as la main sur les applis mere et fille, ou c'est de l'espionnage pur et dur? grin
A ma connaissance, il n'y a pas d'API (publiquement disponible en tout cas grin) permettant d'obtenir un handle de stdin/out/err d'un processus quelconque autre que celui en cours d'execution. Par contre je peux tout a fait aller voir ce que font GetStdHandle sous le voile cheeky

./2 T'en as meme pas besoin en pratique, tu peux specifier les HANDLE des entrees et sorties std/err dans StartupInfo:

_STARTUPINFOAdocs.microsoft.com


Faut juste un peu de gymnastique en plus pour empecher l'enfant de tuer les HANDLE du parent (donc on les duplique avec DuplicateHandle)

EDIT: Ah ben c'est ce qu'il font dans l'exemple que t'as link, c'est juste un poil plus detaillegrin

Si c'est un pipe meme anonyme il est parfaitement possible de savoir qui l'a cree et qui s'en sert, donc ca doit etre traceable...

---

Pour voir un peu les appels d'API je peux te conseiller API Monitor (http://www.rohitab.com/apimonitor), c'est tres bien foutu (et gratuit!). Avec un peu de chance ca te donnera des pistes, mais la la question est un chouilla vague pour le moment grin


----------

[EDIT] Bon ca devient interessant, le PEB est lisible en dehors du processus grin (NtQueryInformationProcess)

HANDLE __stdcall kernelbase_GetStdHandle(int handle)
{
  HANDLE v1; // esi

  if ( handle == STD_OUTPUT_HANDLE )
  {
    if ( !(NtCurrentPeb()->ProcessParameters->WindowFlags & 0x400) )
    {
      v1 = NtCurrentPeb()->ProcessParameters->StandardOutput;
      goto LABEL_9;
    }
    return 0;
  }
  if ( handle == STD_ERROR_HANDLE )
  {
    v1 = NtCurrentPeb()->ProcessParameters->StandardError;
    goto LABEL_9;
  }
  if ( handle != STD_INPUT_HANDLE )
  {
    v1 = (HANDLE)INVALID_HANDLE_VALUE;
    goto LABEL_13;
  }
  if ( NtCurrentPeb()->ProcessParameters->WindowFlags & 0x200 )
    return 0;
  v1 = NtCurrentPeb()->ProcessParameters->StandardInput;
LABEL_9:
  if ( v1 == (HANDLE)-1 )
LABEL_13:
    ((void (__thiscall *)(unsigned int))unk_74954520)(0xC0000008);
  return v1;
}

(NtCurrentPeb() = __readfsdword(0x30))

Du coup tu peux recuperer les HANDLE des consoles de n'importe quel processus, et tu dois meme pouvoir les modifier (grin). Enfin d'abord essaie de savoir si ta cible utilise des pipes, ou juste les consoles.

tin ca me donne des idees ca grin

4

OK merci, je vais deja regarder avec api monitor pour voir si ca m'aide.
avatar