กู้คืนข้อมูลหน้าในหน่วยความจำจากการไฮเบอร์เนตล้มเหลวในการปลุก


9

Macbook แฟนของฉันเกิดข้อผิดพลาดขณะพยายามกู้คืนจากไฟล์จำศีล แถบความคืบหน้าหยุดการทำงานที่ ~ 10% หลังจากนั้นเรารีสตาร์ทคอมพิวเตอร์เพื่อการเริ่มต้นปกติ

อิมเมจหน่วยความจำจำศีลนี้มีเอกสารที่ไม่ได้บันทึกเปิดอยู่ในหน้าซึ่งเราต้องการกู้คืน มีsleepimageใน/private/var/vmซึ่งฉันคิดว่าเป็นภาพจำศีลซึ่งไม่ได้รับการบูรณะอย่างถูกต้อง เราสำรองข้อมูลนี้ไว้เพื่อให้มีชีวิตอยู่

เราพยายามทำstrings sleepimage | grep known_substringแต่ก็ไม่ทำอะไรเลย grep -a known_substring sleepimageไม่ได้ทำอะไรเลยดังนั้นฉันจึงสมมติว่าหน้าเว็บไม่ได้เก็บข้อมูลข้อความไว้ในหน่วยความจำเป็นข้อความธรรมดา

แก้ไข: หลังจากอ่านคำตอบนี้บนgrep ไบนารี่ฉันพยายามทำperl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(null_padded_substring)/g' sleepimageแล้วไร้ผลอีกครั้ง ฉันเพิ่มด้วย nulls เพื่อพยายามจับคู่ข้อความ UTF-8 จากนั้นฉันลองด้วยความ.*เศร้าโศกระหว่างตัวละครแต่ละตัว - ยังไม่มีลูกเต๋า

ดังนั้นหน้าอาจไม่เก็บข้อความด้วยการเข้ารหัสทั่วไปในหน่วยความจำ ฉันต้องการค้นหากฎการแปลระหว่างสตริง ASCII และการแสดงข้อมูลหน้า - ฉันคิดว่าอาจเป็นบางส่วนของบัฟเฟอร์สตริง Objective C สำหรับฉันดูเหมือนว่าแปลกมากในการจัดเก็บข้อมูลตัวละครเป็นอย่างอื่นนอกเหนือจากลำดับของตัวละคร แต่ดูเหมือนว่านี่เป็นสิ่งที่เพจทำอยู่

หากคุณมีความคิดใด ๆ เกี่ยวกับวิธีการหาการแสดงข้อความในหน่วยความจำภายในหน้าอาจเป็นประโยชน์อย่างมากในการแก้ปัญหานี้ บางทีฉันสามารถถ่ายโอนข้อมูลและอ่านหน่วยความจำกระบวนการด้วยวิธีง่าย ๆ ได้ไหม?

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

เวอร์ชั่น OS X คือ Snow Leopard, 10.6.8

คำแนะนำที่ซับซ้อนเกี่ยวกับการเขียนโปรแกรมยินดีต้อนรับ ฉันทำ C และ Python

ขอบคุณ.


1
หวังว่าคุณจะทำสำเนาของไฟล์นั้นเพื่อให้คุณไม่ต้องตรวจสอบ sleepimage ที่ใหม่กว่าที่เขียนขึ้นหลังจากรีบูต จากนั้นคุณอาจต้องการสร้างสถานการณ์ (โดยไม่มีข้อผิดพลาด) ด้วย RAM ฟรีสูงสุด - เช่นเปิดเฉพาะเพจที่เขียนข้อความที่ไม่ซ้ำและให้ระบบปฏิบัติการเขียน sleepimage ใหม่ จากนั้นเริ่มตรวจสอบข้อความที่ไม่ซ้ำกันของคุณ
iolsmit

@iolsmit sleepimageใช่การทดสอบทั้งหมดจะมีขึ้นในสำเนาของ การเลื่อนดูรูปภาพอื่นที่กำลังมองหาข้อความที่ไม่เหมือนใครคงเป็นเรื่องยากเนื่องจากรูปภาพจะมีขนาด 4GB และบล็อกหน่วยความจำหน้าจะถูกจัดสรรแบบสุ่มในไฟล์นั้น ฉันคิดว่าฉันสามารถ RAM เป็นศูนย์จากนั้นเปิดหน้าแล้วมองหาลำดับที่ไม่เป็นศูนย์ใน sleepimage แต่หน้าจะกินหน่วยความจำมากถึง 200MB โดยไม่คำนึงว่ายังคงมีเข็มขนาดเล็กอยู่ในกองหญ้า
sapht

ข้อความของคุณถูกจัดเก็บด้วย 0x00 อยู่ระหว่างอักขระแต่ละตัวดังนั้นคุณต้องค้นหาข้อความนั้นหรือสำหรับสตริงนี้: loobsdpkdbik; ดูคำตอบของฉันด้านล่าง
iolsmit

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

@ รุ่น bmike มาพร้อมกับ Lion เท่านั้น แต่เครื่องนั้นอยู่ใน Snow Leopard (10.6.8) และฉันจำได้ว่าสูญเสียการทำงานไปเล็กน้อยเนื่องจาก iWork หยุดทำงานบน SL และไม่มีการบันทึกอัตโนมัติ ...
iolsmit

คำตอบ:


1

อัปเดตด้วยรูปภาพ:

  • ที่loobsdpkdbikระบุกล่าวถึงครั้งแรกที่ไม่ได้เป็นหนึ่ง - เพียงแค่ happend จะเป็นก่อนที่ข้อความของฉันเวลากำปั้นฉันพยายามมัน

  • ดูเหมือนว่าส่วนหนึ่งของข้อความจะ "หลงทาง" (เช่นไม่ได้บันทึกในการยืดหน่วยความจำอย่างต่อเนื่อง) และสิ่งนี้อาจแย่ลงเมื่อใช้ RAM

  • คุณอาจไม่สามารถกู้คืนข้อความที่มีความหมายจาก sleepimage

ตอนนี้ข้อความต้นฉบับของฉัน (มีการพิมพ์ผิดในวรรคที่ 1, นาย Matisse sry):

อัญมณีที่ซ่อนอยู่: สวนประติมากรรม Abby Aldrich Rockefeller ซึ่งออกแบบโดย Philip Johnson ในปี 2496 เป็นโอเอซิสในเมืองที่น่าตื่นตาตื่นใจพร้อมสระว่ายน้ำที่สะท้อนและภูมิทัศน์ที่สวยงาม แกลเลอรีกลางแจ้งนี้ได้รับการติดตั้งด้วยการจัดแสดงประติมากรรมกลางแจ้งรวมถึงผลงานของ Aristide Maillol, Alexander Calder, Henri Maisse, Pablo Picasso และ Richard Serra

ในขณะที่เยี่ยมชมหอศิลป์จิตรกรรมและประติมากรรมใหม่ที่ MoMa อย่าลืมสำรวจบันไดที่เชื่อมระหว่างชั้นที่สี่กับห้าเพื่อชมภาพลักษณ์แห่งความสุขและพลังงานอันน่าทึ่งของ Henri Matisse Dance (1909) เดิมทีภาพวาดตั้งใจจะแขวนในห้องโถงบันไดของพระราชวังรัสเซียในมอสโก

และข้อความที่กู้คืน:

อัญมณีที่ซ่อนอยู่: แอ๊บบี้อัลริช Rockeller Sculpre Gn, desigd โดย Phip John 1953 เป็นสระว่ายน้ำที่สวยงามตระการตา แกลเลอรีกลางแจ้งนี้ได้รับการเปลี่ยนแปลงด้วยการจัดแสดง outor sculpre รวมถึงการทำงานของ Aristide Maillol, Alexander Calder, Henri Maisse, Pabloicasso, Anchard Sea

ในขณะที่กำลังขว้างปาแกลลอรี่รูปปั้นใหม่ที่ Ma จงแน่ใจว่าได้สำรวจเส้นทางที่เต็มไปด้วยความสนุกและความสนุกจาก Dan (19) ภาพวาดนั้นมีความสูงชันไปจนถึงห้องโถงบันไดของพระราชวัง Rsian กรุงมอสโก

และภาพหน้าจอ:

ข้อความต้นฉบับในหน้า

กู้คืนข้อความจาก sleepimage


ดูเหมือนว่าการ (ที่ไม่ได้บันทึก) หน้าเอกสาร (เกือบ) ทุกตัวอักษรในข้อความของคุณจะถูกแยกจากกันโดย0x00ในหน่วยความจำ - จึง STRINGกลายเป็นS.T.R.I.N.Gมีความเป็นอยู่. 0x00ดังนั้นคุณต้องค้นหามัน ฉันสามารถแนะนำ0xEDสำหรับส่วนหน้าแบบกราฟิก ... .. หรือคุณค้นหาloobsdpkdbikซึ่งดูเหมือนจะเป็น (ส่วนหนึ่งของ) ตัวระบุซึ่งมา 5 ไบต์ก่อนข้อความ (อย่างน้อยก็ในกรณีเดียว)


อืมฉันค้นหา "loobsdpkdbik" แต่ยังว่างอยู่ ตัวระบุนี้ปรากฏต่อหน้าเอกสารที่ไม่ได้บันทึกทุกชุดหรือไม่ บางทีมันอาจหมายถึงบางสิ่งเกี่ยวกับเอกสาร - เช่นการสืบทอดหน้าต่าง, ฟอนต์เริ่มต้น, ฯลฯ ... ฉันค้นหาสตริง null-padded โดยใช้ Perl ก่อนหน้านี้คือs\0u\0b\0s\0t\0r\0i\0n\0gไม่ทำงานคำอธิบายเพิ่มเติมอยู่ในคำถามเดิมของฉัน โอ - คุณค้นพบสิ่งนี้ได้อย่างไร
sapht

@sapht ฉันอัปเดตคำตอบของฉัน; ดูเหมือนว่าข้อความจะไม่ถูกเก็บไว้ในหน่วยความจำต่อเนื่องซึ่งอาจทำให้ไม่สามารถกู้คืนจาก sleepimage ได้ และ "loobsdpkdbik" ไม่เกี่ยวข้องกับเอกสารหน้าเพียงแค่ดีใจที่ได้อยู่ก่อนข้อความของฉัน
iolsmit

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

@sapht หาก sleepimage ของคุณไม่เสียหายควรมีข้อความเต็มของเอกสาร Pages - เนื่องจากการเรียกคืน RAM จะทำให้ระบบอยู่ในตำแหน่งที่ระบบจำศีลอยู่ ฉันขอแนะนำให้ลองใช้ sleepimage ในเครื่องเสมือน: ติดตั้ง OS X ที่รองรับในเครื่องเสมือน (หรือใช้VMware fusion 4.1 ;) - จากนั้นโคลนเครื่องของคุณกับ HDD เสมือนและลองบูตจาก sleepimage
iolsmit

2

ลองครั้งแรกถ้า IF__string WAS ถูกเก็บไว้ในข้อความล้วน (ไม่ใช่ตัวพิมพ์)

ฉันคิดว่าคุณสามารถลองใช้

grep -Ubo --binary-files=text "known_substring" sleepimage 

จากนั้นพารามิเตอร์ -U ระบุการค้นหาในไฟล์ไบนารี -b ระบุว่าอ็อฟเซ็ตเป็นไบต์ไปยังส่วนที่ตรงกันควรแสดงและสุดท้าย - o ระบุว่าควรพิมพ์เฉพาะส่วนที่ตรงกัน

หากใช้งานได้คุณจะรู้ว่าอ็อฟเซ็ตเป็นไบต์เพื่อไปยังภูมิภาคนั้น แต่ฉันไม่รู้ว่าจะไปที่นั่นได้อย่างไร ขึ้นอยู่กับชนิดของไฟล์คุณอาจตรวจสอบลายเซ็นของไฟล์ที่อยู่ใกล้กับออฟเซ็ตที่แจ้งและพยายามแยกเฉพาะไบต์ที่ทำส่วนของไฟล์นั้น สำหรับสิ่งนี้ฉันคิดว่าคุณสามารถเขียนโปรแกรม C เพื่อทำสิ่งนั้นหรืออาจดำเนินการhexdump -s known_offset sleepimageแล้วลองรับเฉพาะไบต์ที่เกี่ยวข้องกับไฟล์ที่คุณต้องการ

ตัวอย่างเช่นสมมติว่าฉันต้องการรู้บางอย่างเกี่ยวกับ Chrome:

$ sudo grep -Ubo --binary-files=text -i "chrome" sleepimage
3775011731:chrome

ดังนั้นฉันรู้ว่าฉันได้เกิดโครเมี่ยมที่ byte offset 3775011731 ดังนั้นฉันสามารถ:

$ sudo hexdump -s 3775011731 sleepimage | head -n 3
e1021b93 09 09 3c 73 74 72 69 6e 67 3e 2e 63 68 72 6f 6d
e1021ba3 65 2e 67 6f 6f 67 6c 65 2e 63 6f 6d 3c 2f 73 74
e1021bb3 72 69 6e 67 3e 0a 09 09 3c 6b 65 79 3e 45 78 70

ส่วนที่ยุ่งยากจะได้รับเฉพาะไบต์ที่คุณต้องการ หากประเภทไฟล์มีส่วนหัวที่รู้จักคุณอาจลบขนาดส่วนหัวเป็นไบต์จาก hexdump offset เพื่อให้คุณได้รับไฟล์ "ตั้งแต่เริ่มต้น" หากประเภทไฟล์มีลายเซ็น "EOF" ที่เป็นที่รู้จักกันคุณสามารถลองค้นหาด้วยเช่นกันและจะได้รับเฉพาะไบต์จนถึงจุดนั้น

ประเภทไฟล์ของคุณคืออะไร? คุณคิดว่าสามารถใช้วิธีการเช่นนี้ในกรณีของคุณหรือไม่? โปรดทราบว่าฉันไม่เคยทำสิ่งนี้มาก่อนและฉันกำลังใช้ตัวเองกับ "เดา" มากมาย แต่ฉันคิดว่าบางอย่างเช่นนี้มีโอกาสน้อยที่จะทำงาน ..

ลองครั้งที่สองเป็นวิธีที่ช้าสำหรับการแยกวิเคราะห์ไบต์ทั้งหมด

วิธีการก่อนหน้านี้ไม่ทำงานเพราะมันยังค้นหาเฉพาะข้อความธรรมดาเดิมพันของฉัน สำหรับข้อความที่สองนี้ฉันได้สร้างโปรแกรม C อย่างง่ายที่มี:

#include <stdio.h>

int main () {
  printf("assim");
  return 0;
}

ดังนั้นฉันสามารถค้นหา "assim" ซึ่งจะเป็นที่รู้จักของคุณ string ในข้อความนั้น เพื่อให้รู้ว่าฉันต้องค้นหาไบท์อะไร:

$ echo -n "assim" | hexdump
0000000 61 73 73 69 6d                                 
0000005

ดังนั้นฉันต้องค้นหา "61 73 73 69 6d" หลังจากรวบรวมซอร์ส C อย่างง่ายนั้นลงในโปรแกรม "tt" ฉันทำสิ่งต่อไปนี้:

hexdump -v -e '/1 "%02X\n"' tt | # format output for hexdump of file tt
    pcregrep -M --color -A 3 -B 3 "61\n73\n73\n69\n6D" # get 3 bytes A-fter and 3 bytes B-fore the occurence

ซึ่งกลับมาให้ฉัน:

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณทำสิ่งนี้ฉันคิดว่าคุณจะได้รับข้อมูลของคุณ .. มันจะช้าในการแยก 2 ~ 8GBs ไบต์ ...

โปรดทราบว่าในวิธีการนี้คุณต้องค้นหา hexes ในอักษรตัวใหญ่ (เขียน 6D แทนที่จะเป็น 6d บน grep ตัวสุดท้าย) ไม่ใช่ตัวอักษรตัวพิมพ์เล็กและใช้ \ n แทน white-space (เพื่อให้คุณสามารถใช้ -A และ - B สำหรับ grep) คุณสามารถใช้grep -iเพื่อให้มันกลายเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แต่มันจะช้าลงเล็กน้อย ดังนั้นเพียงแค่ใช้ตัวพิมพ์ใหญ่หากมีการใช้

หรือถ้าคุณต้องการ "สคริปต์" อัตโนมัติทั้งหมด:

FILENAME=tt # file to parse looking for string
BEFORE=3 # bytes before occurrence
AFER=3 # bytes after occurrence
KNOWNSTRING="assim" # string to search for

ks_bytes="$(echo -n "$KNOWNSTRING" | hexdump | head -n1 | cut -d " " -f2- | tr '[:lower:]' '[:upper:]' | sed -e 's/ *$//g' -e 's/ /\\n/g')"

hexdump -v -e '/1 "%02X\n"' $FILENAME | pcregrep -M --color -A $AFER -B $BEFORE $ks_bytes

ข้อความถูกเก็บไว้ในหน่วยความจำเท่านั้นเนื่องจากไม่เคยบันทึกไฟล์ ดังนั้นจึงไม่มีประเภทไฟล์จริงเพียงประเภทของการแสดงให้เห็นว่าหน้าจะเก็บข้อมูลภายใน การส่งผ่าน-Uไปgrepดูเหมือนจะไม่สร้างความแตกต่างมากนัก ( aสั้นสำหรับ--binary-files=text) หากฉันมีออฟเซ็ตไบต์ฉันสามารถดำเนินการต่อได้ แต่ไฟล์อาจเสียหายหรือ Pages กำลังจัดเก็บข้อมูลในแบบที่ไม่ใช่ ASCII อาจเป็น UTF-8 แต่grepจะไม่ยอมรับไบต์ว่างสำหรับอักขระที่ตรงกัน
sapht

ฉันแก้ไขโพสต์ด้วยความพยายามอีกครั้ง .. ดูเหมือนว่าจะทำงาน .. แต่ช้ามากและคุณจะต้อง "เดา" ว่าคุณต้องการจำนวนไบต์ก่อนและหลังการที่รู้จักกันเป็นรู้จัก หมายเหตุ: เมื่อฉันecho -n "assim" | hexdumpได้รับ hexdump สำหรับการเข้ารหัส UTF-8 คุณสามารถลองecho -n "assim" | iconv -t UTF-16 | hexdumpการเข้ารหัสอื่น ๆ UTF-16 ในกรณีนี้ฉันไม่มี Idead เกี่ยวกับวิธีการจัดเก็บในหน่วยความจำ .. แต่ในกรณีของฉันมันถูกเก็บไว้ ในฐานะที่เป็น UTF-8 แน่นอน :)
FernandoH

อืมอืม hex hex สำหรับโปรแกรม C ของคุณพิมพ์ข้อความเพราะมันถูกฝังอยู่ใน binary - gcc คอมไพล์ในแบบนั้นเพื่อให้บัฟเฟอร์ตัวอักษรแบบคงที่ทั้งหมดถูกเก็บไว้ในโปรแกรมสำหรับการอ้างอิงในหน่วยความจำ แต่สำหรับหน้าที่สร้างข้อมูลที่ runti e ฉันอัปเดตคำตอบของฉันด้วยการจับคู่ใหม่ที่ฉันลองผ่าน Perl ซึ่งไร้ผลดังนั้นฉันค่อนข้างมั่นใจว่าข้อความนั้นถูกเก็บไว้ในลักษณะที่ไม่ได้มาตรฐานแปลก ๆ เนื่องจากไบต์ ASCII ไม่เหมือนกัน บางทีบางวัตถุประสงค์สตริง C บัฟเฟอร์ ...
sapht

Hummm .. ถ้าคุณลองค้นหาสตริง "Pages.app" แทนล่ะ ฉันไม่ทราบว่าจะดำเนินการต่ออย่างไรหากพบสิ่งใด (เช่นแอปของคุณคืออะไรและเอกสารของคุณคืออะไร) แต่ถ้าเราต้องคอยติดตามความคิดนี้อาจเป็นจุดเริ่มต้นของการลอง แม้ว่าฉันต้องยอมรับว่าจะต้องมีทางเลือกที่ง่ายกว่านี้ แต่มันก็เป็นเรื่องที่ลำบากมาก
FernandoH

จริงๆแล้วคุณจำชิ้นส่วนจากไฟล์ Papers ได้หรือไม่? แม้ว่ามันจะถูกเก็บไว้ในหน่วยความจำหากคุณรู้ว่ามีประโยคที่ถูกเขียนอยู่ที่นั่น (ถ้าคุณจำได้หรือถ้าคุณมีไฟล์รุ่นก่อนหน้า) คุณสามารถลองค้นหาสิ่งเหล่านี้ได้โดยตรง! มันจะง่ายกว่านี้มากฉันเดาว่า :) และเนื่องจาก Pages เป็นโปรแกรมแก้ไขคำฉันคิดว่าคุณต้องการกู้คืนสิ่งที่เขียนใช่ไหม หากเป็นกรณีนี้ให้ค้นหาเนื้อหาแทนที่จะเป็นข้อมูลเมตามันอาจจะง่ายกว่านี้ .. ฉันหวังว่าอย่างน้อย ..
FernandoH
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.