10
votes

Comment utilisez-vous SymlatModuleEx pour charger un fichier PDB?

J'essaie d'appeler SymloadModuleEx pour charger les symboles à partir d'un fichier PDB, puis utilisez symbromaddr pour rechercher les symboles de ce PDB. Cependant, je ne peux pas comprendre ce qu'il faut passer pour les paramètres baseofdll et dllsize - la documentation explique explicitement que lors du chargement d'un fichier PDB, ces paramètres ne peuvent pas être 0, et en train de tenter de passer 0 des résultats en échec avec error_invalid_paramètre .

Voici ce que mon code ressemble à: xxx

Comment Déterminez ce qu'est-ce que baseofdll et Dllsize pour transmettre lors du chargement d'un fichier PDB? Le fichier PDB en question est le fichier de symboles d'un autre programme exécutable (pas une DLL) et uniquement pour des arguments, supposons que vous n'avez pas accès à l'EXE d'origine à partir duquel le PDB a été généré.

Alternativement, y a-t-il une meilleure méthode de recherche des symboles correspondant à une adresse donnée à partir d'un fichier PDB?


0 commentaires

3 Réponses :


10
votes

dbghelp.dll et the SYM * Les méthodes utilisent ici le Accès d'interface de débogage (dia) sdk. 1
DIA lui-même est basé sur COM et beaucoup plus flexible que ce que propose DBGHELP.

Spécifiquement, pour charger un PDB connu et rechercher un symbole basé sur une adresse, vous pouvez procéder comme suit:

  1. COCReate une source de données DIA (voir "Exemple" section ici ).
  2. Utilisez IdiaDataSource :: LoadDataFrompdb charger un PDB spécifique (taille DLL et adresse de base ne sont pas nécessaires).
  3. Utilisez IDIADataSource :: OpenSession Pour obtenir le Idiasession pour votre Source de données.
  4. Selon si vous avez une adresse virtuelle absolue (VA) ou une adresse virtuelle relative (RVA), vous pouvez utiliser windsymbolbyva ou FINDSYMBOLBYRVA , respectivement, pour obtenir le idiasymbol associé à cette adresse.
  5. Enfin, vous pouvez utiliser idiasymbol :: get_name pour obtenir le nom de la fonction contenant l'adresse que vous avez spécifiée.

    Aucun de cela ne nécessite l'image d'origine; Seul le PDB est requis. En supposant que vous utilisez Visual Studio, les en-têtes et les bibliothèques de Dia sont disponibles sous (par exemple):
    C: \ Fichiers du programme (x86) \ Microsoft Visual Studio 10.0 \ dia sdk .


0 commentaires

0
votes

L'échantillon DI2DUMP fonctionne bien pour moi dans la résolution de l'adresse virtuelle relative (adresse de charge du programme EIP) sur PDB pour les pointeurs de fonction non résolus. C'est la façon dont j'essaie: xxx

par exemple: Fonction: [00447B60] [0001: 00446b60] ServerConfig :: GetsSlConfig (Public: Struct SSL_Config __cdecl ServerConfig :: getSlconfig (void) __ptr64)

Ici, le RVA est 00447B60 [EIP - Adresse de charge de processus] Le segment est 0001 Le décalage est 00446b60


0 commentaires

0
votes

Je n'ai pas permitions à commentaires, donc le fera en réponse séparée.

  1. Oui, DbgHelp est une enveloppe autour de DIA, seulement en termes de lib statique. DIA est lié statiquement DbgHelp.dll. DbgHelp appelle directement l'usine de classe COM Dia (IClassFactory) de mise en œuvre de contournement COM. Je parle de la version 6.1.7601.17514. Alors DbgHelp.dll est autonome (en combinaison avec symcrv.dll et srcsrv.dll)
  2. objets COM Dia sont livrés avec Visual Studio (même endroit avec dbgeng.dll), donc la solution que nous ne le travail sur envs où VS n'est pas installé (mais vous pouvez toujours essayer d'utiliser msdia120.dll comme montage privé montrant via ActivateActCtx , mais aussi besoin de déployer des dépendances , si elles présentent)
  3. DbgHelp est compact et a recommandé de distribuer des copies privées avec votre application par Microsoft. Voir « Les politiques de redistribution pour ces inclus DLLs ont été spécialement conçues pour le rendre aussi facile que possible pour les personnes à inclure ces fichiers dans leurs propres packages et la libération "

  4. Je ne trouve pas la façon comment télécharger des fichiers PDB à l'aide des interfaces DIA. Sym API permet. il délègue les appels à SymSrv.dll.

    Alors question initiale est toujours réelle.


0 commentaires