หนึ่งจะไปเกี่ยวกับการอ่านหน่วยความจำจากกระบวนการได้อย่างไร มันแตกต่างจากระบบปฏิบัติการหรือไม่


11

ในฐานะนักพัฒนาเว็บที่มีประสบการณ์ แต่เป็นโปรแกรมเมอร์ "ระดับต่ำ" สามเณรสิ่งนี้เป็นสิ่งที่ฉันยังคงทำขึ้นอยู่

ฉันอยากรู้ว่าจะเริ่มค้นหาบล็อกหน่วยความจำได้อย่างไรแล้วอ่านมัน (เช่นอ่านตัวจับเวลาในเกมของเหมือง)? สิ่งนี้แตกต่างจากเวอร์ชั่น OS / OS หรือไม่?

คำตอบ:


14

นี่เป็นคำถามที่ค่อนข้างยุ่งยากและซับซ้อนในแง่ที่ว่าคุณสามารถทำสิ่งนี้ได้อย่างลึกซึ้ง แต่เพื่อให้สิ่งต่าง ๆ ง่ายขึ้น:

พิจารณาตัวอย่างของ " การอ่านตัวจับเวลาในเกมเหมือง ":

ขั้นตอนแรกคือการหาที่อยู่ในหน่วยความจำ นี้มักจะทำด้วยเครื่องมือที่เรียกว่าแก้ไขหน่วยความจำ (ดีบักจะทำเกินไปในบางกรณี) ซึ่งสามารถใช้วิธีการต่างๆในการหาตำแหน่งของตัวแปรในหน่วยความจำของกระบวนการ วิธีทั่วไปคือการค้นหาค่าบางอย่าง (ตัวอย่างเช่นค่าของตัวจับเวลา) ในพื้นที่หน่วยความจำของกระบวนการเป้าหมายแล้วเปลี่ยนค่าเป้าหมาย (เช่นเลื่อนตัวจับเวลาล่วงหน้า) และค้นหาการจับคู่อีกครั้ง กระบวนการนี้จะทำให้ผู้สมัครลงซ้ำทุกครั้งจนกว่าจะมีตัวแปรที่แน่นอนเหลืออยู่เท่านั้น การระบุที่อยู่ของตัวแปรนั้นภายในพื้นที่หน่วยความจำของกระบวนการเป็นเพียงการคลิกเมาส์ด้วยโปรแกรมแก้ไขหน่วยความจำ

ขั้นตอนที่สองคือการแก้ไขข้อมูลในที่อยู่นั้น วิธีการทำสิ่งนี้ขึ้นอยู่กับระบบปฏิบัติการ สำหรับWindows จะมีการเรียกใช้ WinAPI ชื่อWriteProcessMemoryซึ่งสามารถใช้เพื่อเขียนข้อมูลที่กำหนดไว้ล่วงหน้าไปยังที่อยู่ที่กำหนดภายในพื้นที่หน่วยความจำของกระบวนการเป้าหมาย ในตัวอย่างของเราคุณจะใช้ฟังก์ชั่นนี้เพื่อเขียนทับตัวแปรตัวจับเวลาในกระบวนการเป้าหมายด้วยค่าที่คุณต้องการเปลี่ยนการจับเวลาในเกมได้อย่างมีประสิทธิภาพ

ในทางปฏิบัติคุณจะต้องค้นหาID กระบวนการของกระบวนการเป้าหมายแล้วแนบกระบวนการโกงของคุณเข้ากับกระบวนการเป้าหมายเพื่อให้สามารถปรับเปลี่ยนพื้นที่หน่วยความจำได้ นี่เป็นงานที่ค่อนข้างเล็กน้อย แต่ไม่ได้ช่วยตอบคำถามดังนั้นฉันจึงทิ้งมันไว้เป็นแบบฝึกหัดให้กับผู้อ่าน ;)


ตำแหน่งของตัวแปรจะเหมือนกันทุกครั้งที่กระบวนการทำงานหรือไม่
brunoqc

1
@brunoqc ไม่แน่นอนไม่เกือบ
Dan

2

มันแตกต่างอย่างสิ้นเชิงกับระบบปฏิบัติการ บางอย่างไม่อนุญาตให้คุณทำเลยและคุณต้องรู้วิธีที่ข้อมูลที่คุณต้องการอยู่ในพื้นที่หน่วยความจำของเป้าหมาย

ต่อไปนี้เป็นวิธีดำเนินการบน Linux: /unix/6301/how-do-i-read-from-proc-pid-mem-under-linux


ระบบปฏิบัติการใดที่ไม่อนุญาต ดูเหมือนว่าคุณสามารถทำได้ภายใต้ Linux และ Windows อย่างน้อย
Eva

@Evan ทุกระบบปฏิบัติการต้องอนุญาต (ถูก จำกัด ด้วยเหตุผลด้านความปลอดภัย) หมายถึงการปรับเปลี่ยนหน่วยความจำกระบวนการระยะไกลเพื่อการดีบัก อย่างไรก็ตามโปรดทราบว่าตัวอย่างเช่นสิทธิ์ไม่ตรงกันสำหรับเหตุผลด้านความปลอดภัยอาจทำให้หน่วยความจำกระบวนการไม่สามารถอ่าน / เขียนกระบวนการที่ได้รับสิทธิพิเศษสูงกว่าได้ ตัวอย่างที่ดีของเรื่องนี้คือการไม่ยอมให้กระบวนการที่มีสิทธิ์ของผู้ใช้เกสต์เพื่ออ่าน / เขียนหน่วยความจำของกระบวนการที่มีสิทธิ์ของผู้ดูแลระบบเนื่องจากอาจทำให้ระบบทั้งหมดเสียหายและเป็นวิธีการโดยตรงสำหรับผู้ใช้เกสต์ ระบบ.
zxcdw

1

แอปพลิเคชันได้รับช่วงของหน่วยความจำโดยระบบปฏิบัติการ โดยทั่วไปแอปพลิเคชันจะต้องร้องขอหน่วยความจำ แต่ฟังก์ชันการทำงานนั้นอาจถูกบดบังไปยังโปรแกรมเมอร์เนื่องจากภาษา

ภาษาเช่น C อนุญาตให้มีการบล็อกการร้องขอสำหรับขนาดที่เฉพาะเจาะจงในขณะที่ภาษาอื่น ๆ เช่น C ++, C #, Java newและอนุญาตให้มีการร้องขอผ่านการใช้คำหลักเช่น แต่ละภาษามีหลายวิธีในการจัดสรรหน่วยความจำดังนั้นนี่เป็นเพียงภาพรวมโดยย่อ การปล่อยหน่วยความจำกลับไปที่ OS อาจทำได้อย่างชัดเจนหรือผ่านตัวรวบรวมขยะ

การเข้าถึงหน่วยความจำภายในแอปพลิเคชันขึ้นอยู่กับวิธีการจัดสรร C และ C ++ เป็นที่รู้จักกันดีที่สุดในการใช้แนวคิดของพอยน์เตอร์เพื่อระบุ / ติดตามตำแหน่งของหน่วยความจำ มิฉะนั้นการเข้าถึงหน่วยความจำจะถูกจัดการผ่านคลาสหรือตัวแปรที่สร้างขึ้น

ส่วนใหญ่คุณไม่ต้องกังวลเกี่ยวกับการเข้าถึงหน่วยความจำเฉพาะภายในโปรแกรมของคุณ โครงสร้างภาษาและระบบปฏิบัติการปิดบังอย่างมีประสิทธิภาพซึ่งเกี่ยวข้องกับคุณ

ตัวอย่างตัวจับเวลาในเกมเป็นตัวอย่างที่ยอดเยี่ยมที่คุณไม่ต้องกังวลเกี่ยวกับการจัดสรรหน่วยความจำพื้นฐาน คุณจะมีตัวแปรที่เป็นตัวจับเวลาและคุณเพิ่งอ่านจากตัวแปร

คำตอบของฉันเกี่ยวข้องเมื่อคุณกำลังเขียนแอปพลิเคชันในขณะที่คำตอบของ zxcdw เกี่ยวข้องกับการเข้าถึงหน่วยความจำที่เป็นของแอปพลิเคชันอื่น ข้อกำหนด LMGTFY ของคุณจะเป็น "การแก้ไขข้อบกพร่อง" และ "วิศวกรรมย้อนกลับ" เพื่อเจาะลึกหัวข้อเพิ่มเติม

อ่านเพิ่มเติมบางส่วน:

  • บทความ Wikipedia เกี่ยวกับหน่วยความจำคอมพิวเตอร์จะให้ภาพรวมที่ดีเกี่ยวกับสิ่งต่าง ๆ
  • จากนั้นดูในบทความ Wikipedia เกี่ยวกับI / O ที่จับคู่หน่วยความจำเพื่อทำความเข้าใจกลไกที่ต่อเนื่อง
  • สุดท้ายให้ดูที่บทความเกี่ยวกับหน่วยความจำเสมือนเพื่อรับคำตอบที่ดีกว่าว่าแต่ละระบบปฏิบัติการจะจัดการการแมปหน่วยความจำแตกต่างจากที่อื่นเล็กน้อยอย่างไร

คำตอบที่ดีแม้ว่าในกรณีนี้ฉันกังวลเกี่ยวกับการอ่านหน่วยความจำมากขึ้นจากแอปพลิเคชันที่ฉันไม่ได้เขียนเอง ฉันจะอัปโหลดทันทีที่ฉันมีตัวแทน 15 คน)
Eva

@Evan - อ่านบทความเกี่ยวกับ Virtual Memory อย่างแน่นอน ที่จะช่วยให้คุณเข้าใจการทำแผนที่ได้ดียิ่งขึ้น คุณต้องเข้าใจการทำแผนที่เพื่อเลือกแอพ โปรแกรมดีบั๊กส่วนใหญ่จะอนุญาตให้คุณแนบกับกระบวนการทำงานซึ่งจะช่วยให้คุณดูคำแนะนำและหน่วยความจำของแอปพลิเคชัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.