2016-04-08 6 views
1

Ich verwende Pin für die dynamische Analyse.Fortsetzen der Ausführung an beliebigen Positionen innerhalb einer Callback-Funktion

In meiner dynamischen Analyse-Aufgabe auf 64-Bit-x86-Binärcode möchte ich die Ausführung an beliebigen Programmpositionen fortsetzen (z. B. die zweite Anweisung der aktuell ausgeführten Funktion), nachdem ich bestimmte Speicherzugriffsfehler innerhalb der Signalverarbeitung behoben habe Rückrufe.

Es wäre so etwas wie dieses:

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; 
} 

Allerdings habe ich diese Ausnahme: E: PIN_ExecuteAt() kann nicht von einem Rückruf aufgerufen werden.

Ich weiß, dass ich die Ausführung bei „aktueller Anweisung“ wieder aufgenommen werden kann durch return false am Ende der Signalverarbeitungsfunktion, aber im Grunde kann ich wieder an beliebigen Positionen?

Bin ich klar? Danke für Ihre Hilfe!

Antwort

1

Die Dokumentation ist klar dazu:

Ein Werkzeug dieser API aufrufen kann die aktuelle Analysefunktion und Fortsetzen der Ausführung des aufrufenden Threads in einem neuen Anwendungsregisterzustand zu verlassen. Beachten Sie, dass diese API nicht zur Analysefunktion des Aufrufers zurückkehrt.

Diese API kann von einer Analysefunktion oder einer Ersetzungsroutine aufgerufen werden, jedoch nicht von einem Rückruf.

Der Signalhandler wird als Rückruf betrachtet. Sie können PIN_ExecuteAt nur in einer Analysefunktion oder einer Ersetzungsroutine verwenden.

Eine Sache, die Sie versuchen können, ist, den Kontext zu speichern, an dem Sie interessiert sind, und die Anwendung fortsetzen zu lassen, um sicherzustellen, dass der nächsten auszuführenden Anweisung ein Analyse-Callback beigefügt ist. Sie können möglicherweise Instrumentierung mit Wenn-dann-Leistung verwenden, um die Leistung zu verbessern. Dann können Sie ExecuteAt von dieser Analyse-Routine aufrufen.

+0

Vielen Dank für Ihre Hilfe, ich habe es nach Ihren Angaben gemacht. Allerdings bin ich immer noch verwirrt mit "wenn-dann-Instrumentierung, um die Leistung zu verbessern" ... könnten Sie mehr ausarbeiten? Danke – computereasy

+0

Ich habe darüber gesprochen, weil eine Analyse-Routine für jede Anweisung, die ein Signal verursachen könnte, einen großen Einfluss auf die Leistung haben kann. Wenn if-then Instrumentierung mehr Speicherplatz benötigt, als der Kommentarabschnitt zulässt. Ich empfehle, zu Pin's Website zu gehen und den Tutorial-Bereich zu betrachten, alle neueren diskutieren Wenn-Dann-Instrumentierung in der Tiefe. – nitzanms