首页
社区
课程
招聘
[求助]RING3数据包监视-(如何修改TCP包?)-请求WEB访问!
发表于: 2009-11-4 23:20 14314

[求助]RING3数据包监视-(如何修改TCP包?)-请求WEB访问!

2009-11-4 23:20
14314
  
  我想请教一下关于本站《原创】另类挂钩-RING3数据包监视》(地址:http://bbs.pediy.com/showthread.php?t=81204)一贴,相关问题!

  我想在该贴提供的代码基础上、实现将接收到的TCP包作相应的URL替换,请问能实现吗?

  有人把代码翻译成delphi版了,但我多次跟程序师进行交流和沟通都谈到缓冲区的内容替换过后、导致TCP包将无法正常请求,需要对包进行重新构造!

  请大家给于一定思路!谢谢

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (23)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
直接替换是不行的,因为你连接到的HOST不是那个,那个HOST上根本没这个URL。可以在CONNECT时重定位到本地代理服务器,然后做数据修改,或者直接修改返回数据
2009-11-4 23:40
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
qihoocom  、谢谢你!
2009-11-5 13:33
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
qihoocom(请诊断)

      AFD_SEND:

        if ( LookupSendPacket(Buffer, Len) ) then
        begin

          OutputDebugString(PChar(Format('[HTTP Send] Length = %d', [Len])));
          OutputDebugString(PChar(Format('%s', [StrPas(Buffer)])));

             //以下实现将域名url1替换为域名url2

          s := strpas(pchar(buffer));
          s := stringreplace(s, 'url1', 'url2', [rfReplaceAll]);

          Buffer := pchar(s) ;        //将替换之后的字符串在次传回到缓冲区!       

            showmessage(Buffer);                  //通过delphi的showmessage打印出来的结果,字符串的替换是成功的!

        end;
2009-11-5 14:02
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
5
这是不行的,我2楼已经说得很清楚了
2009-11-5 14:04
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
qihoocom

  Thanks~
2009-11-5 14:17
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
网友XX提供回答:
《我觉得不但是ip地址和端口需要改动,整个tcp传输的全部内容都是要改动的,包括校验》

我对网友XX提问:
如果按qihoocom所讲:“可以在CONNECT时重定位到本地代理服务器,然后做数据修改,或者直接修改返回数据”、这样做也需要改动整个包吗?”

网友XX提供回答:
《这个应该是不需要的,但事件一旦触发,重新定向是否能够满足要求,这个很难说》

qihoocom,请你出马!
2009-11-5 14:21
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
8
本地代理访问大法很好的
2009-11-5 18:12
0
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=西南;707997]
s := strpas(pchar(buffer));
s := stringreplace(s, 'http://url1', 'http://url2', [rfReplaceAll]);
[/QUOTE]

看你这样替换url估计你没仔细看过HTTP的请求包格式,里面不会出现 http:// 这样字符的。
HTTP的,比如你请求的是 http://bbs.pediy.com/forumdisplay.php?f=41,则会被封装成:
GET /forumdisplay.php?f=41 HTTP/1.1
...
Host: bbs.pediy.com 
...

所以你的Replace根本没替换到URL。另外这样的写法也有点问题,s你定义的是String类型吧,而Buffer是个指针,Buffer := pchar(s); 只是把Buffer又指向你自己的字符串s,而并没有修改数据包的内容。

二楼MJ也说了,你要实现更换Host(从一个网站跳到另一个网站),是不能在这个地方实现的。无论你怎么修改"Host: ..."后的域名,数据包依然按照IP头部中的目的地址发出去,除非你自己重新组装TCP包。
这种方式截获数据包,只能做成防火墙式的被动数据包丢弃和修改...
2009-11-5 23:11
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
10
重定向其实改包是可以实现的,那就是修改返回包(处理RECV),然后将返回填为HTTP 302,重定向到指定URL,不过这么做有一些问题,例如客户端不认HTTP302,就不行,或者是返回BUFFER过短,就填不完重定位的数据,不过还算简单方案了。
2009-11-6 00:02
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
understand~~

    先了解HTTP......
2009-11-6 13:08
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
  有没解决方案~~~ 供大家学习
2009-11-6 13:14
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
如果直接修改返回的buffer可行的话,那么把指定内容(网页代码),修改成一句转向代码(也就是网页脚本代码),要是成功的话,效果应该是:访问某个网站时,浏览器只下载到我们的转向代码,然后就转到我们的目标上去了,不过要处理好,别把自己的目标也hook了
2009-11-6 21:02
0
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
14
使用 HTTP 301/302 进行重定向,实际是很难操作的。因为服务器的回应信息中没有主机的标识信息,需要通过发送者的IP地址判断是哪个服务器发过来的数据。如果对所有的HTTP 200 OK都使用 HTTP 301重定向,自己网站的回应数据也会被修改到,最终结果就是浏览器卡在页面读取那死循环了。并且确实有些浏览器为了防止HTTP301/302 网址劫持,忽略了这种跳转请求。
这个方法用于恶作剧倒是不错,测试可以将浏览器的所有访问全部重定向到baidu.com

要是不跨站只修改请求的地址或页面参数,倒是可以做到。例如 /forumdisplay.php?f=41 改 /forumdisplay.php?f=3
2009-11-6 21:37
0
雪    币: 119
活跃值: (298)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
修改数据包还是hook winsock或者winspi(spi hook也不用注册dll)! 别复杂化了 mj只是提供一种思路
2009-11-6 21:48
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
  我要实现的业务逻辑很简单~~~ 用bho和mimefilter确实容易、只不过只能在IE下使用~所以想到了ring3
2009-11-7 11:35
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我从BUFFER中取回的数据、好像只是一个HTTP请求!没有具体的网页内容~
2009-11-7 11:37
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
18
具体到我此前说的这个技术,可以记录device io control 的 file handle(即SOCKET HANDLE)来实现识别返回数据包,并进行篡改。
2009-11-7 12:06
0
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
19
嗯,根据Handle判断可能是个好方法,根据句柄把请求和回应给对应起来。之前看漏了,看来还需要重新把帖子研究下


修改HTTP请求就能满足你要修改URL参数的目的,你要是还想处理页面内容就需要把服务器发回来的信息一个个连接起来。具体网页内容是跟在 HTTP/1.1 200 OK 后面的,替换掉 Connection: 关键字往后的 \0 字符就可以用OutputDebugString来输出。
普通的页面你可以用这种方式看到页面源码,不过目前比较流行使用gzip压缩数据流,所以可能得到的不是可见字符(比如典型的百度和Google都用了这个技术)。你要是在回应的数据里看到 Content-Encoding: gzip,就表示在数据包后面的数据使用了gzip压缩,需要自己解压缩。
2009-11-7 14:57
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
  SessionList.Add or SessionList.Delete ?
2009-11-7 15:27
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
  使用(Handle)、与 我们讨论的、在同一个HOST下修改GET且保证HTTP头长度一致!有什么区别,使用了(Handle)是不是就无需修改GET的值及无需重新构建数据长度了?

  谢谢~
2009-11-7 15:30
0
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
22
两码事。利用Socket Handle只是方便识别收到的数据,还需配合HTTP 301/302重定向。之前说过了,重定向的优势在于可以跨站(跳到别的Host也可以实现),并且一般服务器返回的数据会比较多,足够你构建重定向报文。不过一旦遇到不吃重定向的浏览器,这个方法就行不通了。
而直接修改GET的参数虽然不能换Host,不过比较稳妥,毕竟请求还没发出去就被改掉了,唯一的缺点是要考虑插入字符串后长度超过原先数据包的问题。
2009-11-7 23:24
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
  有不吃301、302的浏览器吗?没有吧!

  另外:你谈到、在修改GET值的时候《缺点是要考虑插入字符串后长度超过原先数据包的问题。 》  1、只要保证修改过后的长度小于修改之前就可以了吗? 还是 2、修改前与修改后的长度要保证一致?

  还有:如果我修改过的GET数据、一定要超过修改前的长度时(是否可以重新效验一次TCP包即可?还是一但发生了数据长度大于修改前的长度,就无法实现了?)

  THANKS~
2009-11-8 00:21
0
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
24
IE核的浏览器都会支持重定向,不过有些浏览器为了防止重定向式的页面劫持,屏蔽了 HTTP 302。
写了个重定向的例子,应该满足你的要求了,自己去看吧:http://bbs.pediy.com/showthread.php?t=100847
2009-11-8 00:45
0
游客
登录 | 注册 方可回帖
返回
//