首页
社区
课程
招聘
[求助]Hook ZwDeviceIoControlFile修改数据大小更长的问题
发表于: 2014-8-16 14:39 16573

[求助]Hook ZwDeviceIoControlFile修改数据大小更长的问题

2014-8-16 14:39
16573
http://bbs.pediy.com/showthread.php?t=81204
其实我Hook的不是send而是这个帖子里面的ZwDeviceIoControlFile
通过判断IoControlCode是不是AFD_SEND
如果是的话,则再判断buff里面的内容,如果是我要替换的内容,则替换后再调用原ZwDeviceIoControlFile
只要替换的内容和原内容是一样长度或比原内容短,则可以以正常的返回数据
如果替换的内容比原内容长,那怕是一个字节.那返回的数据就是错误的..
我修改了AfdInfo->BufferArray->buf  和 AfdInfo->BufferArray->len;  很明显是没效果的..
还不知道要修改哪个参数,还是要其它哪个地方..请高手指点一下!
其实就是写一个拦截数据,修改数据并发送...
问题就在于,如果修改的数据大小是一样的话,那可以正确的发送,如果修改的数据的大小变大了,则发送有问题.


------------------------------------------------------------------------------------------------------------------------------------
结贴了....答案在23楼...希望同有这个问题的人能不用像我这样花这么长的时间去解决!
-------------------------------------------------------------------------------------------------------------------------------------

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (25)
雪    币: 19
活跃值: (1111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是不是这个问题? 你发送的字节改变了,然后应用层send的时候 返回的值不一样 导致上层认为发送失败?
2014-8-16 15:29
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
内容改变.只要长度不变的话,那是没问题的,,但如果长度变更长了,那就不行了
2014-8-16 15:34
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你修改的是TCP包不?TCP包头里有windows块设置,不是想发啥就发啥的。每一包都有CheckSum的,如果中间一个bit变化了都会使得三次握手,得到的信道,瞬间Reset,另外你对付的服务器,肯定莫防火墙,没强制检查滑动块。你试试Bing的或Google的服务,错一个bit都叫你reset
2014-8-16 16:56
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那我该如何做呢?? 是TCP 而且还是Get的...比如拿百度来说.
拦截下来的地址是
GET / HTTP/1.1
Host: a0dK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0S2K9h3c8#2i4K6u0W2j5$3!0E0
下面的略了..
然后我修改成
GET /s?wd=aa HTTP/1.1
Host: 5abK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0S2K9h3c8#2i4K6u0W2j5$3!0E0
再发出去.那浏览器返回错误的提示
2014-8-16 17:19
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
去看TCP1-6卷,不用我说,你自然明白,另外跟Http关系不大,要看TCP连接状态。就这块代码,我记得连学再做整半年才懂,挺不好理解的。还是看书来的快。
2014-8-16 17:21
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
呵呵,干啥呢你
2014-8-16 18:49
0
雪    币: 19
活跃值: (1111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
发送的时候 在TCP/IP层才有效验的 这个基本属于AFD层吧 好像没有效验和
2014-8-16 19:36
0
雪    币: 19
活跃值: (1111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个情况就跟HOOK SEND函数修改了BUF一样 返回值要改为新的BUF的大小 你去试试
2014-8-16 19:38
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
TCP1-6卷在哪看的??
2014-8-16 19:40
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
738K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0S2K9h3c8#2i4K6u0W2j5$3!0E0i4K6u0r3M7#2)9K6c8Y4N6V1i4K6y4p5N6r3y4H3i4K6t1#2x3U0m8A6M7q4)9J5y4f1f1#2i4K6t1#2z5p5c8Q4x3U0f1^5c8W2)9J5y4f1f1^5i4K6t1#2b7f1g2Q4x3U0g2m8c8g2)9J5y4f1f1^5i4K6t1#2b7f1k6Q4x3U0g2m8y4W2)9J5y4f1f1^5i4K6t1#2b7e0N6Q4x3U0g2m8x3#2)9J5y4Y4u0K6N6W2)9#2k6X3u0H3i4K6y4p5x3g2)9J5y4Y4c8F1i4K6y4p5j5X3q4A6k6s2g2Q4x3U0k6J5M7%4k6Q4y4h3k6K6M7s2c8Q4x3@1b7K6i4K6t1$3K9h3g2Q4x3@1c8#2N6r3k6Q4x3X3b7^5i4K6t1$3M7Y4y4$3i4K6g2X3M7%4g2Y4x3#2)9K6c8o6g2Q4x3U0k6J5M7%4k6Q4y4h3k6K6N6h3M7@1i4K6y4p5x3e0l9I4i4K6t1$3M7Y4y4$3i4K6g2X3M7%4g2Y4x3g2)9K6c8o6g2Q4x3U0k6G2M7g2)9K6c8s2c8U0M7q4)9J5y4e0t1H3K9i4m8Q4x3U0g2q4y4g2)9J5y4e0S2p5i4K6t1#2z5p5k6Q4x3U0g2q4z5q4)9J5y4f1q4q4i4K6t1#2b7f1g2Q4x3U0f1J5x3q4)9J5y4f1f1#2i4K6t1#2z5p5c8Q4x3U0g2n7y4#2)9J5y4Y4u0K6N6W2)9#2k6Y4y4#2k6K6u0Q4x3@1b7H3i4K6t1$3k6W2)9K6c8o6S2Q4x3U0k6A6L8Y4m8#2N6q4c8Q4x3@1b7$3z5o6b7^5i4K6t1$3j5Y4y4Q4x3@1c8@1j5%4m8Q4x3U0f1J5x3r3W2H3i4K6t1#2c8e0g2Q4x3U0f1^5c8q4)9J5y4e0S2r3i4K6t1#2c8e0S2Q4x3U0g2m8c8g2)9J5y4f1q4q4i4K6t1#2c8e0g2Q4x3U0f1^5c8q4)9J5y4f1t1%4i4K6t1#2c8e0c8Q4x3U0g2n7z5q4)9J5y4e0R3H3
2014-8-16 19:52
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
重新说明一下吧,他Connet后,协议栈形成Tcp连接,如果他发送一次后,后面再修改发送,必定要招至checksum和目标checksum不一至的情况,第一次发送莫问题,但第二次发送如果改的话,ack风暴就刮起来了。然后就是对方或自己reset
2014-8-16 19:56
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这个倒是有可能,他得自己定义一个新的缓冲区。
2014-8-16 20:15
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
可是ZwDeviceIoControlFile返回的不是buf的大小啊
是不是call 原ZwDeviceIoControlFile后.修改IoStatusBlock->Information为新的buff大小?
2014-8-16 21:12
0
雪    币: 19
活跃值: (1111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
没错没错没错没错
2014-8-16 21:22
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
刚才我去试了,call 原ZwDeviceIoControlFile后.IoStatusBlock->Information 等于我修改后的大小啊..都不用我去修改就是一样的大小..
2014-8-16 21:33
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
必须是新buff的大小噢。这个tdi层改数据的方案不好,回到ws2_32.dll去hook,TDI内要形发送序列的。搞不好checksum就出错了
2014-8-16 21:41
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
先感谢您一直关注...我改的是新buff的大小..依然不行...如果是hook ws2_32.dll层的API..那得Hook 四到六个API..觉得有点太麻烦..ws2_32.dll层的api估计改数据也差不多的吧
2014-8-16 22:20
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
表客气,我也在找我问题的答案。另外一般情况下都是ws2_32.dll去拦,如果想把所有数据都收进去拦,要处理的问题太多,远不像网上说的随便改TDI数据,但可以拦,拦劫无非返回一个无效就完 了,但修改需要处理的问题非常多的。如果你想更底层去修改数据,建议走NDIS。
2014-8-16 22:28
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
拦截数据已经实现了..现在困在修改数据了...都找了几天百度了,,依然没找到解决问题的方法..都有点想放弃了..哎..如果能找资料解决的话,也不想去麻烦别人,浪费别人的时间
2014-8-16 22:37
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
WPE都是走ws2_32.dll的,TDI层修改数据,天生不足,倒不是说就绝对不可以改,反正我感觉问题太多,从这一层走。如果一定要在底层改数据,NDIS或直接做自己的万能网卡驱动,比较实际。不管是哪一种方案,TDI,NDIS,DDM驱动都需要过硬的TCP/IP知识,这是基础噢,所以我建议你去看1-6卷的那些基础资料,看完以后,你自然会明白这些原理。原比我在这跟你凭空讲要来的快,毕竟那些东西都是成体系的。
2014-8-16 22:43
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
好的,谢谢您...
2014-8-16 22:48
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
感谢您的提醒,虽然你的提醒不对,但还是感谢您...
要修改的不是新的大小,而是旧的大小才能欺骗得了上层的检测...

IoStatusBlock->Information 把这个值修改成原数据大小就OK了!!

哈哈终于解决了!
2014-8-16 23:59
0
雪    币: 19
活跃值: (1111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
对的 我都搞乱了 是旧的大小。。
以后我HOOK SEND的时候就这样 是我调过来说了
2014-8-17 01:37
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
哥,那Hook recv 又是怎么填写呢?
2014-8-17 20:34
0
游客
登录 | 注册 方可回帖
返回