วันอังคารที่ 6 พฤศจิกายน พ.ศ. 2550

การอ่านข้อมูล image ของ physical memory (RAM) เพื่อทำการค้นหาว่า ณ เวลาที่เก็บข้อมูลมีโปรเซสใดรันอยู่บ้าง

หลังจากที่ได้กล่าวถึงการ dump ข้อมูลจาก Physical Memory มาในคราวที่แล้ว วันนี้จะกล่าวถึงเรื่องการนำข้อมูลของ RAM ที่ได้มาไปทำการวิเคราะห์ โดยจะดูว่า ณ เวลาที่ทำการเก็บข้อมูลนั้นมีโปรเซสใดรันอยู่บ้าง

หมายเหตุ: ซอฟต์แวร์และวิธีการที่ใช้วิเคราะห์ที่จะกล่าวต่อไปนี้นั้น สามารถวิเคราะห์ RAM ที่ได้จากระบบปฎิบัติการ Windows เท่านั้น ไม่สามารถวิเคราะห์ข้อมูล RAM ของระบบปฏิบัติการ Linux ได้ เนื่องจากโครงสร้างในการเก็บข้อมูลนั้นต่างกัน

แล้วเราจะวิเคราะห์ยังไง ?? ก่อนที่จะไปดูวิธีการ เราจะไปดูกันก่อนว่ามีโปรแกรมใดบ้างที่ช่วยในการวิเคราะห์...

โปรแกรมที่ช่วยในการวิเคราะห์นี้มีชื่อว่า lsproc ซึ่งเขียนโดย Harlan Carvey โดย lsproc นั้นจะทำการอ่าน image ที่เราได้จาก RAM แล้วทำการค้นหาโครงสร้างข้อมูลต่างๆ (data structure) และทำการแสดงข้อมูลออกมาเป็นดังภาพข้างล่าง

หมายเหตุ: ข้อมูลจาก RAM ที่นำมาวิเคราะห์นี้ได้จากระบบปฏิบัติการ Windows 2000 Server SP4

Photo Sharing and Video Hosting at Photobucket

จากภาพ lsproc จะทำการแสดง หมายเลขโปรเซส (PID), หมายเลขโปรเซสที่ทำให้เกิดโปรเซสนั้น (PPID) ชื่อของโปรเซส, ตำแหน่งที่อยู่ใน Physical memory (offset) และเวลาที่โปรเซสถูกสร้างขึ้น สังเกตว่าผลลัพธ์ที่ได้มานั้นมีโปรเซสของ dd (PID หมายเลข 216) และโปรเซสของ helix (PID หมายเลข 404) ที่เราใช้ในการเก็บข้อมูลของ physical memory รวมอยู่ด้วย นอกจากนี้ lsproc ยังสามารถดึงรายชื่อของโปรเซสที่จบการทำงานไปแล้วขึ้นมาแสดงได้ หากข้อมูลของโปรเซสดังกล่าวที่อยู่ใน RAM ยังไม่ถูกเขียนทับโดยโปรเซสอื่นๆ โปรเซสที่จบการทำงานไปแล้วนั้นข้างหลังชื่อของโปรเซสจะมีเครื่องหมาย (x) อยู่ ซึ่งในที่นี้ก็คือ userinit.exe (PID หมายเลข 1048) และ winmgmt.exe (PID หมายเลข 1052)

หลังจากที่รู้จักโปรแกรมช่วยกันไปแล้ว คราวนี้เราจะมาดูกันว่า lsproc ทำงานกันอย่างไร

lsproc ทำงานโดยทำการอ่าน image ที่ได้จาก RAM แล้วทำการค้นหาโครงสร้างข้อมูลที่เรียกว่า EPROCESS ซึ่งเป็นโครงสร้างข้อมูลที่ระบบปฏิบัติการ Windows ไว้ใช้สำหรับทำการเก็บข้อมูลของโปรเซสต่างๆที่เกิดขึ้นบนระบบ โดยโครงสร้างข้อมูล EPROCESS ของระบบปฏิบัติการ Windows 2000 Server SP4 นั้นสามารถดูได้จาก Forensik Blog (เค้าเขียนว่า Forensik จริงๆ ไม่มีเขียนผิดนะ แหะๆ)

ในโครงสร้างข้อมูล EPROCESS นั้น ได้เก็บโครงสร้างข้อมูลที่น่าในใจอย่างหนึ่งคือ DISPATCHER_HEADER ซึ่งโครงสร้างข้อมูลดังกล่าวมีลักษณะดังต่อไปนี
      +0x000 Header           : struct _DISPATCHER_HEADER, 6 elements, 0x10 bytes
+0x000 Type : UChar
+0x001 Absolute : UChar
+0x002 Size : UChar
+0x003 Inserted : UChar
+0x004 SignalState : Int4B
+0x008 WaitListHead : struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x000 Flink : Ptr32 to
+0x004 Blink : Ptr32 to
ชนิดของข้อมูลที่ทำตัวหนานั้นคือ Type และ Size ซึ่งจากข้อมูลของ Forensik Blog ได้บอกไว้ว่าค่า Type จะเป็น 0x03 และ Size จะเป็น 0x1b เสมอ ซึ่งค่านี้จะคงที่ตั้งแต่ Windows 2000 Server SP4 ไปจนถึง Windows 2003 Server ดังนั้นเราสามารถใช้ค่านี้ทำการระบุตำแหน่งของข้อมูลที่เกี่ยวข้องกับโปรเซสใน physical memory ได้

เมื่อทำการระบุตำแหน่งของข้อมูลที่เกี่ยวข้องกับโปรเซสได้แล้ว จากนั้นเราทำการอ่านข้อมูลทั้งหมดที่เกี่ยวข้องกับโปรเซสนั้นๆ โดยจำนวนข้อมูลที่อ่านจะขึ้นอยู่กับขนาดของ EPROCESS ของแต่ละระบบปฏิบัติการ โดยระบบปฏิบัติการ Windows 2000 Server SP4 นั้นจะมีขนาด 0x290 bytes

เมื่ออ่านข้อมูลจำนวน 0x290 bytes ของ EPROCESS แล้ว เราจะทำการตรวจสอบอีกขั้นหนึ่งว่าข้อมูลที่เราอ่านมานั้นเป็น EPROCESS จริงๆหรือไม่ ซึ่งขั้นตอนที่ lsproc ทำการตรวจสอบนั้นคือทำการตรวจสอบค่าของ Synchronization Event #2 และ #3 ของ EPROCESS ซึ่งทั้ง 2 ค่านี้จะอยู่ที่ตำแหน่ง 0x13c และ 0x164 จากตำแหน่งเริ่มต้นของ EPROCESS ซึ่งหากค่าของ Synchronization ทั้งสองเป็น 0x040001 แล้ว แสดงว่าข้อมูลจำนวน 0x290 bytes ที่อ่านมานั้นเป็น EPROCESS

หลังจากที่มั่นใจว่าข้อมูลที่อ่านมาจำนวน 0x290 bytes นั้นเป็น EPROCESS แล้ว lsproc จึงทำการอ่านข้อมูล ณ ตำแหน่งต่างๆ เช่น ชื่อของโปรเซส (0x1fc), เวลาที่โปรเซสถูกสร้างขึ้น (0x088), PID (0x09c), PPID (0x1c8) แล้วจึงนำมาแสดงผลต่อไป

ปิดท้ายกันด้วยขั้นตอนการทำงานแบบหยาบๆของ lsproc ครับ :)

Photo Sharing and Video Hosting at Photobucket

ไม่มีความคิดเห็น: