สวัสดีและยินดีต้อนรับกลับมา
ในบทเรียนนี้เราจะแกะตัวอย่าง ถังขยะ
ดังนั้นเราจึงรัน x32dbg ในฐานะผู้ดูแลระบบ
รีสตาร์ทเป็นผู้ดูแลระบบ และตัวเลือก > การกำหนดลักษณะ มีดังนี้
ตรวจสอบเฉพาะจุดหยุดรายการเท่านั้น และฉันใช้เวอร์ชันวันที่ 12 กรกฎาคม พ.ศ. 2567
งั้นเรามาเปิดตัวอย่างของเรากันดีกว่า ถังขยะ ถังขยะ
ไฟล์ทั้งหมด แล้วคลิกที่ตัวอย่าง ถังขยะ เปิด.
และเราวางจุดพักฮาร์ดแวร์ไว้ที่นั่น
BP IsDebuggerPresent.
กด Enter
คลิกที่แท็บจุดหยุดเพื่อยืนยันว่ามีการตั้งค่าแล้ว
และตอนนี้เราก็วิ่ง
มันได้ถึงจุดหยุดทำงานของฮาร์ดแวร์ของเราแล้ว แต่เรายังอยู่ในโมดูลของระบบ
ดังนั้นเราต้องการกลับไปที่โมดูลผู้ใช้
คลิกที่ปุ่มนี้เพื่อรันโค้ดผู้ใช้
และตอนนี้เราอยู่ในโมดูลผู้ใช้
เราเดินขึ้นไปอีกหน่อย แล้วเราก็เห็นว่า—เลื่อนขึ้นไปอีกหน่อย
แล้วเราก็เห็นว่าเราเพิ่งกลับมาจากการโทรครั้งนี้
และผลลัพธ์ของการเรียกนี้จะถูกเก็บไว้ใน EAX และผลลัพธ์จะเป็นศูนย์
ซึ่งหมายความว่าไม่ตรวจพบดีบักเกอร์
ดูเหมือนว่า x32dbg เวอร์ชันนี้สามารถซ่อนตัวเองจากตัวอย่างมัลแวร์ได้สำเร็จ
เพราะฉะนั้นเราไม่จำเป็นต้องทำอะไรเลย ปล่อยมันไว้แบบนั้นเฉยๆ
ถัดไป เราต้องการตั้งค่าจุดพักบน VirtualAlloc
ดังนั้นเราจึงใส่ BP VirtualAlloc
การจัดสรรเสมือน
แล้วเราก็กด Enter
และเราไปยืนยันโดยการคลิกที่แท็บ Breakpoints อีกครั้งว่า VirtualAlloc ได้รับการตั้งค่าแล้ว
ตอนนี้เราวิ่งแล้ว
มันก็คือ VirtualAlloc
ดังนั้นเราจึงก้าวไปจนกระทั่งถึง
NtAllocateVirtualMemory
ดังนั้นเราจึงอยู่ที่ NtAllocateVirtualMemory และเราต้องการตรวจสอบพารามิเตอร์ที่สอง
ดังนั้นพารามิเตอร์ที่สองคือ คุณสามารถตรวจสอบได้โดยการค้นหาข้อมูลอ้างอิงนี้ MSDN ฟังก์ชัน NtAllocateVirtualMemory
ฟังก์ชั่นหน่วยความจำเสมือน
และพารามิเตอร์ที่สองคือตัวชี้ไปยังที่อยู่ฐาน
คุณสามารถดูเครื่องหมายดอกจันได้ที่นี่
มันก็เป็นตัวชี้
ซึ่งหมายความว่าพารามิเตอร์ที่สองที่นี่คือที่อยู่ของที่อยู่
นั่นคือความหมายของคำว่าตัวชี้
ดังนั้นเราจึงเลือก Dump 1.
ตรวจสอบให้แน่ใจว่าเป็นการถ่ายโอนข้อมูลที่เลือกใช้งานอยู่
คุณสามารถเลือกดัมพ์ได้โดยการคลิกที่มัน
ดังนั้นข้อมูลใดๆ ที่ถูกเลือกไว้อย่างแข็งขัน เมื่อคุณทำเช่นนี้ ข้อมูลนั้นจะถูกถ่ายโอนไปที่นั่น
แล้วเราจะทำสิ่งนี้ตอนนี้: ติดตามใน Dump
ดังนั้นจะดัมพ์ใน Dump 1 เนื่องจากเป็นอันที่เลือกไว้อย่างตั้งใจ
ทีนี้เราจะมาดูว่าที่นี่มีที่อยู่อะไรบ้าง
ที่อยู่ที่ปรากฏที่นี่คืออะไร
ดังนั้นเราจึงก้าวไปและเราเห็นว่าที่อยู่คือ 0x00D50000
เราต้องอ่านแบบย้อนกลับเพราะว่านี่เป็นแบบลิตเติ้ลเอนเดียน
จากนั้นเราก็เปิด Notepad
และเราบันทึกที่อยู่ลงไป:
0x00D5 0000 มันจะแตกต่างสำหรับคุณแน่นอน
เพียงทำตามสิ่งที่คุณเห็นบนพีซีของคุณ
ดังนั้นฉันจึงใส่ 0x00D50000
แล้วตอนนี้ฉันต้องไปที่อยู่นั้น
จากนั้นคลิกขวาที่คัดลอก
แล้วผมก็กลับมาที่ Dump 1
คลิกขวาไปที่ Expression
วางที่อยู่ตรงนั้น
และตอนนี้ ฉันสามารถวางจุดพักฮาร์ดแวร์ไว้ที่นี่ได้แล้ว
คลิกขวา ฮาร์ดแวร์ จุดพัก การเข้าถึงฮาร์ดแวร์—ดำเนินการฮาร์ดแวร์ ขออภัย การดำเนินการฮาร์ดแวร์
เพื่อให้เราทราบว่ามัลแวร์กำลังจะดำเนินการโค้ดที่ถูกทิ้งเมื่อใด
โดยปกติแล้วมัลแวร์จะดำเนินการหลังจากดัมพ์แล้ว
นั่นจึงเป็นเหตุว่าทำไมเราจึงใส่จุดพักฮาร์ดแวร์ใหม่อีกครั้ง
หลังจากใส่จุดพักฮาร์ดแวร์แล้ว เรากลับไปที่แท็บจุดพักเพื่อยืนยันว่าได้ตั้งค่าจุดพักฮาร์ดแวร์ไว้จริงแล้ว
แค่นั้นแหละ.
ตอนนี้เราลองรันอีกครั้งเพื่อดูว่าจุดหยุดการทำงานของฮาร์ดแวร์เกิดขึ้นหรือไม่
และหากเกิดขึ้นจริง จะมีโค้ดที่ถูกแยกออกมาอยู่ที่นั่นหรือไม่
แล้วเราก็วิ่งไปพบว่ามีอะไรบางอย่างอยู่ตรงนั้น
แต่นี่ไม่ใช่ไฟล์ปฏิบัติการ PE
ไม่มีส่วนหัว MZ อยู่ที่นั่น
แล้วเราก็ดำเนินต่อไป คลิกเรียกใช้ใหม่อีกครั้ง และคราวนี้จะพบจุดหยุดการทำงานของฮาร์ดแวร์อีกครั้ง
สถานที่เดียวกัน
ไม่ต้องสนใจมัน
วิ่งต่อไป
และครั้งนี้มันกระทบ
VirtualAlloc เป็นครั้งที่สอง
เอาล่ะ.
เราทำซ้ำเทคนิคเดียวกันอีกครั้ง
เราก้าวข้าม VirtualAlloc
ตอนนี้เราจะแกะเพย์โหลดชุดที่สองออก
เพย์โหลดแรกอาจไม่ใช่ไฟล์ดัมพ์หลักที่เราต้องการ
ตอนนี้เรากำลังติดตามเพย์โหลดที่สอง
ตกลง.
ทีนี้เราก็มาถึงการโทรครั้งที่สองแล้ว
ครั้งที่สองที่เรียก NtAllocateVirtualMemory นี้
ครั้งนี้เราจะไปที่ Dump 2 ซึ่งเป็นอันที่เลือกไว้
เนื่องจากเราต้องการรักษา Dump 1 ไว้เพื่อให้สามารถตรวจสอบได้
ดังนั้นเราจึงเลือก Dump 2
และที่นี่เรามาที่พารามิเตอร์ที่สองแล้วทำตามใน
Dump 2
คลิกขวา ติดตามใน Dump
ดังนั้นมันจะไปที่ Dump 2
ตอนนี้เราก้าวข้ามจุดนี้ไปและดูว่าที่อยู่หน่วยความจำใดปรากฏอยู่ที่นี่
ดังนั้นเราจึงก้าวไปและเราจะเห็นว่าเราได้รับ 0x036F0000
อีกครั้งเราก็คัดลอกสิ่งนี้
0x036F0000
นี่คือหน่วยความจำที่การจัดสรรจะเกิดขึ้นต่อไป
ดังนั้น 0x036F0000.
ดังนั้นเราต้องไปที่นั่นตอนนี้
ดังนั้นเราเพียงแค่คัดลอกสิ่งนี้แล้วไปที่ Dump 2
คลิกขวาไปที่ Expression
วางที่อยู่ตรงนั้น
คลิกตกลง
ตอนนี้เราได้วางจุดพักอีกจุดไว้ที่นี่ นั่นก็คือจุดพักของฮาร์ดแวร์
คลิกขวาที่ ดำเนินการฮาร์ดแวร์ จากนั้นคลิก เรียกใช้
และครั้งนี้มันก็แกะออกมาเองแล้ว และนี่คือสิ่งที่เราต้องการ
คุณสามารถเห็นส่วนหัว MZ ได้ที่นั่น MZ—นั่นหมายความว่านี่คือสิ่งที่ถูกต้อง
ดังนั้นเราต้องทิ้งสิ่งนี้
ดูเหมือนว่ามัลแวร์ตัวนี้จะมีการเรียก
VirtualAlloc สองครั้ง
ครั้งแรกคือการแกะโค้ดตัวช่วย ซึ่งอาจเป็นโค้ดตัวช่วยที่ไม่ใช่โค้ดที่เราต้องการ
และแล้วตัวที่สองก็คือตัวที่เราต้องการ ตัวที่มี MZ header
ดังนั้นเราจะทิ้งข้อมูลที่สองไว้ที่นี่
ตอนนี้เรามาเปิดโปรแกรม Process Hacker กัน
ดังนั้นเราจึงมองหาตัวอย่างมัลแวร์ของเรา ซึ่งอยู่ที่นี่
ดับเบิลคลิกที่มัน แล้วคลิกที่แท็บหน่วยความจำ
หากไม่เปิด ให้คลิกที่แท็บหน่วยความจำ จากนั้นค้นหาหน่วยความจำที่
0x036F ซึ่งเป็นศูนย์สี่ตัว
และอันนี้ ถ้าคุณติดตามใน Memory Map — ถ้าคุณคลิกขวาที่นี่และไปที่
Follow in Memory Map คุณจะพบว่าเป็นประเภท
Private หมายความว่าได้รับการจัดสรรแบบส่วนตัวโดยใช้ VirtualAlloc และการป้องกันนั้นเป็นแบบ
Executable, Readable และ Writable
บางครั้งนี่คือ RWX ERW มีความหมายเหมือนกับ RWX ซึ่งหมายถึง อ่านได้ เขียนได้ และปฏิบัติการได้
ดังนั้นเมื่อเราค้นหาสิ่งนี้ใน Process Hacker เราก็จะค้นหา
RWX ที่อยู่ 0x036F ตามด้วยศูนย์สี่ตัว
ดังนั้นลงไปค้นหา RWX ที่นี่: 0x036F
อันนี้ RWX ขยายออกไปและดับเบิลคลิกที่นี่ แล้วคุณจะเห็นหน่วยความจำที่นั่น
แล้วคุณจะเปรียบเทียบดูว่ามันเหมือนกัน
ไปที่การถ่ายโอนข้อมูลหน่วยความจำของคุณที่นี่และเปรียบเทียบมัน เอ็มแซด, เอ็มแซด
ไบต์จะเหมือนกัน: E9 97 97 71 00 เป็นต้น
หากเปรียบเทียบทีละไบต์ คุณจะพบว่าทั้งสองเป็นสิ่งเดียวกัน
ดังนั้นนี่คือหน่วยความจำที่ถูกต้องที่จะดัมพ์
จากนั้นคลิกบันทึก แล้วตั้งชื่อใหม่เป็น unpacked_sample ถังขยะแล้วคลิกบันทึก
ก็เป็นเช่นนั้นเอง.
วิธีนี้เป็นตัวอย่างมัลแวร์
และนี่คือทั้งหมดสำหรับวิดีโอนี้
ขอบคุณที่รับชมครับ.