2016-05-15 16 views
2

So vor kurzem süchtig ich PR_Write in Mozilla und war in der Lage, Ergebnisse (alle Verbindung buchstäblich) zu einer Protokolldatei zu protokollieren, gibt es jedoch ein Problem, ich war davon ausgegangen, dass nach PR_Write würde ich erfassen können HTTPS-Daten, aber wenn ich mich bei einem HTTPS-Server anmelde, erfasst es nicht die unverschlüsselten POST-Daten, ich habe versucht, localhost zu verwenden und einen gefälschten POST zu erstellen und erfasst den localhost-Post, wenn er nicht verschlüsselt ist. Ist PR_Write dafür gedacht, nicht alle Arten von Daten zu erfassen? PR_Write nach dem hooking

Dies ist der Prototyp des PR_Write, die ich verwende, und die Variable:

typedef int (*Custom_Write)(PVOID, LPVOID, INT); 
Custom_Write c_write=NULL; 

PR_Write definition by Mozilla

und in der Umweg Funktion, nenne ich die ursprüngliche PR_Write durch die Adresse bekommen, die gespeichert wird in c_write mit GetProcAddress. Unten ist, wie es heißt:

// detour function 
int detour_pr_write(int fd, LPVOID buf, int bytes) 
{ 
    // ... code for virtual protect 
    int retaddr=c_write(fd, buf, bytes); 
    // file functions 
    fwrite(buf, sizeof(char), strlen(buf), fileHandle); 
    // ... code for virtual protect 
    return retaddr; // go to original function 
} 

funktioniert Die Protokollierung und andere Sachen in Ordnung, aber wenn es um das Schreiben verschlüsselt POST-Daten kommt nach unten, es funktioniert nicht. Es endet damit, Kauderwelsch zu schreiben.

+0

Sicher - es hat strlen() drin. Gebunden, um falsch zu liegen. –

+0

Ich frage mich, warum der Hooked Call diesen 'Int Bytes' Parameter hat? Ich bin mir sicher, dass es aus irgendeinem Grund da sein muss ... –

+0

Die Definition von PR_Write hat diese drei Parameter wie hier https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSPR/Referenz/PR_Write – demogorgon

Antwort

1

'schreiben (buf, sizeof (char), strlen (buf), fileHandle);' - Der Aufruf von strlen() ist sowohl unangemessen als auch unnötig. Es funktioniert nicht nur zuverlässig mit void-Zeigern, die auf null-terminierte char-Arrays zeigen können oder wollen, es ist redundant, weil Sie bereits wissen, wieviele Bytes/Zeichen geschrieben werden müssen - es wird als 'int bytes' -Parameter übergeben .

Entfernen Sie den Aufruf strlen();

strlen() ist nicht erforderlich und kann nicht zuverlässig mit Binärdaten arbeiten, die eingebettete Nullen enthalten können.

Mit Netzwerkcode ist strlen() in 99,9% der Fälle eine Katastrophe.

+0

verdammt, ja, wie hätte ich das nicht sehen können haha ​​lemme diesen Code ausprobieren – demogorgon