关于HOOK浏览器NtDeviceIoControlFile函数,修改POST数据的问题
2014-02-07 12:01
369 查看
我HOOK了IE的NtDeviceIoControlFile函数,想修改POST发包的数据,IE做POST数据时,会发送两个包,一个是HTTP头,一个是数据,如果修改的数据长度跟原数据长度相等,则可以直接修改数据,不会有问题,但如果数据长度不相等,则需要先修改HTTP头里的Content-length参数,然后再在第二个数据包发送的时候修改数据Buffer。
我的问题是,在第二种情况下,修改长度不一样的包发送后,服务器可以正确识别修改后的数据,等于是修改成功了,但是浏览器这里却会报一个ERROR_INTERNET_INTERNAL_ERROR错误,导致浏览器认为网络错误,我研究了一整天没有头绪,怀疑是不是HOOK的NtDeviceIoControlFile函数里的返回值或者参数的修改方式不对导致的,请坛子里的各位大牛帮我分析一下。
我的修改方式是这样的:
代码:
我的问题是,在第二种情况下,修改长度不一样的包发送后,服务器可以正确识别修改后的数据,等于是修改成功了,但是浏览器这里却会报一个ERROR_INTERNET_INTERNAL_ERROR错误,导致浏览器认为网络错误,我研究了一整天没有头绪,怀疑是不是HOOK的NtDeviceIoControlFile函数里的返回值或者参数的修改方式不对导致的,请坛子里的各位大牛帮我分析一下。
我的修改方式是这样的:
代码:
int PraLenght; NTSTATUS WINAPI CWininetHook::_NtDeviceIoControlFile( HANDLE FileHandle,HANDLE Event OPTIONAL,PVOID ApcRoutine OPTIONAL,PVOID ApcContext OPTIONAL,PVOID IoStatusBlock,ULONG IoControlCode,PVOID InputBuffer OPTIONAL,ULONG InputBufferLength,PVOID OutputBuffer OPTIONAL,ULONG OutputBufferLength ) { LONG stat = -1; if (IoControlCode != AFD_SEND) { __asm { push OutputBufferLength push OutputBuffer push InputBufferLength push InputBuffer push IoControlCode push IoStatusBlock push ApcContext push ApcRoutine push Event push FileHandle call s_pfnNtDeviceIoControlFile mov stat ,eax } return stat ; } string text = ""; PAFD_INFO AfdInfo = NULL; char * Buffer = NULL; ULONG Len = NULL; string domain; if (IoControlCode == AFD_SEND) { AfdInfo = (PAFD_INFO)InputBuffer; Buffer = AfdInfo->BufferArray->buf; Len = AfdInfo->BufferArray->len; text = Buffer; text = text.substr(0,Len); if(text != "!" && text != "" && text.length() > 0) { if(text.substr(0,4) == "POST") { //修改HTTP头里的Content-length if(text.find("SpeSubmit.aspx") != text.npos) { domain = GetDomainFromRequest(text.c_str()); if(Ecode.find(domain) != Ecode.end()) Ecode_h[FileHandle] = Ecode[domain]; else Ecode_h[FileHandle] = -1; PraLenght = MyRelpaceHeaderLength(text); TRACE(text.c_str()); AfdInfo->BufferArray->len = text.size(); AfdInfo->BufferArray->buf = (char *)text.c_str(); } else if(Ecode_h.find(FileHandle) != Ecode_h.end()) { Ecode_h.erase(FileHandle); } } else if(text.substr(0,3) == "GET" && Ecode_h.find(FileHandle) != Ecode_h.end()) { Ecode_h.erase(FileHandle); } else if(Ecode_h.find(FileHandle) != Ecode_h.end()) { //修改POST数据 if(Ecode_h[FileHandle] == -1) { if(MyConver::is_utf8_code(text)) Ecode_h[FileHandle] = TRUE; else Ecode_h[FileHandle] = FALSE; } if(Ecode_h[FileHandle]) MyConver::UTF8ToGBK(text,text.c_str()); BOOL b = MyHttpSendRequest(FileHandle,text); if(Ecode_h[FileHandle]) text = MyConver::GBKToUTF8(text); if(b) { int span = PraLenght - text.size(); for (int i = 0; i < span; i++) { text += " "; } text = text.substr(0,PraLenght); TRACE(text.c_str()); Ecode_h.erase(FileHandle); AfdInfo->BufferArray->len = PraLenght; AfdInfo->BufferArray->buf = (char*)text.c_str(); } } __asm { push OutputBufferLength push OutputBuffer push InputBufferLength push InputBuffer push IoControlCode push IoStatusBlock push ApcContext push ApcRoutine push Event push FileHandle call s_pfnNtDeviceIoControlFile mov stat ,eax } AfdInfo->BufferArray->buf = (char*)Buffer; AfdInfo->BufferArray->len = Len; return stat; } __asm { push OutputBufferLength push OutputBuffer push InputBufferLength push InputBuffer push IoControlCode push IoStatusBlock push ApcContext push ApcRoutine push Event push FileHandle call s_pfnNtDeviceIoControlFile mov stat ,eax } } return stat ; }
相关文章推荐
- 关于JBoss7.X修改post传输数据量(max-post-size)的问题
- 找到一篇关于form以post、get方式提交数据中文乱码问题总结
- 关于PHP Curl POST 数据丢失的问题
- Mybatis二级缓存关于多表关联时修改被关联表数据,缓存没清空的问题
- 关于tomcat Post 数据参数的问题 maxPostSize="0"
- 关于在用curl函数post网页数据时,遇上表单提交 type为submit 类型而且没有name和id时可能遇到的问题及其解决方法
- 关于HTTP请求时 请求头中带Expect:100-continue POST数据无响应问题
- 关于service和activity交互修改sharedpreferences数据不同步的问题
- 关于Sqlserver2008,修改数据表无法保存的问题
- 关于修改表字段数据类型的问题(ORA-22859: 无效的列修改 )
- 关于XP系统下IE8总是提示设置默认浏览器的修改问题
- 【WEBAPI】关于WEBAPI无法获取数据的问题之一(Issues while making a POST to a Web API from JQuery)
- 关于Django中修改js css文件但浏览器无法及时与之改变的问题
- 关于POST请求数据发送问题
- 关于JQuery中的ajax请求或者post请求的回调方法中的操作执行或者变量修改没反映的问题
- 关于js中post方法遇到的同步问题(取不到json里的数据)
- 关于JQuery中的ajax请求或者post请求的回调方法中的操作执行或者变量修改没反映的问题
- 关于tomcat Post 数据参数的问题
- 关于浏览器的请求数据到达后台乱码问题
- 关于Sqlserver2008,修改数据表无法保存的问题