关于用NetXray提取TCP/IP包中数据和用ClientSocket模拟发出同样的包!-有经验者请进!参与者有分! (200分)

C

ChenBoy

Unregistered / Unconfirmed
GUEST, unregistred user!
  本来我对Socket和TCP/IP结构不太熟悉,但最近遇到这样一个问题,似乎不得不用这种
方法去编程了。
  是这样的,我们局域网中有多台客户机和一台服务器(Window NT),我想模拟一下
客户进程,问题是我没有客户进程与服务进程进行联络的源码。只有通过NetXray对来往于
客户机与服务器之间的包进行捕获,再分析其结构,然后再通过ClientSocket组件给服务器
进程发同样包或对服务器发来的包进行同样的响应。
  想法应当说是没有太大的错误,但将从NetXray中抽取TCP的Data部分用ClientSocket的
SendBuf()命令发出去,再用NetXray捕获,NetXray则报告有错误,不能捕获!
  这里是从客户进程捕获的TCP包的Data部分,如下:
0000:$00,$00,$00,$00,$00,$00,$00,$00,$00,$3c,$f8,$00,$00,$00,$00,$00
0010:$00,$00,$00,$00,$00,$00,$00,$00,$01,$ff,$01,$00,$04,$03,$00,$00
0020:$00,$4b,$00,$ed,$e4,$af,$c0,$c0,$00,$65,$72,$69,$66,$00,$ac,$00
0030:$e1,$ba,$cf,$d8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
0040:$4d,$58,$32,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
0050:$00,$00,$00,$00
 TCP包的Code为ACK.PSH。通过上面可以取得两个数据,即地址0030H~0033H为字符
“岷县”,地址0040H~0042H为字符“MX2”,这些都正是客户进程所发给服务器进程的。
如果我要把这个包原原本本的发到服务器进程。不知道NetXray所捕获的这个TCP包的
Data中是否还包含其他不能在ClientSocket中用SendBuf()原原本本发送的字节。
  服务进程与客户进程都是用C编的!请高手们多多指点!谢谢!
 
请大家帮忙UP一下!
 
肯定是可以做到的。

>“是否还包含其他不能在ClientSocket中用SendBuf()原原本本发送的字节”
应该没有
 
  经过一个下午对书本与NetXray的捕获结果对比,认清了包结构,地址$0000~$0029应
当是可选项+补丁,后面,$0030~$0053才是真正的数据,这里面可能还有补丁,如好多$00,
不知道这个发送的这个是不是仅仅是个字符串,用的是否是SendText()命令。我再试试,
继续等待高手的出现!!
 
你的问题是什么?
 
TO zw84611:
 我想找到客户进程真正所要发送的数据,得用编程的方法该如何发送!
 
如果你用的是Win2k,可以用这个Sniffer:
http://www.playicq.com/dispdoc.php?t=27&id=1659
Delphi写的,还带源码,支持过滤和16进制显示。
它得到的是TCP/UDP包中的纯数据。

至于如何发送,你可以看一下这个程序的源码:
http://www.playicq.com/dispdoc.php?t=27&id=433
这个程序实际上就是先用Sniffer得到运行网络命令nbtstat时发送的数据,然后在程序中
发送同样的数据,从而实现nbtstat的功能。其实很简单,我举个例子:

const NbtstatPacket:array[0..49]of byte
=($0,$0,$0,$0,$0,$1,
$0,$0,$0,$0,$0,$0,$20,$43,$4b,
$41,$41,$41,$41,$41,$41,$41,$41,
$41,$41,$41,$41,$41,$41,$41,$41,
$41,$41,$41,$41,$41,$41,$41,$41,
$41,$41,$41,$41,$41,$41,$0,$0,$21,$0,$1);
begin

with frmmain do
begin
...
senddata(NbtstatPacket,IP);
end;

end;

关键是要当作字节流而不是字符串发送,因为#0是字符串的默认结束符,所以如果当作字符串,$00就无法发送。
 
zw84611:
  谢谢!!
 
接受答案了.
 
顶部