Hello World! Program in MASM
เป็นธรรมดาสำหรับการเริ่มต้นหัดเขียนโปรแกรมภาษาอะไรซักอย่าง หลายคนที่เป็นโปรแกรมเมอร์คงปฏิเสธไม่ได้ว่าไม่เคยเขียนโปรแกรมให้แสดงข้อ ควา่ม "Hello world!" : )
ดังนั้นวันนี้เราจะมาเริ่มต้นเขียนโปรแกรม แรกของเราในภาษา Assembly ในบทความนี้คุณจะได้เรียนรู้กระบวนการเขียนโปรแกรมด้วยภาษา Assembly โดยใช้ WinASM และใช้ MASM32 เป็น Assembler รวมถึงจะได้เรียนรู้วิธีการ Debug โปรแกรมที่เราเขียนขึ้นมาด้วย Debugger ยอดนิยมนั้นคือ OllyDBG นั่นเอง มาดูกันเลยครับ
คอนเซ็ปต์ใหม่สำหรับวันนี้
- การประกาศตัวแปร และ ค่าคงที่
- ใช้ OllyDBG ในการ Disassemble และ Debug โปรแกรม
API Function ใหม่สำหรับวันนี้
- MessageBox
เริ่มกันเลย :)
เปิด WinAsm, และสร้าง exe project ใหม่ขึ้นมา (คงทำกันได้แล้วนะ) จากนั้นพิมพ์โค้ดตามตัวอย่างด้านล่างนี้เลยครับ
{codecitation class="brush:plain;gutter:false;"}</p> <div>.386</div> <div>.model flat, stdcall</div> <div>option casemap:none</div> <div>include windows.inc</div> <div>include kernel32.inc</div> <div>include user32.inc</div> <div>includelib kernel32.lib</div> <div>includelib user32.lib</div> <div>.data</div> <div>MsgBoxCaption db "Simple MessageBox Program",0</div> <div>MsgBoxText db "Hello World!",0</div> <div>.code</div> <div>start:</div> <div>invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK</div> <div>invoke ExitProcess,0</div> <div>end start</div> <p>{/codecitation}</p> <p>คลิก "Go All" และทำการ Save Project ของคุณซะ หากไม่มีอะไรผิดพลาดคุณน่าจะพบ MessageBox น่าตาแบบนี้</p> <p><img src="images/stories/Programming/Assembly/Messagebox/masm_msgbox_1.jpg" border="0" alt="masm_msgbox_1" width="215" height="109" />
ต่อไปเราจะมาวิเคราะห์ส่วนที่เพิ่มมาใหม่กัน...
Header & Library Files
Windows.inc เป็น include ไฟล์หลักที่เราจะได้ใช้ประจำ เป็นไฟล์ที่ใช้กำหนด Windows Data Type, Function calls, data structures, และ ค่าคงที่ต่าง ๆ ซึ่งทำให้เราสามารถอ้างถึงข้อมูลเหล่านี้ด้วยชื่อได้ ในตัวอย่างนี้ windows.inc กำหนด NULL และ MB_OK ที่เราสามารถเรียกใช้งานด้วยชื่อได้ ทำให้โค้ดของเราอ่านง่ายขึ้น
user32.inc และ user32.lib ต้องการสำหรับเรียกใช้ MessageBox ฟังก์ชั่น
ตัวแปร (Variables)
เรามีการประกาศใช้ตัวแปร String ที่ปิดท้ายด้วย 0 (zero-terminate text string) 2 ตัว ได้แก่ MsgBoxCaption และ MsgBoxText ซึ่งจะแสดงผลโดย Message box
ตัวแปร และ ค่าคงที่ (Constants) จะมีการประกาศใช้งานที่เหมือนกันคือเริ่มจาก ชื่อตัวแปร, ขนาดของตัวแปร (size) และ ตามด้วยค่าของตัวแปร แต่ถ้าเป็นตัวแปรแบบ String จะมีขนาดที่แตกต่างกัน ซึ่งเราจะกำหนดให้เป็นตัวแปรแบบ Byte แต่จะปิดท้ายด้วย 0 ลองดูจากตัวอย่างต่อไปนี้
{codecitation class="brush:plain;gutter:false;"}</p> <div>.data</div> <div>MyByte db 07h</div> <div>MyWord dw 0FFFh</div> <div>MyDword dd 0B800000h</div> <div>MyString db "null-terminated text string", 0</div> <div> </div> <div>.data?</div> <div>UnInitByte db ?</div> <div> </div> <div>.const</div> <div>MyConst equ 04h</div> <p>{/codecitation}</p> <h3>Program Code</h3> <p>คำสั่งใหม่ ซึ่งเป็นคำสั่งหรับการเรียกใช้งาน MessageBox ฟังก์ชั่น จะต้องใส่ค่าพารามิเตอร์ด้วยกัน 4 ตัว ซึ่งเราจะดูได้จาก Win32.hlp</p> <p><img src="images/stories/Programming/Assembly/Messagebox/masm_msgbox_2.jpg" border="0" alt="masm_msgbox_2" width="393" height="173" />
จากโคัดตัวอย่างของเรา จะมีการส่งค่า พารามิเตอร์ดังนี้
เอาล่ะ... เอาแค่ตัวอย่างง่ายๆ แบบนี้ก่อน ต่อไปเราจะมาดูส่งสำคัญอีกอย่างสำหรับการเขียนโปรแกรม หรือโปรแกรมเมอร์ นั่นคือการ Debug โปรแกรมที่เรากำลังเขียน
เมื่อเราเปิดโปรแกรมของเราโดยใช้ OllyDBG (Make -> Debug (Ctrl+F9)) เราจะเห็นโค้ดที่ถูก Disassembly ที่อยู่ใน executable โปรแกรมของเรา ตามตัวอย่างในรูปครับ

นี่เป็นนิสัยที่ดี ที่จะเรียนรู้ทักษะการดีบักโปรแกรม และการที่เราได้เห็น Assembly code จริงๆ ที่สร้างจาก MASM ถูกแทนที่ด้วยคำสั่งดั้งเดิมคือ PUSH/CALL และ 2 บรรทัดล่างสุด (JMP) จะเป็นคำสั่งที่ชี้ไปยัง "Import Address Table" สำหรับ 2 ฟังก์ชั่นที่เราสร้างขึ้น ซึงถูกเพิ่มเข้ามาโดยตัว Linker
ที่น่าสนใจอีกอย่างหนึ่งคือ OllyDBG สามารถโหลดซอร์สโค้ดและแสดงผล Sync กันกับ Disassembly โค้ดได้ด้วย แต่เราต้อง Debug version สำหรับโปรแกรมของเราขึ้นมาก่อน โดยการไปที่เมนู "Make -> Set Active Build" และเลือก "Debug Version" และคลิก "Go All" อีกที เราจะเห็นไฟล์ใหม่เพิ่มเข้ามาในโฟเดอร์โปรเจ็คของเรา ที่มีส่วนขยายเป็น .ilk และ .pdb
ต่อไปถ้าเราโหลดโปรแกรมของเราด้วย OllyDBG เราจะเห็นว่ามีการข้อมูลเพิ่มขึ้นในหน้าต่าง Dissassembly ถ้าเราคลิกที่หัวของคอลัมน์ "Comment" มันจะแสดงซอร์สโค้ดที่สอดคล้องกันกับคำสั่งที่อยู่ในหน้าต่าง Disassembly คอลัมน์
และถ้าหากเราเลือกเมนู "View -> Source files" และ ดับเบิลคลิกที่ไฟล์ .asm ของเรา หน้าต่างใหม่ที่แสดงซอร์สโค้ดของเราทั้งหมดจะปรากฏขึ้นมา ซึ่งเราสามารถทำให้มันแสดงอยุ่ด้านบนเสมอได้ โดยการคลิกขวา และเลือก Appearance -> Alway on top จากหน้าต่างโค้ดเราจะเห็นคำสั่งที่กำลังทำงานอยู่ถูกไฮไลด้วยแถบสีดำ ดังภาพ

นี่จะทำให้เราสามารถดีบักโปรแกรมของเราได้อย่างง่ายและรวดเร็ว แต่จงจำไว้ว่า Reverse Engineering คือการที่เราต้องแก้ไขโปรแกรมโดยปราศจากซอร์สโค้ด และโดยทั่วไปเราอาจโชคดีถ้าเราเริ่มดีบักโปรแกรมที่เป็น debug version แทนที่จะเป็น release version : )
ที่มา: Win32 Assembler Coding โดย Goppit