ผมเองก็นั่งคิดอยู่นานว่าจะเริ่มต้นอย่างไรดีกับ
ollydbg ครั้นจะเริ่มต้นที่ ollydbg เลย ขืินไม่รู้จักภาษา assembly (asm) คงไปไม่รอด อธิบายกันไม่ถึงไหน ดังนั้นคิดไปคิดมาแล้ว ผมคงต้องเริ่มต้น ที่ asm ก่อนเนี่ยแหละ หุหุ ตามผมมาให้ดีละกัน มันไม่ยากหรอก เพียงแต่ส่วนใหญ่จะไม่รู้กันเท่านั้นเอง สำหรับภาษา asm เองนั้น ก็จะแบ่งเป็นเนื้อหาเป็น 3 หมวดใหญ่ๆ ได้แก่
- Bit & byte
- Register
- Command
Bit & byte 
- Bit - หน่วยข้อมูลที่เล็กที่สุดของข้อมูล มีความเป็นได้อยู่ 2 ค่าคือ 0 และ 1 และเมื่อนำเอา bit มาต่อกัน เราจะเรียกมันว่า bit stream โดยปกติการแสดงค่า bit จะแสดงอยู่ในรูปของ ระบบเลขฐาน 2 เช่น 00000001 = 1, 00000010 = 2, 00000100 = 4
- Byte - bit ที่ต่อกันเป็นจำนวน 8 bits ทำให้ byte สามารถบรรจุข้อมูลได้ตั้งแต่ 0 – 255 (00000000 – 11111111) และเพื่อให้ง่ายต่อการอ่าน เราจะใช้ ระบบเลขฐาน 16 ในการแทนค่าเพื่อให้ง่ายต่อการเรียกใช้ (คงไม่สนุกถูกไม๊ ถ้าต้องจำตัวเลขฐาน 2 ยาวๆ) 0x01 = 1, 0x0F = 15, 0xFF = 255
- Word – มีขนาด 2 bytes นั่นหมายถึง word รองรับตัวเลขได้ตั้งแต่ 0 - 65535 หรือ 0x0FFFF
- Double word (DWORD) – มีขนาด 2 words หรือเท่ากับ 32 bits
Register ในปัจจุบัน CPU จะมี register ขนาด 64 bits แล้ว แต่ใน ollydbg 1.10 เองนั้น support ได้ถึง 32 bits เท่านั้น (คงต้องรอ ollydbg 2.0 ที่กำลังพัฒนาอยู่) เพราะฉะนั้น ผมจะไม่ขอพูดถึง register ขนาด 64 bits นะ จะพูดถึง 32 bits เท่านั้น (แต่อย่าตกใจไป จริงๆ แล้วมันก็เหมือนกันนะแหละ ต่างกันแค่ขนาด)
ก่อนอื่นคงต้องทำความเข้าใจก่อนว่า register คืออะไร register คือหน่วยความจำส่วนหนึ่งภายใน CPU มีหน้าที่ในการเก็บข้อมูลการประมวลผลจากการคำนวณ โดย register แบ่งออกเป็นอีก 4 กลุ่มได้แก่
- General Register - เก็บข้อมูล หรือเก็บผลลัพธ์จากการคำนวณ
- EAX : Extended Accumulator Register : Register สำหรับเก็บผลของการคำนวณ
- EBX : Extended Base Register : Register รองรับการคำนวณ
- ECX : Extended Counting Register : Register เพื่อการนับ หรือการวน Loop
- EDX : Extended Data Register : Register เพื่อเก็บข้อมูล
- Segment Register - อ้างอิงตำแหน่งหน่วยความจำเมื่อมีการอ่านหรือเขียนข้อมูล
- CS : Code Segment Register
- DS : Data Segment Register
- ES : Extra Segment Register
- SS : Stack segment Register
- Pointer and Index Register – ชี้ตำแหน่งต่าง ๆ ในหน่วยความจำที่ต้องการ
- EBP : Extended Base Pointers Register
- ESP : Extended Stack Pointer Register
- ESI : Extended Source Index Register
- EDI : Extended Destination Index Register
- Flag Register - เก็บสถานะการประมวลผลจากบางคำสั่ง
นอกจาำกนี้ ยังมี Register ที่สำคัญอีกตัวที่ไม่ได้กล่าวถึงคือ EIP (Extended Instruction Pointer Register) เป็น Pointer สำหรับชี้คำสั่งที่กำลังทำงานอยู่
Command หลังจากผ่านมา 2 หัวข้อแล้ว คราวนี้เราจะต้องมารู้จักกับ command ของ asm กันว่ามีอะไรบ้าง เราถึงจะสามารถนำไปใช้งานได้ โดยด้านล่างนี้จะเป็น command บางส่วนที่จะได้พบเห็นได้บ่อยๆ
- CALL - จะทำงานคล้ายกับการเรียก function ในภาษาระดับสูงต่างๆ
- MOV - ย้ายข้อมูลระหว่าง register หรือ หน่วยความจำ
- CMP - เปรียบเทียบข้อมูล โดยเมื่อผลของการเปรียบเทียบมีค่าเท่ากันแล้ว zero flag จะถูก set ค่าเท่ากับ 1 แต่หากผลของการเปรียบเทียบมีค่าไม่เท่ากัน zero flag จะถูก clear ค่าเป็น 0
- TEST - เป็นการ and logic โดยที่ ปลายทางไม่เปลี่ยนค่า มักจะใช้ในการตรวจสอบค่าของ register ว่าเป็น 0 หรือไม่
- PUSH - นำข้อมูลไปเก็บไว้ใน stack
- POP - เอาข้อมูลออกมาจาก stack
- SHR - เลื่อนไปทางขวา
- SHL - เลื่อนไปทางซ้าย
- NOT - กลับค่าบิตต่อบิต (complement)
- AND - การกระทำแบบและ
- OR - การกระทำแบบหรือ
- XOR - การกระทำแบบตรงข้ามหรือ
- JMP - กระโดดไปยัง address ที่กำหนด
- JE - กระโดดถ้าค่าเท่ากัน
- JZ - กระโดดถ้าค่าเป็นศูนย์
- JNE - กระโดดถ้าค่าไม่เท่ากัน
- JNZ - กระโดดถ้าค่าไม่เป็นศูนย์
- JA - กระโดดถ้าค่าเหนือกว่า
- JNBE - กระโดดถ้าค่าไม่ต่ำกว่าหรือเท่ากัน
- JAE - กระโดดถ้าค่าเหนือกว่า หรือเท่ากัน
- JNB - กระโดดถ้าค่าไม่ต่ำกว่า
- JB - กระโดดถ้าค่าต่ำกว่า
- JNAE - กระโดดถ้าค่าไม่เหนือกว่า หรือเท่ากัน
- JBE - กระโดดถ้าค่าต่ำกว่าหรือเท่ากัน
- JNA - กระโดดถ้าค่าไม่เหนือกว่า
- JG - กระโดดถ้าค่ามากกว่า
- JNLE - กระโดดถ้าค่าไม่น้อยกว่าหรือเท่ากับ
- JGE - กระโดดถ้าค่ามากกว่าหรือเท่ากัน
- JNL - กระโดดถ้าค่าไม่น้อยกว่า
- JL - กระโดดถ้าค่าน้อยกว่า
- JNGE - กระโดดถ้าค่าไม่มากกว่า หรือเท่ากัน
- JLE - กระโดดถ้าค่าน้อยกว่า หรือเท่ากัน
- JNG - กระโดดถ้าค่าไม่มากกว่า
หวังว่าบทความของผมในครั้งนี้คงช่วยปูพื้นภาษา asm ให้กับทุกท่านไม่มากก็น้อยนะ ^^ แต่ถ้ายังติดตรงไหน หรือยังไม่เข้าใจอะไร comment หรือ pm มาหาผมได้ทันทีเลย ผมจะพยายามตอบกลับให้เร็วที่สุด หุหุ Edkung จัดให้ ^^