外网获取局域网内的**机的mac地址(200分)

  • 主题发起人 主题发起人 syx_hxw
  • 开始时间 开始时间
S

syx_hxw

Unregistered / Unconfirmed
GUEST, unregistred user!
在外网能否获取到通过路由上网的局域网内的计算机的mac地址
 
我知道很难,但有好多的朋友不是说可以入侵内网,不能用假ip包吗
 
经常有人问我这个问题“怎样进入内网”,怎么回答呢,归纳起来就是一句话“突破网关,利用端口重定向进入内网”。首选要突破网关(GetWay),这很容易理解.因为一个内网要访问internet总是必然通过网关接入的,至于怎样突破网关,这和进入不是网关的服务器没有什么两样,就不说了。
突破网关以后,我们的目标就是通过网关上网的192.168.21.75。以后的方法就是在网关力端口重定向,建立包转发。端口重定向分两种(local和remote),但是我们要进而内网,显然不能用local方式的重定向,local方式的重定向主要用来绕过防火墙(关于这个问题我将在随后单独写一篇文章来讨论怎样用端口重定向绕过防火墙)。

一、利用Fpipe建立端口重定向。
Fpipe是个非常有趣的东东。为了证明Fpipe的端口重定向功能,我们来做这样的试验.首先在自己的机器上运行Fpipe,如下:

E:/tool/FPip>fpipe -l 80 -s 90 -r 80 202.98.177.162
FPipe v2.1 - TCP/UDP port redirector.
Copyright 2000 © by Foundstone, Inc.
http://www.foundstone.com

//解释一下这个命令
fpipe -l 80 -s 90 -r 80 202.98.177.162
将到本机80端口的连接通过90端口连接到202.98.177.162的80端口。一下是详细语法:
FPipe [-hv?] [-brs <port>] IP
-?/-h - shows this help text
-c - maximum number of allowed simultaneous connections. Default is 32 #连接的最大数目,默认是32
-l - listening port number #要监听的TCP端口号
-r - remote TCP port number #要定向到的IP主机的端口号
-s - outbound connection source port number #从哪个端口发出重定向信息
-v - verbose mode #详细显示过程

在上面的过程中,我们在自己的机器上建立了端口重定向:将到本机80端口的连接通过90端口连接到202.98.177.162的80端口
然后我们在浏览器中输入:http://127.0.0.1,结果发现昆明高新区的网页打了,这说明我们的重定向成功。
此时fpipe现实了如下的内容:
Pipe connected:
In: 127.0.0.1:2092 --> 127.0.0.1:80
Out: 192.168.168.112:90 --> 202.98.177.162:80

从上面的输出可以看出数据包经过的路径(192.168.168.112是我的IP)
好了成功以后,下面的东西我不说大家也知道了,将Fpipe拷贝到我们控制的网关上,执行重定向:
fpipe -l 81 -s 91 -r 21 192.168.21.75 #在网关(202.98.*.*)执行,将到202.98.*.*的81端口的数据通过91端口转发向192.168.21.75的21端口。同样的:
fpipe -l 82 -s 92 -r 23 192.168.21.75 #将到202.98.*.*的82端口的数据通过92端口转发向192.168.21.75的23端口
fpipe -l 83 -s 93 -r 80 192.168.21.75 #将到202.98.*.*的83端口的数据通过93端口转发向192.168.21.75的80端口
fpipe -l 84 -s 94 -r 139 192.168.21.75 #将到202.98.*.*的84端口的数据通过94端口转发向192.168.21.75的139端口

下面的你更应该知道了:
如果你在本机telnet到202.98.*.*的81就等价于你telnet到192.168.21.75的21,不对啊!192.168.21.75的21应该FTP上去才对啊(哈哈),那就到ftp202.98.*.*的81端口吧!

写到这里我也忍不住喊“真牛…………真牛…………”

二、利用rinetd建立重定向。
方法和上面一样。在网关上运行rineted,不过要建立个配置文件(文件名和扩展名随意了在这里我以配置文件为conf.ini做例子说)
在本地用计事本建立如下内容的配置文件(其中的*不方便说,别找这写哦!他的意思是将到202.98.*.* 的90的包转发到192.168.21.75的80)
202.98.*.* 90 192.168.21.75 80
将他存为conf.ini文件然后和rineted拷贝到那个网关上(202.98.*.* ),然后在网关上执行 rinetd -c conf.ini然后你连接到202.98.*.* 90和连接到192.168-.21.75 80的效果是一样的。

顺便说说rinetd配置文件的语法为
bindaddress bindport connectaddress connectport


写在后面:
Fpipe和rineted是很牛的两个工具,通常我是用这两个工具来突破防火墙的,以后抽空说说这个问题。什么什么,这两个小东西在那下载(别懒了,自己找吧):
http://www.boutell.com/rinetd/
http://www.foundstone.com
去看看吧!
倒,打了这么多字,手酸死了!哈哈!88。
 
weiliu兄:
你说的好象不够清楚,怎样连到局域网内的机啊,
 
问题: 如何用DELPHI通过IP地址或计算机名取网络的MAC地址. ( 积分: 50 )
分类: Internet/TCPIP

来自: headof, 时间: 2005-04-22 13:21:00, ID: 3053658
如何用DELPHI通过IP地址或计算机名取网络的MAC地址
不一定时本机。

来自: ztaif, 时间: 2005-04-22 15:01:08, ID: 3053807
C:/Documents and Settings/Administrator>nbtstat -A 192.168.0.230

本地连接:
Node IpAddress: [192.168.0.230] Scope Id: []

NetBIOS Remote Machine Name Table

Name Type Status
---------------------------------------------
BIT_ZHONG <00> UNIQUE Registered
WORKGROUP <00> GROUP Registered
BIT_ZHONG <20> UNIQUE Registered
WORKGROUP <1E> GROUP Registered
BIT_ZHONG <03> UNIQUE Registered

MAC Address = 4C-00-10-A2-14-D6


ADSL连接:
Node IpAddress: [192.168.0.231] Scope Id: []

NetBIOS Remote Machine Name Table

Name Type Status
---------------------------------------------
BIT_ZHONG <00> UNIQUE Registered
WORKGROUP <00> GROUP Registered
BIT_ZHONG <20> UNIQUE Registered
WORKGROUP <1E> GROUP Registered
BIT_ZHONG <03> UNIQUE Registered

MAC Address = 4C-00-10-A2-14-D6

来自: ztaif, 时间: 2005-04-22 15:15:47, ID: 3053825
设置IP后调用GetMac方法,取结果代码放在OnReceive事件里。

unit GetMac;

interface

uses
Windows, Messages, SysUtils,Forms, Classes, WinSock, Dialogs;
const
WM_SOCK = WM_USER + $0001; //自定义windows消息
UDPPort = 6767; //设定本端UDP端口号
NBTPort = 137; //设定对端UDP端口号

var
MyByte: array [0..3]of byte;
WAIT_ACK_EVENT: Thandle;
MySock: TSocket;
MyAddr: TSockAddr;
FSockAddrIn : TSockAddrIn;

type
TGetMac = class(TComponent)
private
{ Private declarations }
FIP:string; //输入的欲取得MAC地址的机子的IP地址
FWorkGroup:string; //返回的工作组名称
FHostName:string; //返回的主机名
FUserName:string; //返回的用户名
FMacAddress:string; //返回的网卡Mac地址
FHandle: HWnd; //非可视构件消息处理使用
FOnReceive: TNotifyEvent;//接收到返回结果触发的事件

Binded: Boolean;

//对输入的IP地址进行合法性检查并赋给FIP变量
procedure SetFIP(Value: string);
//判断IP地址是否合法
Function IsLegalIP(IP:string):Boolean;
//将IP地址分成四部份
procedure GetAddrByte(IP:string;var B:array of byte);

protected
{ Protected declarations }
procedure ReceiveReturn; dynamic;
//利用消息实时获知UDP消息
procedure ReadData(var Msg: TMessage);//message WM_SOCK;
//分析返回的消息内容
procedure RecvNbMsg(buffer: Array of byte;len:integer;IP:string);
public
{ Public declarations }
procedure GetMac; //先对IP属性赋值后调用此方法取得相关资料
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

published
{ Published declarations }
property IP: string read FIP write SetFIP;
property WorkGroup: string read FWorkGroup;// write FWorkGroup;
property UserName: string read FUserName;// write FUserName;
property HostName: string read FHostName;// write FHostName;
property MacAddress: string read FMacAddress;// write FMacAddress;
property OnReceive: TNotifyEvent read FOnReceive write FOnReceive;
end;

procedure Register;

implementation

//接收到返回的数据后内部处理完毕执行用户定义的代码
procedure TGetMac.ReceiveReturn;
begin
if Assigned(FOnReceive) then FOnReceive(Self);
end;

//检测输入的IP地址是否合法并赋值给FIP变量
procedure TGetMac.SetFIP(Value: string);
begin
if (not IsLegalIP(Value)) then
begin
ShowMessage('非法IP地址!');
FIP:='127.0.0.1';
exit;
end
else
begin
GetAddrByte(Value,MyByte);
FIP:=format('%d.%d.%d.%d',[MyByte[0],MyByte[1],MyByte[2],MyByte[3]]);
end;

end;

//判断IP地址是否合法
Function TGetMac.IsLegalIP(IP:string):Boolean;
begin

if inet_addr(pchar(IP))=INADDR_NONE then
begin
Result:=False;
exit;
end
else result:=true;

end;

//将IP地址分成四部份
procedure TGetMac.GetAddrByte(IP:string;var B:array of byte);
var i,j:integer;
sTemp:string;
begin

sTemp:='';
j:=0;
IP:=IP+'.';
for i:=1 to length(IP)do
begin
if IP<>'.' then sTemp:=sTemp+IP
else
begin
B[j]:=byte(strtoint(sTemp));
inc(j);
sTemp:='';
end;
end;

end;

//开始取网卡地址
procedure TGetMac.GetMac;
//欲发送的数据包内容
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);
var
len: integer;
TempWSAData: TWSAData;
begin
if not Binded then begin
// 初始化SOCKET,0成功,使用WinSock1.1版本$0001是1.0版本$0002是2.0版本
if WSAStartup($0101, TempWSAData)<>ERROR_SUCCESS then
ShowMessage('启动错误');

MySock := Socket(AF_INET, SOCK_DGRAM, 0);
if (MySock = INVALID_SOCKET) then //Socket创建失败
begin
ShowMessage(inttostr(WSAGetLastError())+' Socket创建失败!');
CloseSocket(MySock);
end;
//本机SockAddr绑定
MyAddr.sin_family := AF_INET;
MyAddr.sin_addr.S_addr := INADDR_ANY;
MyAddr.sin_port := htons(UDPPORT);
if Bind(MySock, MyAddr, sizeof(MyAddr)) <> 0 then
begin
ShowMessage('绑定错误!');
Binded:=False;
end
else Binded:=True;

WSAAsyncSelect(MySock, FHandle, WM_SOCK, FD_READ);
WAIT_ACK_EVENT:=CreateEvent(nil,true,false,pchar('WAIT_ACK'));
//ResetEvent(WAIT_ACK_EVENT);}
end;

//向对方主机UDP指定的端口发送数据包
FSockAddrIn.SIn_Addr.S_addr := inet_addr(pchar(FIP));
FSockAddrIn.SIn_Family := AF_INET;
FSockAddrIn.SIn_Port := htons(NBTPORT);
len := SendTo(MySock, NbtstatPacket[0],50, 0, FSockAddrIn, sizeof(FSockAddrIn));
//if (WSAGetLastError() <> WSAEWOULDBLOCK) and (WSAGetLastError() <> 0) then showmessage(inttostr(WSAGetLastError()));
if len = SOCKET_ERROR then ShowMessage('SOCKET_ERROR,发送失败!');
if len <> 50 then ShowMessage('数据没有全部发送!');

// WaitForSingleObject(WAIT_ACK_EVENT,WaitTime);
ResetEvent(WAIT_ACK_EVENT);

end;

//接收返回的消息数据
procedure TGetMac.ReadData(var Msg:TMessage);
var
buffer: Array [1..500] of byte;
flen,len: integer;
Event: word;
IP:string;
begin
if Msg.msg<>WM_SOCK then exit;
flen:=sizeof(FSockAddrIn);
FSockAddrIn.SIn_Family := AF_INET;
FSockAddrIn.SIn_Port := htons(NBTPORT);
Event := WSAGetSelectEvent(Msg.LParam);
if Event = FD_READ then
begin
len := recvfrom(MySock, buffer, sizeof(buffer), 0, FSockAddrIn, flen);
if len> 0 then
begin

//FSockAddrIn.sin_addr.S_un_b.s_b1
with FSockAddrIn.sin_addr.S_un_b
do IP:=format('%d.%d.%d.%d',[ord(s_b1),ord(s_b2),ord(s_b3),ord(s_b4)]);

RecvNbMsg(buffer,len,IP);

end;
SetEvent(WAIT_ACK_EVENT);

end;
//触发事件,执行用户指定的代码
ReceiveReturn;
end;

//分析返回的消息
procedure TGetMac.RecvNbMsg(buffer: Array of byte;len:integer;IP:string);
var
TempStr:string;
i,j,pos,name_num: integer;
begin

name_num:=0;
for i:=1 to len do
begin
if((buffer=$21)and(buffer[i+1]=$00)and(buffer[i+2]=$01))
then
begin
name_num:=buffer[i+9];
break;
end;
end;

if name_num=0 then exit;
pos:=i+10;

TempStr:='';
for i:=pos to (pos+18*name_num-1) do
begin
if (((i-pos)mod 18) =0) then
begin
for j:=0 to 14 do
begin
if trim(char(buffer[i+j]))='' then buffer[i+j]:=ord(' ');
TempStr:=TempStr+char(buffer[i+j]);
end;

if (buffer[i+16] and $80)=$80 then
begin
if buffer[i+15]=$0 then FWorkGroup:=TempStr;
end
else
begin
if buffer[i+15]=$20 then FHostName:=TempStr
else
if buffer[i+15]=$3 then FUserName:=TempStr;

end;
TempStr:='';
end;
end;
//取得网卡地址
for i:=0 to 5 do
begin
TempStr:=TempStr+format('%.2x.',[buffer[i+pos+18*name_num]]);
end;
delete(TempStr,length(TempStr),1);
FMacAddress:=TempStr;

end;

//构件创建
constructor TGetMac.Create;
begin
inherited Create(AOwner);

FHandle := AllocateHWnd(ReadData);

//初始化属性值
FIP:='127.0.0.1';
FUserName:='';
FHostName:='';
FWorkGroup:='';
FMacAddress:='';
Binded:=False;
end;

//构件消毁
destructor TGetMac.Destroy;
begin
CloseSocket(MySock);
WSACleanup();
DeallocateHWnd(FHandle);
inherited Destroy;
end;

//登记控件
procedure Register;
begin
RegisterComponents('FastNet', [TGetMac]);
end;
end.

来自: headof, 时间: 2005-04-22 15:45:35, ID: 3053886
len := SendTo(MySock, NbtstatPacket[0],50,0,FSockAddrIn,sizeof(FSockAddrIn));
编译不过。
提示
[Error] GetMac.pas(170): Constant object cannot be passed as var parameter
[Fatal Error] Project1.dpr(5): Could not compile used unit 'G:/mac/new_mac_1533/GetMac.pas'
为什么?

来自: headof, 时间: 2005-04-26 8:33:41, ID: 3057190
多人接受答案了。

得分大富翁: ztaif-50,
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=596039
IP,工作组,用户名,机器名,MAC地址,据说还可以跨网段.
 
谢谢各位的热心回答,可能是我说的不够清楚,应该是外网的机器,怎样才能得到内网机器的mac地址,如通过路由猫上网的网内机器,不能上内网的机器发消息过来,而是外网的机器去连接他,我现在还有700分,可以全部奉上。但我希望大家能来解决这个问题,
 
涓嶅湪鍐呯綉鐨勭數鑴戜笂鍋氭墜鑴氾紝鏄?病鍙?兘鐨
 
你要内网的mac地址做什么啊?外网的机器的机器去连接他,与MAC无关啊?
 
楼主的基本功太差了吧,对网络原理基本就是一窍不通。

你的问题就问错了,补充的目的描述也是表述不清,想帮你都帮不了。

这样基础的问题,有问问题的功夫不如去看看书,收获会更大些。

希望提问的人所提出的问题能够更有质量些,这样回答的人才能给出有水平的答案。
 
to沙隆巴斯的主人
也许是没有说清楚:现在我提出的问题解说如下:
外网的机器怎样才能获得通过路由猫上网的内网机器的mac地址,内网的机器不发送请求给外网的机器,而是让外网的机器通过某种途径去获得。
 
把楼主的问题抽象一下:
有A网与B网,它们仅通过一个双端口的3层路由器连接,现在A网内的主机想获得B网内的主机的MAC。
在正常情况下,它们的通讯是通过路由器的ARP代理完成的。也就是三层通讯,你没必要理二层的实现。一般来说,外网主机知道内网主机的MAC对通讯来说是没有任何意义的。
请楼主进一步解释下你的目的。
 
谁能实现,要money也行,请和我联系,
我的QQ59754138
 
如果对方的电脑是 LINUX操作系统呢??好像用那段程序是得不到MAC地址的吧!!
 
to flfqzrj兄
LINUX操作系统可以先不管
 
据我所知,可以从IP包四到七层的数据中中分析出来
 
在路由器上是看不到mac地址的
 
创意、自由、灵活,超强的报表功能,
独特的双数据源连接,全功能的表格组件!

http://www.anylib.com
 

Similar threads

回复
0
查看
848
不得闲
回复
0
查看
978
不得闲
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部