首页
社区
课程
招聘
[旧帖] [求助]基于SPI的WSPRecv能否重组和修改网络封包? 0.00雪花
发表于: 2015-6-17 07:42 1719

[旧帖] [求助]基于SPI的WSPRecv能否重组和修改网络封包? 0.00雪花

2015-6-17 07:42
1719
假设打开百度网页,WSPRecv收到网页文本内容分多个包返回(每个包可能是1024或8192字节),
收到完整包后gzip解码,然后修改明文数据,重新gzip编码,继续传给浏览器。

这样能否实现呢?

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 1392
活跃值: (4867)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
2
如果是非HTTPS 应该是可以的,但是网页比较大的话你完整解压出来,修改打包在发送也许会影响网页浏览效果。
尝试在发送GET的时候accept-encoding 删除gzip让他直接给你明文的网页。不用gzip打包可能更有效。
2015-6-17 08:46
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
Get请求包中,把gzip编码去掉,直接修改明文,应该没什么问题。
如果不去掉gzip编码,不知道能否修改网页内容?

假设打开一个网页,分8次返回8192字节的数据,每次返回1024字节。
浏览器每调用一次recv函数,就执行一次WSPRecv函数,
recv函数指定一个buf和buflen,buflen指定1024字节(分8次调用recv函数);

int WSPAPI WSPRecv(......)
{
int iRet = NextProcTable.lpWSPRecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags,lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno);
lpBuffers返回负载数据
lpNumberOfBytesRecvd返回已成功接收的负载长度
}

如果在收到第一个200 OK消息后,WSPRecv函数不返回,在循环调用7次NextProcTable.lpWSPRecv,收到完整gzip包,
gzip解码,修改明文,重新编码后,分8次向lpBuffers拷贝修改后的gzip数据(修改后gzip数据总长度不超过8192字节)。

不知道这样是否可行?
2015-6-17 09:42
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
===================

解析出https包,如果不走代理转发模式,估计是不可能解析出来的。
基于本地浏览器代理转发模式的Fiddler(官网有C#语言源码和开发包),是可以实时解析https报文。
2015-6-17 09:46
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
调用NextProcTable.lpWSPRecv后接收缓冲区lpBuffers才被填充内容,在此之前lpBuffers->buf中不是有效的内容。

若要对接收包追加数据可能不行,因为接收缓冲区的大小位置是由应用程序(IE)提供的。
WSPRecv是由IE的recv函数调用的,它只会读取它设定的大小。

int WSPAPI WSPRecv(......)
{
  int iRet = NextProcTable.lpWSPRecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags,lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno);
  lpBuffers返回负载数据
  lpNumberOfBytesRecvd返回已成功接收的负载长度

  收到200 OK的包后,该函数不返回,继续循环调用7次NextProcTable.lpWSPRecv,收到完整的包后,至多返回1024字节数据(IE的recv函数中指定的大小)
  
  后面再进入WSPRecv,执行NextProcTable.lpWSPRecv函数,负载数据就收不到了,因为前面在一次调用WSPRecv后,强制调用了7次NextProcTable.lpWSPRecv。
}
2015-6-17 11:29
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
调用NextProcTable.lpWSPRecv后接收缓冲区lpBuffers才被填充内容,在此之前lpBuffers->buf中不是有效的内容。

若要对接收包追加数据可能不行,因为接收缓冲区的大小位置是由应用程序(IE)提供的。
WSPRecv是由IE的recv函数调用的,它只会读取它设定的大小。

////////////////////////////////////////////////////////////////////////////////////////////
//收到第一个200 OK包后,循环调用NextProcTable.lpWSPRecv,收到完整包后WSPRecv函数才返回
int WSPAPI WSPRecv(......)
{
  int iRet = NextProcTable.lpWSPRecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags,lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno);

  假设本地IE在5060端口,分8次收到8192字节数据,每次接收1024字节(recv中指定buf和buflen)
  收到200 OK包后,继续循环调用NextProcTable.lpWSPRecv,接收其他8192-1024=7168字节数据,才让WSPRecv函数返回。
  收到完整包后,后面再进入WSPRecv没有本地端口是5060的Socket。

  不能把接收的所有完整包,一次都返回给IE,因为返回的数据包长度不能超过recv指定的长度。
}
////////////////////////////////////////////////////////////////////////////////////////////
//收到第一个200 OK包开始,到收到完整包结束,都返回SOCKET_ERROR
int WSPAPI WSPRecv(......)
{
  int iRet = NextProcTable.lpWSPRecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags,lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno);

  假设本地IE在5060端口,分8次收到8192字节数据,每次接收1024字节(recv中指定buf和buflen)
  收到200 OK包后,修改读取的数据长度和错误码,并且返回SOCKET_ERROR
  *lpNumberOfBytesRecvd = 0;
  *lpErrno = WSA_IO_PENDING;
  收到完整包后,后面再进入WSPRecv没有本地端口是5060的Socket。

  不能把接收的所有完整包,一次都返回给IE,因为返回的数据包长度不能超过recv指定的长度。   
}
////////////////////////////////////////////////////////////////////////////////////////////
2015-6-18 10:52
0
游客
登录 | 注册 方可回帖
返回
//