2016-04-08 1 views
1

J'utilise Pin pour l'analyse dynamique. Dans ma tâche d'analyse dynamique sur le code binaire 64 bits x86, je souhaite reprendre l'exécution à des positions de programme arbitraires (par exemple, la deuxième instruction de la fonction exécutée en cours) après avoir corrigé certaines erreurs d'accès à la mémoire. rappels.Reprendre l'exécution à des positions arbitraires dans une fonction de rappel

Ce serait quelque chose comme ceci:

BOOL catchSignalSEGV(THREADID tid, INT32 sig, CONTEXT *ctx, BOOL hasHandler, const EXCEPTION_INFO *pExceptInfo, VOID *v) 
{ 
    // I will first fix the memory access error according to certain rules. 
    fix(); 

    // then I would like to resume the execution at an arbitrary position, say, at the beginning of current monitored function 
    set_reg(rip, 0x123456);       // set the rip register 
    PIN_ExecuteAt(ctx);        // resume the execution 

    return false; 
} 

Cependant, je suis arrivé cette exception: E: PIN_ExecuteAt() ne peut pas être appelé à partir d'un rappel.

Je sais que je peux reprendre l'exécution à « instruction en cours » par fausse déclaration à la fin de la fonction de traitement du signal, mais fondamentalement je peux reprendre à arbitraires positions?

Suis-je clair? Merci de votre aide!

Répondre

1

La documentation est claire sur ce point:

Un outil peut appeler cette API pour abandonner la fonction d'analyse en cours et reprendre l'exécution du thread appelant à un nouvel état de registre d'application. Notez que cette API ne revient pas à la fonction d'analyse de l'appelant.

Cette API peut être appelée à partir d'une fonction d'analyse ou une routine de remplacement, mais pas d'un rappel.

Le gestionnaire de signal est considéré comme un rappel. Vous ne pouvez utiliser PIN_ExecuteAt que dans une fonction d'analyse ou une routine de remplacement.

Une chose que vous pouvez essayer de faire est de sauvegarder le contexte qui vous intéresse et de permettre l'application de reprendre, veiller à ce que l'instruction suivante à exécuter est un rappel d'analyse ci-joint. Vous pouvez peut-être utiliser l'instrumentation if-then pour améliorer les performances. Vous pouvez ensuite appeler ExecuteAt à partir de cette routine d'analyse.

+0

Merci beaucoup pour votre aide, je l'ai fait selon vos conseils. Cependant, je suis toujours confus avec «si-alors l'instrumentation pour améliorer la performance» ... pourriez-vous élaborer plus? merci – computereasy

+0

Je parlais de cela car avoir une routine d'analyse pour chaque instruction qui pourrait causer un signal peut avoir un impact important sur les performances. Expliquer si l'instrumentation prend alors plus d'espace que ne le permet la section des commentaires. Je recommande d'aller sur le site Web de Pin et en regardant la section tutoriels, tous les récents discutent de l'instrumentation si-alors en profondeur. – nitzanms