2016-05-15 230 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