ช่วงนี้ผมหมกมุ่นอยู่กับงาน 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 โดยรับค่ามาบวกัน

cl /ld
compile ด้วย Visual C++ ให้เป็น DLL

 

export table
Export Address Table(EAT) ของ testdll.dll

 

asm sum function
asm ของ function sum ของ testdll.dll จากการ disassembly เราจำเป็นต้องเข้าใจ asm ของ function ที่เราจะใช้เพื่อจะได้ทำการส่งค่า arguments ไป call function ได้ถูกต้อง แต่ในเคสนี้เป็น function ง่ายๆที่เราเขียนเองและรู้รูปแบบค่าที่จะส่งไป call อยู่แล้ว

 

c++ call win32 api dll
call.cpp code c++ ที่เราเขียนขึ้นมาเพื่อใช้ call sum() ของไฟล์ testdll.dll โดยใช้วิธี Runtime linking

 

result call
ทำการ compile และ run program จะเห็นว่าได้ผลบวกถูกต้อง

 

disassembly call sum
Note: basic asm x86 ให้เพิ่มเติม รูปนี้คือ disassembly call.exe เราจะเห็นว่าก่อน call sum() โปรแกรมจะเตรียม arguments ในการ call โดย push ค่าลงใน stack หลังจาก call sum() ค่าที่ return จะอยู่ที่ register EAX และเนื่องจากเป็นการ call แบบ cdecl จะทำการ clear stack หลังจาก call เสร็จแล้วด้วยการ add esp, x ซึ่ง x คือจำนวน bytes ที่จะ clear และในที่นี้คือ 8 และ 8 ก็คือ arguments 3, 4 คือ int 2 ตัว ตัวละ 4 bytes นั้นเอง

จอ บอ จบ. มีความคิดเห็นเพิ่มเติม, ไม่เข้าใจ, อยากรู้ตรงไหนเพิ่มเติม comments ไว้ได้เลยครับ

api, asm, c, call, cracking, DLL, Dynamic link library, EAT, EXE, IAT, ida pro, pe, reverse engineering, reversing, vc++, win32, x86
เรื่องก่อนหน้า
Wmap (“Web Mapper”) Information gathering for web hacking.
เรื่องถัดไป
Wireless Hacking Part 4: Crack WEP with no wireless clients

Related Posts

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Fill out this field
Fill out this field
โปรดใส่ที่อยู่อีเมลที่ใช้งานได้
You need to agree with the terms to proceed