Une impasse avec crochetage appelle à HeapAlloc pour une application de suivi de la mémoire
-
21-08-2019 - |
Question
Je suis en train d'écrire une application de suivi de mémoire qui accroche tous les appels à l'aide HeapAlloc mécanisme de correction IAT. L'idée est de capturer tous les appels à HeapAlloc et obtenir un callstack.
Cependant, je suis actuellement confronté à un problème à obtenir l'aide de callstack DBGHELP Apis. Je trouve que la dll dbghelp lui-même est un lien vers MSVCRT dll et ce résultat dans un de dépendance appel récursif. Lorsque je tente d'obtenir un callstack pour l'un des appels de l'application cible, dbghelp appelle en interne une méthode de MSVCRT qui appelle à nouveau HeapAlloc. Et comme je l'ai déjà patché MSVCRT il en résulte une boucle infinie.
Quelqu'un at-il fait face à ce problème et résolu? Y at-il moyen de sortir de cette impasse?
La solution
Ceci est un problème standard dans le code d'interception de fonction. Nous avons eu un problème similaire avec une bibliothèque de journalisation qui utilise la mémoire partagée pour stocker des informations de niveau de journal, tandis que la bibliothèque de mémoire partagée a dû enregistrer des informations.
La façon dont nous avons fixé il pourrait être appliqué à votre situation, je crois.
Dans votre code d'interception, de maintenir un drapeau statique qui indique que vous êtes ou non au milieu d'une interception. Lorsque votre interception est appelée et le drapeau n'est pas réglé, le drapeau alors faites ce que vous faites actuellement, y compris l'appel DbgHelp, puis désactivez le drapeau.
Si votre interception est appelée alors que le drapeau est réglé, appelez uniquement le code HeapAlloc back-end sans faire les autres choses (y compris l'appel DbgHelp qui est ce qui cause votre récursion infinie).
Quelque chose le long des lignes de (pseudo-code):
function MyHookCode:
static flag inInterceptMode = false
if inInterceptMode:
call HeapAlloc
return
inInterceptMode = true
call DbgHelp stuff
call HeapAlloc
inInterceptMode = false
return
function main:
hook HeapAlloc with MyHookCode
: : :
return