ช่วงนี้ผมหมกมุ่นอยู่กับงาน research ที่เป็น asm, x86 จนคุยกับคนแทบไม่รู้เรื่องแล้ว -*- วันนี้ผมเลยเขียนบทความเกี่ยวกับ reverse engineering win32 dll ไว้เป็นความรู้สำหรับ Programmer, Hacker และผู้ที่สนใจครับ
ก่อนที่เราจะไปพูดถึง DLL หรือ Dynamic-link library เราจะมาพูดถึงพื้นฐานกันก่อน(ผมสมมุติว่าผู้อ่านมีความรู้พื้นฐานกันอยู่แล้ว ผมจะไม่พูดพื้นฐานเยอะเพราะจะทำให้บทความเยิ่นเย้อจนเกินไปแต่ถ้าไม่เข้าใจสามารถ comments ถามในนี้ได้เลยครับ)
ในตอนที่่เราเขียนโปรแกรมเรามีการเรียกใช้ functions ต่างๆ เช่น printf, memcpy, HeapAlloc, ReadFile, … functions พวกนี้มาจากไหน? ก็มาจากที่เรา import หรือ include มาจาก library นั้นเองอาจจะเป็น standard library, Win32 library, 3rd party library ก็ตามแต่ ทีนี้ตอนเรา compile โปรแกรมของเราเพื่อเอาโปรแกรมไปใช้งาน มันมีวิธีเอาเจ้า library นี้ไปใช้ด้วยอยู่ 3 แบบคือ
1. Static linking วิธีนี้ปกติไม่ค่อยเห็นใครเขาใช้กันส่วนใหญ่จะเห็นในโปรแกรมบน Unix, Linux วิธีนี้มันจะยัด code ใน library ทั้งหมดลงไปใน EXE, ELF ซึ่งทำให้ไฟล์มีขนาดใหญ่ขึ้นตาม library ที่ยัดเข้าไป
2. Runtime linking วิธีนี้คือจะ link library มาใช้เมื่อต้องการใช้ function นั้นเท่านั้น ไม่ใช่ link library มาตอนเปิดโปรแกรมเหมือน dynamic linking วิธี runtime linking นี้พวก Malware, Packer นิยมใช้กัน
3. Dynamic linking วิธีการ link library แบบนี้คือวิธีที่นิยมใช้กันโดยทั่วไป คือ link library มาตอนเปิดโปรแกรม และการเขียนโปรแกรมโดยใช้การ link แบบนี้จะทำให้เวลาเรา reversing จะรู้ว่า program นั้น import functions อะไรมาใช้บ้างอย่างง่ายดายโดยดูจาก IAT(import address table) จาก PE header ของโปรแกรม
โอเคแล้ว EXE กับ DLL ต่างกันยังไง?
จริงๆแล้วโครงสร้างภายในของ EXE กับ DLL นั้นแทบไม่ต่างกันเลยเป็น PE file format เหมือนกัน มีแค่ 1 flag บน PE header ที่บอกว่าไฟล์นี้เป็น DLL แค่นั้นเองและ DLL ก็มี main function หรือ entry point เหมือนกันคือ DllMain ที่ต่างกันคือวัตถุประสงค์การใช้งาน DLL เขียนมาเพื่อ export functions ไปให้ EXE หรือ DLL อื่นใช้งานและถึงแม้จะเป็นไฟล์ประมวลผลได้เหมือนกันแต่จะไม่ทำงานโดยตัวคนเดียว ต้องมีคนมาเรียกไปทำงานด้วยถึงจะทำงาน 😀
จบพื้นฐาน ทีนี้เราจะมา Reversing Win32 DLL กันสักที โดยจำลองตัวอย่างสถานการณ์ว่าเราจะแอบใช้ API Functions ใน DLL โปรแกรมที่เราสนใจของคนอื่นเช่น Steam, Dota2 จะเป็นอย่างไรถ้าเราสามารถส่งค่าที่เราต้องการไปให้ API function ที่เราสนใจเช่น เปิด/ปิด หมอก 😀
เอาละเพื่อไม่ให้เป็นการผิดกฏหมายบลาๆๆ ผมจะยกตัวอย่างไฟล์ DLL ที่ผมเขียนขึ้นมาเองง่ายๆและ reversing/เขียนโปรแกรมไป call function ให้ดู
// testdll.c
__declspec(dllexport) int sum(int a, int b) {
return a + b;
}
code ด้านบนเป็นการ export function sum โดยรับค่ามาบวกัน
จอ บอ จบ. มีความคิดเห็นเพิ่มเติม, ไม่เข้าใจ, อยากรู้ตรงไหนเพิ่มเติม comments ไว้ได้เลยครับ