क्या एक अदद बैकअप निर्मित फ़ाइल को अंदर देखने और संशोधित करने का एक तरीका है?


40

मैंने अपने गैलेक्सी नेक्सस का बैकअप बनाया है adb backup। परिणामी फ़ाइल का नाम backup.db है और यह किसी भी तरह एन्क्रिप्टेड है।

मैं बैकअप को पुनर्स्थापित करना चाहता था, लेकिन जब यह बहाल करने की बात आती है तो यह रुक जाता है com.android.providers.contacts। मैं adb logcatपता लगाता था कि क्या चल रहा है और पता चला कि com.android.acoreपुनर्स्थापना प्रक्रिया के दौरान दुर्घटनाग्रस्त हो गया।

मैं बैकअप में डेटा तक पहुंच प्राप्त करना चाहता हूं और अपने फोन पर वापस सब कुछ बहाल करने के लिए संपर्क डेटाबेस को हटा देना चाहता हूं। क्या बैकअप से डेटा को पुनर्स्थापित करने के कोई अन्य तरीके हैं?

जवाबों:


14

फ़ाइल तब तक एन्क्रिप्ट नहीं की जाती है, जब तक कि बैकअप बनाते समय आपका निर्दिष्ट न हो। यह हालांकि संपीड़ित है (अपस्फीति का उपयोग करके)। आप एंड्रॉइड स्रोत (कॉम / एंड्रॉइड / सर्वर / BackupManagerService.java) कोड को देखकर सटीक प्रारूप का पता लगा सकते हैं, और, तकनीकी रूप से, इसमें से विशिष्ट डेटा निकालने में सक्षम होना चाहिए। हालाँकि, IIRC, कुछ फ़ाइल अखंडता जांच जगह पर हैं, इसलिए यह संभवतया काम नहीं करेगा यदि आप इससे केवल डेटा का एक गुच्छा हटाते हैं। दुर्भाग्य से restoreकमांड के पास किसी विशेष ऐप / पैकेज को पुनर्स्थापित करने या पैकेज को बाहर करने का विकल्प नहीं है।


धन्यवाद! यह कम से कम फ़ाइल के अंदर देखने के लिए एक प्रारंभिक बिंदु है। अगर मैंने बैकअप के लिए पासवर्ड नहीं दिया होता तो यह आसान होता।
इंगोराइटर

यदि आपने एक पासवर्ड प्रदान किया है, तो यह वास्तव में एन्क्रिप्टेड है। `BackupManagerService 'में वास्तविक एन्क्रिप्शन एल्गोरिदम पर विवरण हैं, और कुंजी व्युत्पत्ति पैरामेट्स (नमक, पुनरावृत्ति गणना आदि) फ़ाइल हेडर में लिखे गए हैं। चूंकि आप पासवर्ड जानते हैं, आप कुंजी को प्राप्त कर सकते हैं और डेटा को डिक्रिप्ट कर सकते हैं। इसलिए यह अभी भी

हां, मैं वर्तमान BackupManagerServiceमें बैकअप फ़ाइल की सामग्री को पढ़ने के लिए सब कुछ निकाल रहा हूं । यह काम का एक अच्छा राशि है, लेकिन मैं अपने डेटा को वापस ... की जरूरत है
ingorichter

@ingorichter कोई प्रगति?
जॉन

@ingorichter मैंने इस पर काम करना शुरू कर दिया और "सामुदायिक विकि" उत्तर में, नीचे एक टन के नोट पोस्ट किए। इसे जोड़ने के लिए स्वतंत्र महसूस करें।
जॉन

50

मैंने इस पर काम करना शुरू कर दिया। मैं अपने परिणामों को यहां दो कारणों से "समुदाय विकि" उत्तर के रूप में पोस्ट कर रहा हूं: पहला, यदि कोई और व्यक्ति इसमें शामिल होना चाहता है, तो बात करने के लिए एक जगह है; दूसरा, अगर मैं इस परियोजना से दूर हो जाता हूं, तो किसी और के लिए काम शुरू करने के संकेत मिलेंगे।

 

होस्ट पर बैकअप लॉजिक पूरी तरह से https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp नाम के फ़ंक्शन में निहित है backup। फ़ंक्शन बहुत सरल है: यह कमांड लाइन विकल्पों को मान्य करता है, कमांड को ज्यादातर फोन पर एडीबी डेमन को भेजता है, और फोन के आउटपुट को फाइल पर लिखता है। यहां तक ​​कि त्रुटि-जाँच भी नहीं है: यदि, उदाहरण के लिए, आप फोन पर बैकअप से इनकार करते adbहैं , तो बस एक खाली फ़ाइल लिखता है।

फोन पर, बैकअप तर्क https://github.com/android/platform_system_core/blob/master/adb/services.cppservice_to_fd() में शुरू होता है । फ़ंक्शन यह पहचानता है कि होस्ट से कमांड है , और अनपर्सड कमांड को पास करता है , जो कि एक नई एंड्रॉइड ऐप प्रक्रिया के मुख्य-वर्ग के रूप में लॉन्च करने के लिए एक तुच्छ शेल स्क्रिप्ट है । वह कॉल को बैकअप सेवा के रूप में प्राप्त करता है , और कॉल करता है , इसे अभी भी अप्रयुक्त फ़ाइल डिस्क्रिप्टर (बहुत अप्रत्यक्ष रूप से) होस्ट पर फ़ाइल से जुड़ा हुआ है ।"backup"/system/bin/bucom.android.commands.bu.BackupServiceManager.getService("backup")IBackupManagerIBackupManager.fullBackup()backup.ab

Com.android.server.backup.BackupManagerServicefullBackup() में नियंत्रण पास होता है , जो GUI को पॉपअप करता है जो उपयोगकर्ता को बैकअप की पुष्टि / अस्वीकार करने के लिए कहता है। जब उपयोगकर्ता ऐसा करता है, acknowledgeFullBackupOrRestore()(उसी फ़ाइल को) कहा जाता है। यदि उपयोगकर्ता ने अनुरोध को मंजूरी दे दी है, acknowledgeFullBackupOrRestore()यदि बैकअप एन्क्रिप्ट किया गया है, तो आंकड़े बताए जाते हैं और BackupHandler(उसी फ़ाइल पर) संदेश BackupHandlerभेजते हैं, फिर एक ही समय में एक ही फ़ाइलPerformAdbBackupTask ( 400 फ़ाइल, लाइन 4004 ) को बंद कर देते हैं और लिखते हैं)

हम अंत में PerformAdbBackupTask.run()लाइन 4151 और लाइन 4330 के बीच, वहां आउटपुट जेनरेट करना शुरू करते हैं

सबसे पहले, run()एक हेडर लिखता है, जिसमें 4 या 9 ASCII लाइनें होती हैं:

  1. "ANDROID BACKUP"
  2. बैकअप प्रारूप संस्करण: वर्तमान में "4"
  3. या "0"तो बैकअप असम्पीडित है या "1"यदि यह है
  4. एन्क्रिप्शन विधि: वर्तमान में या तो "none"या"AES-256"
  5. (यदि एन्क्रिप्ट किया गया है), "उपयोगकर्ता पासवर्ड नमक" हेक्स में एन्कोडेड है, सभी कैप्स
  6. (यदि एन्क्रिप्ट किया गया है), "मास्टर कुंजी चेकसम नमक" हेक्स में एन्कोडेड है, सभी कैप
  7. (यदि एन्क्रिप्ट किया गया है), "पीकेकेडीएफ 2 राउंड की संख्या" का उपयोग दशमलव संख्या के रूप में किया जाता है: वर्तमान में "10000"
  8. (अगर एन्क्रिप्ट किया गया है), "उपयोगकर्ता कुंजी का IV" हेक्स में एन्कोडेड है, सभी कैप्स
  9. (यदि एन्क्रिप्ट किया गया है), "मास्टर IV + कुंजी बूँद, उपयोगकर्ता कुंजी द्वारा एन्क्रिप्ट किया गया" हेक्स में एन्कोडेड, सभी कैप्स

वास्तविक बैकअप डेटा के रूप में (संपीड़न और एन्क्रिप्शन के आधार पर), इस प्रकार या तो tar, deflate(tar), encrypt(tar), या encrypt(deflate(tar))

 

TODO : वह कोड पथ लिखें जो टार आउटपुट उत्पन्न करता है - आप केवल टार का उपयोग कर सकते हैं जब तक कि प्रविष्टियाँ उचित क्रम में हैं (नीचे देखें)।

टार संग्रह प्रारूप

ऐप डेटा को ऐप / निर्देशिका के तहत संग्रहीत किया जाता है, एक _manifest फ़ाइल, एपीके (यदि अनुरोध किया गया है) के साथ शुरू होता है, / में ऐप फाइलें, डीबी में डेटाबेस / और / में साझा प्राथमिकताएं। यदि आपने बाह्य संग्रहण बैकअप (-sared विकल्प का उपयोग करके) का अनुरोध किया है, तो संग्रह में एक साझा / निर्देशिका भी होगी जिसमें बाह्य संग्रहण फ़ाइलें होंगी।

$ tar tvf mybackup.tar
-rw------- 1000/1000      1019 2012-06-04 16:44 apps/org.myapp/_manifest
-rw-r--r-- 1000/1000   1412208 2012-06-02 23:53 apps/org.myapp/a/org.myapp-1.apk
-rw-rw---- 10091/10091     231 2012-06-02 23:41 apps/org.myapp/f/share_history.xml
-rw-rw---- 10091/10091       0 2012-06-02 23:41 apps/org.myapp/db/myapp.db-journal
-rw-rw---- 10091/10091    5120 2012-06-02 23:41 apps/org.myapp/db/myapp.db
-rw-rw---- 10091/10091    1110 2012-06-03 01:29 apps/org.myapp/sp/org.myapp_preferences.xml

एन्क्रिप्शन विवरण

  1. एक एईएस 256 कुंजी बैकअप एन्क्रिप्शन पासवर्ड से उत्पन्न होती है जो पीबीकेडीएफ 2 के 10000 राउंड का उपयोग करके यादृच्छिक रूप से उत्पन्न 512 बिट नमक के साथ होता है।
  2. एईएस 256 मास्टर कुंजी यादृच्छिक रूप से उत्पन्न होती है
  3. एक मास्टर कुंजी 'चेकसम' को PBKDF2 के 10000 राउंड के माध्यम से मास्टर कुंजी को चलाकर एक नया बेतरतीब ढंग से उत्पन्न 512% नमक के साथ बनाया जाता है।
  4. एक यादृच्छिक बैकअप एन्क्रिप्शन IV उत्पन्न होता है।
  5. IV, मास्टर कुंजी, और चेकसम को 1. में व्युत्पन्न कुंजी के साथ समाहित और एन्क्रिप्ट किया गया है। परिणामी बूँद को हेक्स स्ट्रिंग के रूप में हेडर में सहेजा जाता है।
  6. वास्तविक बैकअप डेटा मास्टर कुंजी के साथ एन्क्रिप्ट किया गया है और फ़ाइल के अंत में संलग्न है।

नमूना पैक / अनपैक कोड कार्यान्वयन (निर्माण / उपयोग करता है) टार अभिलेखागार: https://github.com/nelenkov/android-backup-extractor

कुछ और विवरण यहां: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html

पैकिंग / अनपैकिंग और टूटे हुए अभिलेखों को ठीक करने के लिए पर्ल स्क्रिप्ट:

http://forum.xda-developers.com/showthread.php?p=27840175#post27840175


यदि आप कहीं कोड डालते हैं, तो मैं इसमें शामिल हो सकता हूं। ओपी (@ngorichter) के पास शायद अब तक कुछ काम करने वाला कोड है :) एक उपयोगिता जो वास्तविक फ़ाइलों को डिकम्प्रेस करती है और निकालती है, उपयोगी हो सकती है, ताकि आप केवल भागों को पुनर्स्थापित कर सकें (यदि आपके पास निश्चित रूप से रूट है)।
निकोले एलेनकोव

1
एन्क्रिप्शन भाग के रूप में, मुझे इसे विवरण के लिए देखना है, लेकिन कुंजी नमक और डिवाइस अनलॉक पिन, पासवर्ड या पैटर्न (स्ट्रिंग में परिवर्तित) द्वारा पीबीकेडीएफ 2 का उपयोग करके ली गई है। मास्टर कुंजी यादृच्छिक रूप से उत्पन्न होती है, और पासवर्ड-व्युत्पन्न कुंजी के साथ एन्क्रिप्ट की जाती है। पहले अनएन्क्रिप्टेड अभिलेखागार के लिए काम करने के लिए इसे प्राप्त करें। अगर आप इससे परेशान हो रहे हैं तो मैं डिक्रिप्शन भाग को लागू कर सकता हूं।
निकोले एलेनकोव

क्षमा करें, कुंजी वास्तव में बैकअप शुरू करते समय आपके द्वारा निर्दिष्ट पासवर्ड के आधार पर निकाली गई है।
निकोले एलेनकोव

@NikolayElenkov मेरे पास अभी तक कोई कोड नहीं है, लेकिन मैं एब फ़ाइलों में हेरफेर करने के लिए एक उपयोगिता लिखने पर योजना बनाता हूं। राइट एन्क्रिप्शन, मुझे नहीं लगता कि यह मुश्किल होगा; यह सिर्फ इतना है कि मैंने केवल कोड के उस हिस्से को देखा है। इसी तरह, मैंने कोड पथ का पता लगाया है (अभी तक ऊपर नहीं लिखा गया है) जो टार स्ट्रीम उत्पन्न करता है, लेकिन अभी तक यह नहीं जांचा गया है कि वास्तविक प्रारूप GNT टार है।
जॉन

वाह, मैं आपके विश्लेषण से प्रभावित हूं। मैंने एक साधारण ग्रूवी स्क्रिप्ट में BackupManagerService से कुछ कोड निकाले, लेकिन जब मैं प्रोग्राम चलाता हूं तो परिणाम हमेशा एक ही होता है: गलत पासवर्ड दर्ज! मैंने एक सरल पासवर्ड के साथ एक नया बैकअप बनाया, लेकिन पासवर्ड सत्यापन फिर से विफल हो गया। वर्तमान में मैं अपनी गलती को खोजने के लिए ऊपर वर्णित कार्यक्रम का पालन करने की कोशिश करता हूं।
इनगोरिचर

7

निकोले एलेनकोव का शानदार और विस्तृत जवाब । हालाँकि मुझे यह जोड़ना चाहिए कि कोई व्यक्ति पहले से ही ऐसा सॉफ़्टवेयर विकसित कर रहा है जो बस यही करता है और उसे यहाँ पैकेज करता है: http://sourceforge.net/projects/adbextractor/

पैकेज में जावा और पर्ल टूल दोनों हैं। मैं स्वयं किसी भी दिन जावा पर पर्ल पसंद करता हूं, इसलिए मैंने पर्ल कोड निकाले, सुनिश्चित करें कि वे निष्पादन योग्य हैं, आवश्यक पर्ल लाइब्रेरी को स्थापित किया है, और backupdecrypt.plएक अदद बैकअप फ़ाइल के खिलाफ चलाया है , और यह इसे टार या गज़्ड टार फ़ाइल में परिवर्तित करता है। मुद्दा।

मैंने बैश 3 में एक लाइनर भी बनाया, जो मुझे सीधे gzipped टार फाइल में adb बैकअप करने की अनुमति देता है:

adb backup -f >(backupdecrypt.pl -D -z - backup.tgz) -all

आशा करता हूँ की ये काम करेगा।


6
हाँ, उन्होंने उपकरण (जावा एक) जो मैंने लिखा था :) मैंने पर्ल को भी पोर्ट करने में मदद की। यदि आपने README को नहीं पढ़ा है, तो यह तुरंत स्पष्ट नहीं हो सकता है कि राइटअप पहले आया था, फिर उपकरण ....
निकोले एलेनकोव

मैंने बैकअप लिया है, लेकिन उसने .ab फ़ाइल नहीं बनाई है, इसके बजाय उसने .backup फ़ाइल बनाई है। मैं यह जानना चाहता हूं कि इसे कैसे निकालना है। इसके अलावा, मुझे यकीन नहीं है कि क्या इसने सभी तस्वीरों और वीडियो का बैकअप लिया है?
हजीराज़िन

-4

मौजूदा बैकअप फ़ाइल का पता लगाने के लिए, http://www.adb-backup.com पृष्ठ देखें, यह "dd", "टार", के बिना सरल है ...

इस सर्वर पर डेटा संग्रहीत नहीं है। मैंने dd / tar के साथ छेड़छाड़ या अतिरिक्त सॉफ़्टवेयर स्थापित किए बिना बैकअप को देखने में आसान बनाने के लिए यह ऑनलाइन सेवा विकसित की है। मैं लेखक हूँ www.adb-backup.com


7
मैं एक बेतरतीब वेबसाइट पर एक एडीबी बैकअप (और पासवर्ड प्रदान करने) को अपलोड करने के बारे में बहुत सावधान रहूंगा ... एडीबी बैकअप में शामिल डेटा निजी है और आपके पास यह जानने का कोई तरीका नहीं है कि साइट बैकअप के साथ क्या करती है। यह हानिरहित हो सकता है लेकिन मैं ऐसा करने की सलाह नहीं दूंगा।
bmdixon

मेटासोक के अनुसार, यह एक स्पैम यूआरएल है । इसके अलावा मैं यहां पूरी तरह से @bmdixon से सहमत हूं - विशेष रूप से सुरक्षित तरीके मौजूद हैं जो स्थानीय रूप से कार्य करते हैं।
इज़ी

@ इज़ी वैसे भी मैंने स्पैम के रूप में चिह्नित किया और स्मोकडेक्टर को इसकी सूचना दी।
iBug

इस सर्वर पर डेटा संग्रहीत नहीं है। मैंने dd / tar के साथ छेड़छाड़ या अतिरिक्त सॉफ़्टवेयर स्थापित किए बिना बैकअप को देखने में आसान बनाने के लिए यह ऑनलाइन सेवा विकसित की है। मैं लेखक हूँ www.adb-backup.com
लिस्ज़क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.