pour WinDBG, IDA, Process Explorer, …
Parce que WinDBG
seul ne suffit pas, un petit HowTo rapide sur les symboles Microsoft
Les symboles de débogage Microsoft
Microsoft n’est pas avare d’informations, une grande partie des symboles de leurs binaires (exécutables, librairies, pilotes, …) est disponible publiquement !
Cela permet, entre autre, de connaître des noms de fonctions internes, de variables globales, structures, … tout ce que Microsoft accepte que nous connaissions.
Bien que ces informations soient épurées, il n’en reste pas moins quelques pépites.
void __stdcall TSRevealPassword(struct _UNICODE_STRING *) void __stdcall KerbRevealPassword(struct _UNICODE_STRING *)
Il serait dommage de s’en priver.
Pour cela, les outils présentés dans ce post, utilisent a minima :
dbghelp.dll
pour manipuler les symbolessymsrv.dll
pour récupérer les symboles- une configuration indiquant le référentiel de symboles
- au niveau global via
_NT_SYMBOL_PATH
- au niveau global via
Les dernières versions de ces librairies sont installées par WinDBG.
Considérations sur la configuration proposée
- L’utilisation courante des symboles occupe de l’espace disque
- Si plusieurs postes doivent déboguer, il est préférable d’utiliser un référentiel intermédiaire afin de ne pas récupérer plusieurs fois les mêmes informations
- Les utilisateurs doivent pouvoir écrire a minima dans le référentiel final, l’écriture dans l’intermédiaire permet de l’alimenter depuis les utilisations de chacun
Configuration
La configuration proposée est la suivante :
_NT_SYMBOL_PATH = srv*c:\symbols*http://msdl.microsoft.com/download/symbols
A chaque besoin d’un symbole, le référentiel c:\symbols
est inspecté.
- si le symbole y figure, celui-ci est utilisé
- si le symbole n’y figure pas, le référentiel
http://msdl.microsoft.com/download/symbols
est utilisé
Le symbole est ensuite copié dans le référentielc:\symbols
pour éviter de le re-télécharger
Il faut ajouter une nouvelle variable d’environnement système (ou utilisateur) :
Si un référentiel intermédiaire doit être utilisé :
_NT_SYMBOL_PATH = srv*c:\symbols*\\litchinanas.nirvana.local\programmation\symbols*http://msdl.microsoft.com/download/symbols
Si les droits le permettent, http://msdl.microsoft.com/download/symbols
alimente \\litchinanas.nirvana.local\programmation\symbols
qui alimente c:\symbols
Les informations sur la définition de cette variable sont disponibles ici : http://msdn.microsoft.com/library/windows/hardware/ff537994.aspx
WinDBG – le prérequis
A l’heure actuelle, la dernière version x86 est disponible ici : http://blog.gentilkiwi.com/retro-ingenierie/windbg-6-2-9200-16384
Une fois installées, les librairies essentielles au fonctionnement des symboles se trouveront dans : C:\Program Files\Windows Kits\8.0\Debuggers\x86
(ou équivalent sous x64).
Utilisation SANS les symboles
mov dword ptr [notepad+0xc1e4 (001ec1e4)],offset notepad+0x739b (001e739b) call dword ptr [notepad+0x1354 (001e1354)] push eax call notepad+0x77f3 (001e77f3)
Utilisation AVEC les symboles
mov dword ptr [notepad!OFN+0x44 (001ec1e4)],offset notepad!NpOpenDialogHookProc (001e739b) call dword ptr [notepad!_imp__GetOpenFileNameW (001e1354)] push eax call notepad!_LegacyFileDialogToHR (001e77f3)
N’est-ce pas plus compréhensible ?
Process Explorer & Process Monitor
Certains affichages de Process Explorer et Process Monitor peuvent eux aussi facilement bénéficier de l’aide de symboles.
Via Options / Configure Symbols...
:
(l’option ‘Symbols Path’ est inutile quand la variable d’environnement _NT_SYMBOL_PATH
est renseignée)
Sinon en console :
reg add "HKCU\Software\Sysinternals\Process Explorer" /v DbgHelpPath /t REG_SZ /d "C:\Program Files\Windows Kits\8.0\Debuggers\x86\dbghelp.dll" /f reg add "HKCU\Software\Sysinternals\Process Explorer" /v SymbolPath /t REG_SZ /f reg add "HKCU\Software\Sysinternals\Process Monitor" /v DbgHelpPath /t REG_SZ /d "C:\Program Files\Windows Kits\8.0\Debuggers\x86\dbghelp.dll" /f reg add "HKCU\Software\Sysinternals\Process Monitor" /v SymbolPath /t REG_SZ /f
Utilisation SANS les symboles
Utilisation AVEC les symboles
IDA
Dans certains cas, IDA n’arrive pas à se débrouiller avec ses propres librairies. Quelques manipulations peuvent largement l’aider…
- Supprimer du répertoire d’IDA :
dbghelp.dll
symsrv.dll
symsrv.yes
(si présent)
- Recopier les fichiers suivants depuis le répertoire de WinDBG (
C:\Program Files\Windows Kits\8.0\Debuggers\x86
) vers celui d’IDA :symsrv.dll
symsrv.yes
- Via le fichier de configuration d’IDA (
cfg\ida.cfg
), modifier la propriétéDBGTOOLS
(elle est sans doute à dé-commenter, sinon la créer) :
DBGTOOLS = "C:\\Program Files\\Windows Kits\\8.0\\Debuggers\\x86\\";
pratique pour piloter, par la même occasion, WinDBG depuis IDA - Forcer l’utilisation des symboles si IDA a été configuré pour ne plus le demander :
reg add "HKCU\Software\Hex-Rays\IDA\Hidden Messages" /v "IDA Pro has determined that the input file was linked with debug information Do you want to look fo" /t REG_DWORD /d 1 /f