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

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

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


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

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (25)
雪    币: 19
活跃值: (1086)
能力值: ( 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: www.baidu.com
下面的略了..
然后我修改成
GET /s?wd=aa HTTP/1.1
Host: www.baidu.com
再发出去.那浏览器返回错误的提示
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
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
发送的时候 在TCP/IP层才有效验的 这个基本属于AFD层吧 好像没有效验和
2014-8-16 19:36
0
雪    币: 19
活跃值: (1086)
能力值: ( 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
http://www.baidu.com/s?wd=tcp%20ip%E5%8D%8F%E8%AE%AE%E8%AF%A6%E8%A7%A3&rsv_bp=1&tn=baidu&rsv_spt=3&ie=utf-8&rsv_sug3=5&rsv_sug4=101&rsv_sug1=5&oq=tcp%20ip%E5%8D%8F%E8%AE%AE%20%E5%8D%B7&rsv_sug2=0&f=8&inputT=6848&bs=tcp%20ip%E5%8D%8F%E8%AE%AE%E5%8D%B7%E4%B8%80
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
活跃值: (1086)
能力值: ( 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
活跃值: (1086)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回
//