2016-05-15 231 views
2

因此,我最近迷上了PR_Write在Mozilla中,並能夠將結果(所有連接字面意思)記錄到日誌文件,但有一個問題,我假設掛鉤PR_Write後,我將能夠捕獲HTTPS數據,但是當我登錄到HTTPS服務器時,它不捕獲未加密的POST數據,我嘗試使用本地主機並進行假POST,並且捕獲localhost帖子,因爲它未加密。掛鉤PR_Write是不是要捕獲所有類型的數據?PR_Write掛鉤後

這是PR_Write的原型,我使用和變量:

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

PR_Write definition by Mozilla

和繞行功能,我通過獲取其上存儲的地址調用原始PR_Write在c_write使用GetProcAddress。下面是它怎麼叫:

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

的記錄和其他的東西,工作正常,但當它歸結爲寫加密的POST數據,它失敗。它最終寫了胡言亂語。

+0

當然 - 它有strlen()。肯定是錯的。 –

+0

我想知道爲什麼hooked調用具有'int bytes'參數?我確定它出於某種原因必須在那裏..... –

+0

PR_Write的定義有這三個參數,在這裏提到https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSPR /參考/ PR_Write – demogorgon

回答

1

'write(buf,sizeof(char),strlen(buf),fileHandle);' - strlen()調用既不合適也不必要。它不僅無法可靠地使用void指針,它可能會或可能不會指向以空字符結尾的char數組,它是多餘的,因爲您已經知道要寫入多少個字節/字符 - 它是作爲'int bytes'參數傳入的。

擺脫strlen()調用;

fwrite(buf, 1,bytes, fileHandle); 

strlen()不是必需的,不能可靠地使用可能包含嵌入式空值的二進制數據。

對於網絡代碼,strlen()是99.9%的時間內發生災難。

+0

該死的,是的,我怎麼可能沒有看到哈哈讓我試試這段代碼 – demogorgon