密界寻踪:找回丢失的邮件密码
■江苏 冯徐波
随着计算机技术的发展,网络已成为生活中不可或缺的工具,随之而来的各种密码也让人头痛不已,如果你的邮箱密码忘记了应该怎么办呢?在局域网中由于采用了广播方式,因此,在某个广播域中监听所有的信息包成为了可能。今年第2期中浙江俞伟明朋友介绍了伪装成POP3服务器的方法,的确另辟蹊径,但是本文单刀直入,将介绍通过监听网络的信息包直接分析出用户的电子邮件账户、密码,以此来找回丢失的密码。
如果您想先睹为快,可以直接下载编译好的密码找回程序,地址是:http://www.cfan.com.cn/11program/200507/mailpass.zip。
1.程序原理
对于目前很流行的以太网协议,其工作方式是:将要发送的数据包发往连接在一起的所有主机,包中包含着应该接收数据包主机的正确地址,只有与数据包中目标地址一致的那台主机才能接收。但是,当主机工作在监听模式下,只要数据包经过自已,无论数据包中的目标地址是什么,主机都将接收。
现在网络中使用的大部分协议都是很早设计的,许多协议的实现都是基于一种非常友好的、通信的双方充分信任的基础之上,许多信息以明文发送。因此,如果用户的账户名和口令等信息也以明文的方式在网上传输,便能轻易地从监听到的信息中提取出需要的密码信息。
2.密码监听的实现
本文只讨论监听Outlook、Foxmail等邮件客户端软件工作时产生的密码。由于Outlook、Foxmail等采用POP3协议与邮件服务器进行连接,而POP3协议采用明文方式进行数据交换,因此只要能对监听的数据直接过滤即可以分析出邮件的用户名与密码。WMSocket方法是整个程序的关键,以下给出完整的代码:
procedure
TForm1.WMSocket(var Msg: TMessage);
const
BufSize =
65535;
var
Buf: array [0..BufSize] of Char;
IPHeader:
PIPv4_HDR; // IP头
IPHeaderLen: Byte; // IP头长度
TCPHeader:
PTCP_HDR; // TCP头
TCPHeaderLen: Byte; // TCP头长度
Data: PChar;
// 监听到的数据
Ret: Integer;
begin
ZeroMemory(@Buf,
BufSize);
// 用recv函数接收数据
Ret:=recv(s, Buf, BufSize,
0);
if Ret=SOCKET_ERROR then
begin
ShowMessage('recv failed with error
' IntToStr(WSAGetLastError));
Exit
end;
IPHeader:=PIPv4_HDR(@Buf[0]);
IPHeaderLen:=(IPHeader.VerLen and $F)*4;
TCPHeader:=PTCP_HDR(@Buf[IPHeaderLen]);
TCPHeaderLen:=(ntohs(TCPHeader.LenFlag) shr 12)*4;
Data:=@Buf[IPHeaderLen TCPHeaderLen]; // DATA中保存了监听到的数据
//
使用OUTLOOK或FOXMAIL,显示E-MAIL账号、密码
// 若该IP包中包含"USER",说明正在进行POP3用户握手验证,以下获取该用户名
if
pos('USER',Data)=1 then
begin
//
inet_ntoa为WINSOCK2内置函数,IPHeader.DestAddr为IP包中的源地址
listbox1.Items.Add
('局域网内接受邮件地址:' inet_ntoa(TInAddr(IPHeader.SrcAddr)));
//
IPHeader.SrcAddr为IP包中的目标地址
listbox1.Items.Add('邮件服务器地址:' inet_ntoa(TInAddr(IPHeader.DestAddr)));
listbox1.Items.Add ('账号:' copy(Data,6,length(Data)-4));
end;
// 若该IP包中包含"PASS",说明正在进行密码验证,以下获取该密码
if pos('PASS',Data)=1
then
begin
listbox1.Items.Add('密码:' copy(Data,6,length(Data)-4));
listbox1.Items.Add ('---------------');
end;
end;
程序中用到的Winsock2单元文件可以在ftp://delphi-jedi.org/api/Winsock2.zip下载,完整的文章和源代码可以在http://www.cfan.com.cn/11program/200507/ltjgyy.htm找到。
在上面的密码监听程序的基础上稍加修改,比如增加对Data变量的过滤条件,可以使你的监听范围更大,监听到更多的内容,比如跟朋友QQ时,使用inet_ntoa(TInAddr(IPHeader.SrcAddr
))、inet_ntoa(TInAddr(IPHeader.DestAddr))即可以获取好友的IP地址;又比如网游截包分析制作游戏外挂等等,都是一样的。需要注意的是,如果要接收局域网中其他计算机的信息,该程序必须在HUB环境中运行或者在网关服务器上运行。若有其他问题,请与我联系,我的电子邮件地址是:fxb2000@bentium.net。
以上程序在Windows
XP、Delphi 7中调试通过。