臨時製作的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多連接埠的掃描器就在記事本中做好了,很有成就感麼?看看,是不是很有風格?呵呵.