Articles

Hello World! Program in MASM

Written by pspn on . Posted in Blog

เป็นธรรมดาสำหรับการเริ่มต้นหัดเขียนโปรแกรมภาษาอะไรซักอย่าง  หลายคนที่เป็นโปรแกรมเมอร์คงปฏิเสธไม่ได้ว่าไม่เคยเขียนโปรแกรมให้แสดงข้อ ควา่ม "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" />

จากโคัดตัวอย่างของเรา จะมีการส่งค่า พารามิเตอร์ดังนี้

NULL - ไม่มี parent window
addr MsgBoxText - ตำแหน่ง Address ของข้อความที่จะแสดง
addr MsgBoxCaption - ตำแหน่ง Address ของข้อความที่แสดงบน Title Bar (หรือ Caption นั่นเอง)
MB_OK - สไตล์ของ MessageBox ที่ต้องการ (เป็นค่าคงที่ของระบบ  กำหนดไว้ในไฟล์ windows.inc)

เอาล่ะ... เอาแค่ตัวอย่างง่ายๆ แบบนี้ก่อน  ต่อไปเราจะมาดูส่งสำคัญอีกอย่างสำหรับการเขียนโปรแกรม  หรือโปรแกรมเมอร์  นั่นคือการ Debug โปรแกรมที่เรากำลังเขียน

เมื่อเราเปิดโปรแกรมของเราโดยใช้ OllyDBG  (Make -> Debug (Ctrl+F9)) เราจะเห็นโค้ดที่ถูก Disassembly ที่อยู่ใน executable โปรแกรมของเรา ตามตัวอย่างในรูปครับ

masm_msgbox_3

นี่เป็นนิสัยที่ดี ที่จะเรียนรู้ทักษะการดีบักโปรแกรม   และการที่เราได้เห็น 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    จากหน้าต่างโค้ดเราจะเห็นคำสั่งที่กำลังทำงานอยู่ถูกไฮไลด้วยแถบสีดำ ดังภาพ

masm_msgbox_4

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

 

ที่มา: Win32 Assembler Coding โดย Goppit

 

 

 

blog comments powered by Disqus