เหตุใดที่อยู่ PE ImageBase จึงเปลี่ยนไปในหน่วยความจำ
ฉันกำลังย้อนกลับไฟล์ปฏิบัติการ Windows x86 32 บิตที่เป็นอันตราย ตรวจสอบส่วนหัว PE ใน Ghidra แบบคงที่ฉันเห็นว่าImageBase
ตั้งค่า0x400000
เป็นตามที่คาดไว้ อย่างไรก็ตามเมื่อไบนารีถูกโหลดลงในหน่วยความจำ RVA เริ่มต้นจะไม่ตรงกับที่ImageBase
กำหนดไว้ในไฟล์ ตัวอย่างเช่นผมได้เห็นในหน่วยความจำชุดที่อยู่ฐานและ0x4B0000
0x900000
ลักษณะการทำงานนี้เกิดขึ้นบน VM ที่สะอาดและเมื่อทำการดีบักด้วย Immunity และ x32dbg รวมทั้ง IDA Free
ความเข้าใจของฉันคือตัวโหลดของ Windows อ่านImageBase
และใช้ออฟเซ็ตนั้นเพื่อเริ่มการแมปส่วนต่างๆลงในพื้นที่ที่อยู่เสมือน เนื่องจากรหัสระบบจัดการกับการโหลดและระบบของฉันสะอาดเมื่อดำเนินการครั้งแรกข้อสันนิษฐานของฉันคือสิ่งที่ผิดปกติImageBase
เป็นอาการของความแตกต่างกันเล็กน้อยของตัวโหลดมากกว่าการปลอมแปลง ฉันไม่เคยพบสถานการณ์นี้และขอขอบคุณข้อมูลเชิงลึกใด ๆ
MD5: 1f63d04ee95ea041f2f6b1e818d94a7c
SHA1: 823ad6abb05f2393c44cf4b7f1d00e32ac04d1d1
ImageBase
ตั้งค่าเป็น0x400000
เมื่อดูส่วนหัว PE ใน Ghidra:

ImageBase
ในส่วนหัว PE ที่แมปหน่วยความจำ ( 0x4B0000
) ไม่ตรงกับImageBase
ชุดในไฟล์คงที่:

ส่วน PE ที่แมปลงในหน่วยความจำด้วยImageBase
at0x4B0000

คำตอบ
นี่เป็นเพียงที่อยู่ที่ต้องการ Windows สามารถโหลดไบนารีได้เกือบทุกที่อยู่และตั้งฐานใหม่ไปยังตำแหน่งใหม่นี้
ImageBase: แอดเดรสที่ต้องการของไบต์แรกของรูปภาพเมื่อโหลดลงในหน่วยความจำ ต้องเป็นผลคูณ 64 K ค่าเริ่มต้นสำหรับ DLL คือ 0x10000000 ค่าเริ่มต้นสำหรับ Windows CE EXE คือ 0x00010000 ค่าเริ่มต้นสำหรับ Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98 และ Windows Me คือ 0x00400000
ที่มา: MSDN