Jump to content











Photo
- - - - -

winpe10 et explorer : échange d'informations


  • Please log in to reply
2 replies to this topic

#1 noel

noel

    Member

  • Members
  • 62 posts
  • Location:nantes
  •  
    France

Posted A week ago

L'idée est la suivante : partager des connaissances permettant l'investigation autour de Explorer.exe et de twinui.dll  dans winpe10.

 

Aussi, si vous avez des compléments d'informations à donner ou des pistes à proposer, s'il vous plait, répondez moi.

 

- la fonctionnalité "affichage du bureau" ( Win + D, clic dans le coin bas et gauche...) :
J'ai pu identifer les enchaînements de messages "WM_xxx" entre différentes fenêtres de "explorer.exe" en utilisant spy++ et windbg.
Et j'ai ainsi pu mettre en évidence que l'envoi du message 0x5BA permet de débloquer le mécanisme de bascule de cet affichage.
A la réception de ce message, "explorer.exe" met à zéro un flag. Il rend ainsi opérationnel les messages qui demandent la bascule de l'affichage du bureau.
Voir mon document sur le site http://t he ov en.org/index.php?topic=1639.msg19180#msg19180
Mais je n'ai pas trouvé "qui" envoyait ce message lors du démarrage de "explorer.exe".
L'investigation était assez simple car seul le mécanisme de messages inter-fenêtres était mis en oeuvre.
Et aussi parce que l'usage de spy++ et windbg était facile dans ce context.

 

-la fonctionnalité "Win + X"
Mes premiers constats dans un windows10 "normal" avec spy++ montrent que deux fenêtres interviennent dans le traitement de "Win + X" :
- une fenêtre dont le nom est "WorkerW" ( attention : il en existe plusieurs du même nom)
- la fenêtre "LauncherTipWnd" qui affiche le menu "Win+X"
Le thread qui traite ces 2 fenêtres est contenu dans TwinUi.dll.
Or, dans winpe10 ( avec le bureau de "explorer.exe" ), cette dll n'est pas chargée.

 

Quelques éléments à noter :
- le livre "inside Com+" est très utile (http://thrysoee.dk/InsideCOM+/)
- S'agissant d'une dll, l'implémentation "in-process" est la seule qui me semble pertinente ( à mon avis ) et je vais tenter de ne pas me polluer avec les autres implémentations.

 

Ma supposition du moment : lors de son premier démarrage, "explorer.exe" crée, entre autres choses, un objet qui implique le chargement de "twinui.dll". Or, dans Winpe, quelque chose interdit ce chargement. Mais quoi et comment le trouver ?

 

Question 1 : quel est le principe de chargement de TwinUi.dll et de ses objets COM ?
Question 2 : comment tracer avec windbg le chargement de TwinUi.dll qui est un "très gros" objet "COM" (7MO)? où placer un bp ?
Question 3 : comment explorer les objets COM de TwinUi.dll ?
Question 4 : les CLSID de twinui.dll ne possèdent pas de ProgId : peut on manipuler ces objets avec Powershell par exemple ? comment identifier les méthodes, leurs paramètres, les variables ?
Question 5 : comment peut on créer le fichier "typelibrary" (.tlb) à partir de Twinui.dll ? est ce utile?
Question 6 : je ne vois pas les interfaces de TwinUi.dll avec OLEView.exe du SDK (lancè en tant que ADM)  : pourquoi ?

 

Voici mes quelques essais avec "Win+X":

tentative 1 - Clic droit sur la fenêtre "Start" et désassemblage de wndProc de "Start"
identifier les éléments nécessaires avec Spy++ et un bout de PS :
  Segment et offset de la wndProc de "Start"
identifier les messages WM_xxx avec spy++ que reçoit cette fenêtre
déassembler la WndProc de la fenêtre "Start"
--->>> conduit à une impasse car le msg 205h ne semble pas traité par cette wndProc.
il semble acheminé vers la la procédure par défaut DefWindowProcW

 

Tentative 2 - clic droit sur la fenêtre "Start" et désassemblage de wndProc de "Shell_TrayWnd"
identifier les éléments nécessaires avec Spy++ et un bout de PS :
  Segment et offset de la wndProc de "Shell_TrayWnd"
identifier les messages WM_xxx avec spy++ que reçoit cette fenêtre
désassembler la WndProc de la fenêtre "Shell_TrayWnd" : je me suis perdu dans le code
poser un BP conditionnel sur le msg (205h)  : il ne se déclenche jamais !
Mon erreur : la fenêtre "Shell_TrayWnd" reçoit WM_SETCURSOR (20h) avec wParam = hWnd de "start"

Tentative 3 - action sur les touches "Win X"
avec spy++, rechercher le processus qui reçoit les messages de cette combinaison de touches :
identifier les messages WM_xxx avec spy++ que reçoit le processus "explorer"
puis identifier par son handle la fenêtre qui reçoit les messages WM_HOTKEY ( car il existe plusieurs fenêtres "workerW" )
identifier les éléments nécessaires avec Spy++ et un bout de PS :
  Segment et offset de la wndProc du bon handle "workerW"
   7fff`6089ef30  --->>> twinui.dll
twinui!CImmersiveWindowMessageService::s_MessageMsgWndProc [shell\twinui\windowmessageservice\lib\windowmessageservice.cpp @ 565]:

Reste à poser un bp conditionnel sur cette wndProc
bp 7fff`5ff4ef30 ".if (rdx == 0x312 ) {.echo msg ok} .else {gc;}"

 

Tentative 4 - recherche du thread et de la fenêtre gérant l'affichage du menu X
classe de fenêtre : LauncherTipWnd
elle reçoit WM_INITMENUPOPUP ( 117h )
wndProc = 60b27bc0
hinst : 7fff60860000
u 7fff`60b27bc0
twinui!CWRLImpWndProc<CLauncherTipContextMenu>::s_WndProcBase [shell\inc\cwndproc_wrl.h @ 15]:

Informations relatives à twinui.dll :
  cette dll exporte seulement 3 fonctions pour gérer un serveur COM/DCOM
     DllGetClassObject
     DllCanUnloadNow
     DllGetActivationFactory
 Son point d'entrée est bien sûr "DllMain"

 

Ps : je ne maîtrise pas assez l'anglais pour écrire dans un forum en anglais. Mais je peux essayer.


Edited by noel, A week ago.

  • Nuno Brito likes this

#2 noel

noel

    Member

  • Members
  • 62 posts
  • Location:nantes
  •  
    France

Posted A week ago

L'idée de ce soir : analyser le démarrage de "explorer.exe".

 

On trouve rapidement une piste avec  %LOCALAPPDATA%\Microsoft\Windows\explorer\ExplorerStartupLog.etl

Ce fichier existe sur ma machine. Donc il doit être possible de le générer dans winpe.

 

Si j'ai bien analysé le code, il faut mettre une valeur supérieure à 1 dans la valeur :

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer

ExplorerStartupTraceRecorded =  2 ou plus ?

 

Le niveau de détail est codé en dur et vaut 4 = TRACE_LEVEL_INFORMATION  ( API EnableTraceEx2, voir MSDN ).

 

Je n'ai pas encore regardé le contenu de ce fichier. Je viens d'essayer avec "WPA.exe" mais impossible de voir quelque chose.

Je ne comprends rien à ce "GUI". Il est question de symboles à charger mais le menu est grisé.

Si quelqu'un peut m'aider ....


  • Nuno Brito likes this

#3 noel

noel

    Member

  • Members
  • 62 posts
  • Location:nantes
  •  
    France

Posted A week ago

Dans win10, en activant la trace avec ExplorerStartupTraceRecorded =  2 ou plus, et en relançant "explorer.exe" (kill and restart), le fichier ".etl" est bien créé.
On peut le lire en l'ouvrant dans la MMC "eventvwr.msc" (journal enregistré).
Mais comme le dit une page de ce site http://www.geoffchap...s/shell/events/, on ne trouve pas d'informations importantes.
Il manque des informations dans "la registry" pour une meilleure lecture.

Donc je vais retourner à l'analyse du code de "explorer" pour tenter de comprendre le lien entre "explorer" et "twinui.dll".
Néanmoins, en parcourant le site de geoffchappell, j'ai un peu compris que "explorer" n'est en fait qu'un "lanceur" d'objets COM et que je vais vite être bloqué.

 

Au fait, dans winpe, cette trace n'est pas créée. Il me semble qu'il manque la variable d'environnement %LOCALAPPDATA%. Et peut être d'autres choses encore.

 

annexe:
http://www.geoffchap...s/shell/events/
"All the Windows Shell executables have code for WPP Software Tracing. Some, such as SHELL32.DLL, contribute to two trace providers. In turn, each provider acts for multiple executables. As usual for WPP Software Tracing, these providers are not configured for use with tools such as the Event Viewer. The data they collect is arguably useful only to Microsoft’s own programmers who work on the source code or at least have it available for reference. "
http://www.geoffchap...events/core.htm
http://www.geoffchap...shell/index.htm
http://www.geoffchap...index.htm?tx=27


  • Nuno Brito likes this




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users