重大难题请求救命--关于IP封包的重装回原来的用户数据问题。 (200分)

BHO: Browser Helper Object

可以到http://www.intelligo.net/iedelphi/看看,里面有详细的用法和说明,完全可以做
到监控截获你要的东东。
BHO本身是IE的一个技术,用于开发IE外挂功能,几乎可以做到你想做的一切,只要你能
想到。另外,MSDN也有详细说明和例程。
 
难啊,严重关注
 
呵呵程云啊
用DDK编程
至于驱动,
我明天或晚上把网址给你!
 
呵呵,我已搞定了,可直接从端口得到HTTP包
 
不就是网络监听加过滤吗?
 
问一下,BHO既然能做到截获某一个浏览IE窗口所发送的HTTP请求字串,
那么它能不能做到在发送出去前修改这个字串呢?
 
to Passion:
是呀,就这么简单,你可有好办法吗?
我只能作到监听,还不能过滤,
因为过滤用到中间转接,

而我只是分流一点而已,没能影响到本来的数据流的传递。
 
你们老板是不是想复杂了? 客户端保存数据干什么? 需要的时候从服务器调一下不就行了?
 
我也认为不需要在客户端保存。用户填写过的数据在服务器上都有,
必要时到服务器上去取。
你现在的做法不符合数据的安全逻辑,有可能安全性高的数据被一个低权限的用户得到。
 
[blue]
[h3]使用 IE 嵌入,比较容易一些[/h3]​
[/blue]
 
老大,你不是解决了问题吗?
赶快把答案贴出来啊,热切期待!
 
笨蛋!哪有那么麻烦。
自己开个TCP口到80,然后在IE里把代理服务器指向它就行了。[:(!]
 
做一个IE插件就行了,专捕获IE提交数据时的数据
然后分析有没有表单数据
 
to 一个过客:
嗨!你没有看我前面的问题吗,我们不能动任何服务端的东西,
只能在客户端作点手脚。

to 悲酥清风:
场下已讨论过来,这是在特殊条件下要作的事,是很有必要保存的。

to luckey and bkbk:
不能嵌入,更不能使用代理,这是要求,不能让用户有任何不相同的感觉。

to wukw:
我的问题是解决了,但只是解决一个简单的截获问题,
还有很多东西有待解决。
还要继续讨论,
今天事多我明天再继续这个问题吧。

to payer:
你的这个想法我感兴趣,具体怎么作呢?
只要别把IE给嵌入到程序中就成,
用户还是使用IE上网,而我去截获IE的动作。
 
监听能做到,从中分析出合适的东西保存在客户端也做得到。
但要截获用户的某些请求让它不发出去就不是监听能做到的了。
 
现在有个问题,我截获是能得到了,是用Socket来作到的,
但得到的是每一个小包,这样,数据量大的当然一定会分成很多小包,
而我想得到完整的包,就需要知道那个包是开始,那个包是结束。
这点很麻烦。

见下面的截获程序。

function TCYCap_ip.DecodeIpPack(ip:string;buf:pchar;iBufSize:integer):integer;
var
SourcePort,DestPort: word;
iProtocol, iTTL : integer;
szProtocol: array[0..MAX_PROTO_TEXT_LEN] of char;
szSourceIP: array[0..MAX_ADDR_LEN] of char;
szDestIP : array[0..MAX_ADDR_LEN] of char;

pIpheader : IP_HEADER;
pTcpHeader : TCP_HEADER;
pUdpHeader : UDP_HEADER;
pIcmpHeader: ICMP_HEADER;
saSource, saDest : TSockAddrIn;
iIphLen,data_size: integer;
TcpHeaderLen: integer;
TcpData : pchar;
begin
result := 0;
CopyMemory(@pIpheader,buf,sizeof(pIpheader));
//协议甄别
iProtocol := pIpheader.proto;
StrLCopy(szProtocol, pchar(CheckProtocol(iProtocol)),15);

//源地址
saSource.sin_addr.s_addr := pIpheader.sourceIP;
strlcopy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN);
//目的地址
saDest.sin_addr.s_addr := pIpheader.destIP;
strLcopy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN);
iTTL := pIpheader.ttl;
//计算IP首部的长度
iIphLen := sizeof(pIpheader);
//根据协议类型分别调用相应的函数
case iProtocol of
IPPROTO_TCP :begin
CopyMemory(@pTcpHeader,buf+iIphLen,sizeof(pTcpHeader));
SourcePort := ntohs(pTcpHeader.TCP_Sport);//源端口
DestPort := ntohs(pTcpHeader.TCP_Dport); //目的端口
TcpData := buf + iIphLen + sizeof(pTcpHeader);
data_size := iBufSize - iIphLen - sizeof(pTcpHeader);
end;
end;

if Assigned(FOnCap) then
FOnCap(ip, szProtocol, szSourceIP, szDestIP, inttostr(SourcePort), inttostr(DestPort),
buf, iBufSize-data_size, TcpData, data_size);
end;

 
的确,接收到的是原始IP包,需要自己分析IP包内的分片号。记得有个软件 Effeltech HTTP
Sniffer能完成这个功能,……不过没源码的,^-^
 
上面的方法只对win2000的版本好使。
98下得用vxd技术:)好运
 
to Passion:
我也知道那个软件,可还是不清楚他是怎么作到的

to tank37:
上面的程序是使用了Socket,我想在98上应没有太大的问题吧。
只是不知怎么判断一系列的包中那个是开始包,那个是结束包。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
959
SUNSTONE的Delphi笔记
S
顶部