临时制作的JavaScript TCP扫描器

来源:互联网 发布:怎么样恢复u盘数据 编辑:程序博客网 时间:2024/04/27 20:09
临时制作的JavaScript TCP扫描器
作者:全金属外壳
事情起因与我在学校PC教室测试我的后门。当我把俺的后门用无敌WinRAR捆绑机和几个秘传小游戏绑到一块放到共享目录后,突然发现忘了带扫描器啦(学校的PC室上课时是断网的,而我在后门配置时让后门监听1122端口,非反向连接!)。没有扫描器,如何得知广大同学们孰为俺的后门测试光荣奉献了自己的。。。机器?呜呼。不知如何是好。
偶见旁边的MM在用写字板打字玩,灵机一动,计上心头。于是就有了本扫描器的诞生,可惜是单线程的,慢了点.
测试环境:windows 2000
使用工具:写字板,Cscript.exe
使用组件:Mswinsock
我先看看机器上有没有对winsock控件注册先。
    Var socket =new ActiveXObject(“MSWinsock.winsock”);
    Socket.Aboutbox();
保存上面的代码为“Test.js”,在命令行输入cscript test.js出现winsock的关于对话框:
(图一)
这个图是我回家补抓的。说明winsock是可用的,这就好办了。
    现在开始正式脚本版端口扫描器编写工作,我使用的是javascript,喜欢它的函数风格(和冰狐大哥套近乎,呵呵)。首先要想想扫描器的工作流程,我用伪代码描述如下:
main()
{
    初始化
    while(还有IP没被扫)
    {
    for(i=开始端口;i<=结束端口;i++)
    {
    If (端口开放)
        显示:i号端口开放。。
}
}
}
虽然我在编写时使用了多个子函数,但是程序的大致流程还是这样的。
先定义几个全局变量:
var socket=new ActiveXObject("MSWinsock.winsock");//winsock对象

var Info="/t/t--==** Metallic Scanner v1.2 **==--/n/t/t/tmade by Metallic Shell"
var sample="Usage:/n cscript.exe MetScan.js <Begin Address> <End Address> <Begin Port> <End Port> [outTime=50]"

var beginPort=1; //起始端口
var endPort=2; //结束端口
var again; //记录扫描重复次数的变量,下面有体现
看看Main()函数。在js里本来是没有规定要有main函数的,但是出于习惯,我使用了C++的风格。
function Main()
{
        
        var cmdLine = WScript.Arguments;//这个对象用来取得参数
var outTime=50; //默认的超时时间
var beginAddr="192.168.1.100"; //默认开始IP
var endAddr="192.168.1.102"; //默认结束Ip
var addrCounter; //Ip计数器
WScript.echo(Info);
        /*-----取得命令行参数------*/
        if (cmdLine.length<4 ||cmdLine.length>5)//不符合要求的参数
{
                WScript.echo("Undefine Cmd Line!/n"+sample);//显示参数说明
return 0;
        }
        else //cmdLine.length==5
{
                outTime=cmdLine(4);
        }
        /*--------------------------*/
        //下面对变量进行初始化
beginAddr=cmdLine(0);
        endAddr=cmdLine(1);
        beginPort=cmdLine(2);
        endPort=cmdLine(3);
        addrCounter=beginAddr;
        again=outTime/10;
        socket.Protocol =0;//使用TCP协议

        WScript.echo("Metallic TCP/IP Scanner will scan the address from:/n "+beginAddr +" to "+endAddr+"./n"+"The Ports Rang is:"+beginPort+" - "+endPort);
        do
        {
                WScript.echo("Scan "+ addrCounter+":");
                WScript.echo("/tAddress: /t/tPort:/t/tState:");
                Scan(addrCounter); //用来扫描的子函数
addrCounter=Addaddr(addrCounter); //IP节点加1
}while (addrCounter!=Addaddr(endAddr))
        WScript.echo("Scan Complete!/n");
        return 0;
}
Addaddr()是用来使得IP节点+1的函数,至于Scan(addrCounter)即调用了扫描IP端口的子函数啦。先看看Addaddr:
function Addaddr(str)//使得Ip地址节点加1的函数
{
        var para=new Array(4);
        para=str.split(".");//对Ip地址按.分割
if (para[3].to==254)
        {
                para[3]=0;
                para[2]++;
        }
        else
        {
                para[3]++;
        }
        return (para[0]+"."+para[1]+"."+para[2]+"."+para[3]);//把分割处理的各段拼合
}
很简单,不多说了。然后看看最重要的Scan函数:
function Scan(addr)
{
        var portCounter; //端口计数器
for (portCounter=beginPort;portCounter<=endPort;portCounter++)
        {
                var i=0; //内部计数
socket.Close(); //事先要关闭可能的连接,以免出错
socket.Connect(addr,portCounter);//连接远程主机的端口
while (i<again && socket.State!=9)//如果socket未出错且没有超时就继续循环等待,超时就不管啦
{
                        if (socket.State==7)//如果连接上了
{
                                WScript.echo("/t"+addr+":/t/t"+portCounter+"/t/tOpen!");
                                //这里有一段抓Bannar的代码,但是不知为何,总是失效,就是buffer总是为空
WScript.sleep(100);
                                if (socket.bytesReceived>0)
                                {
                                        var buffer="";
                                        socket.getdata (buffer,8);
                                WScript.echo("/tBannar:"+buffer);
                                }
                                break;
                        }
                        WScript.sleep(10);//叫它睡一会,否则你的机器的资源会被吃掉很多!
i++;
                }
        }
}
这个函数有个问题,就是抓Bannar那块代码,GetData后buffer总是空的,但是socket.bytesReceived在GetData后就会变成0(如果这个端口有数据过来按道理socket.bytesReceived>0而且buffer应该就是Bannar了),这里郁闷了我好久,网上也没有提到相关资料…呜,还望高手指教 (*_*),俺的QQ是:35076264.不过我在测试时发现用vbscript写这段代码就不会有问题了,大家可以用Vbs写:
if socket.bytesReceived>0 then
            dim buffer
            buffer=””
            socket.getdata buffer,8
            WScript.echo "Bannar:"+buffer
    End if
 
怎么样,一个支持多IP多端口的扫描器就在记事本中做好了,很有成就感么?看看截图,是不是很有风格?呵呵.
原创粉丝点击