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!
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
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