[جدول المحتويات]
هذه المقالة مدفوعة باهتمامي الشديد بالهندسة العكسية، لقد قرأت "الهندسة العكسية لتطبيقات iOS" وقمت بتنفيذ وظيفة مثيرة للاهتمام وأريد مشاركتها معك وهي أيضًا ملخص بسيط لما تعلمته. راجع للشغل iOS Reverse Forum iOSRe هو مجتمع اتصال عكسي جيد لنظام iOS.
تتم استضافة جميع التعليمات البرمجية والأدوات الخاصة بهذا المثال على GitHub، يرجى التحقق من https://github.com/jackrex/FakeWeChatLoc
كل هذه المقالة مخصصة للترفيه الشخصي والقيمة التعليمية فقط. التكنولوجيا ذات الصلة مخصصة للتعلم والتواصل فقط. يرجى عدم استخدامها لأغراض غير قانونية أو لأي أغراض تجارية أخرى. ! !
إن كسر الحماية لنظام iOS، بصراحة، يشبه Android Root، وهو يعادل زيادة أذونات الهاتف المحمول، مما يسمح لك بالتحكم في الأشياء التي لم يكن بإمكانك التحكم فيها من قبل.
نظرًا لأن Objective-C هي لغة عالية المستوى موجهة للكائنات، فإن تنسيق الملف Mach-O الذي يستخدمه iOS يحتوي على الكثير من معلومات البيانات الوصفية، مما يسمح لنا باستخدام class-dump لاستعادة ملفات الرأس الخاصة به، وهذه بداية جيدة لنظام iOS الهندسة العكسية.
MobileSubstrate هو إطار عمل يسمح بتطوير iOS لتسهيل عملية الربط. يتكون MobileSubstrate من الأجزاء الثلاثة التالية:
MobileSubstrate
يحتوي هذا النوع من أنظمة التشغيل المشتقة من Unix عمومًا على نفس التسلسل الهرمي للدليل. يمكنك أيضًا مقارنة Android وMacOS وستجد أن العديد من أسماء الأدلة متماثلة، دعنا نختار بعضها ونشرحها بإيجاز:
`/bin binnary` ,系统常用的基本二进制文件 例如 cd, ls, ps 等
`/usr` 包含大多用户工具库
`/var variable` 存放经常更改的东西,例如 logs,用户数据,/var/mobile/Applications 是纺织AppStore 下载的 App
`/Applications` 存放所有系统App,以及从Cydia下载的App路径
`/Library` 存放了系统App的数据,其中有一个/Library/MobileSubstrate 目录,MobileSubstrate 是一个hook 功能开发平台,其中内容如下图所示,我们所开发的插件都被放置到这个里面
`/Library/MobileSubstrate` 里面文件类型主要有 dylib,plist
dylib 是动态加载库,就是tweak
plist 配合dylib 使用的filter 文件,指定注入目标,及hook的目标
`/System` 存放iOS 各种系统framework
`/User` 指向 /var/mobile 即是我们一般用户的主目录
بنية Deb هي في الواقع ملف التحكم في Library Applications gzip data.tar.gz ويتم وضعها في control.tar.gz
الأدوات الشائعة الاستخدام لتصحيح الأخطاء الديناميكي والتحليل الثابت في الهندسة العكسية:
class-dump هي أداة تستخدم لتفريغ جميع ملفات رأس تطبيق jailbroken.
IDA هي أفضل أداة لتفكيك البيانات، في الواقع، يمكن إكمال الهندسة العكسية البسيطة باستخدام IDA وحده.
يمكن استخدام Hopper Disassembler ضمن نظام التشغيل OS X برسوم ترخيص منخفضة
تعمل الأداة القوية للتصحيح الديناميكي مع IDA لجعل كل شيء يتحرك ويظل ثابتًا.
أداة تصحيح تسهل تصحيح أخطاء واجهة المستخدم وتحديد موضعها، يمكننا تحديد واجهة التطبيق التي تتوافق مع فئة معينة بسرعة.
برنامج مساعد لإدارة الملفات مناسب
يسمح OpenSSH لجهاز الكمبيوتر الخاص بك بتسجيل الدخول إلى هاتفك عن بعد
أداة قوية جدًا تتيح للمطورين التفاعل مع التطبيقات من سطر الأوامر وعرض التطبيقات وتعديلها في وقت التشغيل.
برنامج يدير نظام الملفات على الهواتف المحمولة بسهولة، مثل iFunbox وAndroid's Re manager، والذي يمكنه بسهولة تعديل الملفات وتثبيت ثنائيات Deb.
يعد APPsync هو التصحيح الأكثر شيوعًا الذي يتم تثبيته بعد كسر حماية iPhone وiPad وiPod touch. بعد التثبيت، يمكنك تجاوز التحقق من توقيع النظام وتثبيت برنامج ipa المكسور وتشغيله حسب الرغبة.
بناءً على الفهم أعلاه، نظرًا لأننا نريد محاكاة تحديد المواقع في WeChat، فإننا نستخدم WeChat ككائن التحليل الخاص بنا. استخدم class-dump لتصدير ملف رأس WeChat على الرغم من أننا نرى طريقة التصدير المباشرة class-dump -H xxx -o Output/ على الموقع الرسمي لـ class-dump، إلا أنه لا يمكن فك ضغط wechat مباشرة في ipa و. سنقوم بتفريغه. لقد وجد أنه لا يوجد سوى ملف CDStructures.h في مجلد الإخراج، وكان فارغًا.
والسبب في ذلك هو أنه بعد التحميل إلى AppStore، يقوم AppStore تلقائيًا بتشفير جميع أجهزة IPAS، لذلك نحتاج إلى إغلاق ملف WeChat الثنائي قبل التفريغ.
يجب علينا أولاً تجربة القابض الأكثر ملاءمة
عندما يفشل Clutch، جرّب الخطوات التالية. نحتاج إلى أداة مثل dumpdecrypted.dylib لتفريغ الصدفة على تطبيقنا. نقوم أولاً بإرسال رسالة نصية إلى هاتف iOS الخاص بنا، وننهي جميع البرامج، ونفتح WeChat وننفذها
ps - e //列出当前运行的进程
TODO يمكنك أن ترى أن العملية المدرجة التي تبدأ بـ /var/mobile/Containers/ هي عملية WeChat، ونحن نعلم أن مسار وضع الحماية لجميع التطبيقات هو /var/mobile/Containers/Bundle/Application/03B61840-2349-4559-B28E. - 0E2C6541F879/ ، ولكننا لا نعرف أي تطبيق 03B61840-2349-4559-B28E-0E2C6541F879 هو سيكون من الصعب جدًا إذا ذهبنا إلى الدليل للعثور عليهم واحدًا تلو الآخر.
في هذا الوقت، يكون cycript مفيدًا، قم بالتنفيذ
cycript -p WeChat
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/D41C4343-63AA-4BFF-904B-2146128611EE/Documents/"
بهذه الطريقة، نحصل على دليل مستندات WeChat. بعد ذلك، استخدم scp أو ifunbox لنسخ dumpdecrypted.dylib إلى دليل المستندات في WeChat.
البدء في كسر القشرة
DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /path/to/executable
سيتم إنشاء WeChat.decrypted في الدليل الحالي. هذا هو WeChat الذي تم قصفه. قبل التفريغ، يمكننا استخدام أداة otool لعرض معلومات ملف Match-o.
otool -H WeChat.decrypted
استخدم otool -l WeChat.decrypted للعثور على المشفر، واستخدم lipo لتقسيم البنية التي تم فك تشفيرها.
ينفذ
./class-dump -H WeChat.decrypted --arch armv7 -o output/
قم بإنشاء مجلد إخراج في الدليل الحالي، والذي يحتوي على جميع ملفات الرأس التي تم تصديرها بواسطة WeChat، بما في ذلك sdk التابع لجهة خارجية، وما إلى ذلك. وضعنا كل ملفات الرأس هذه في مشروع Xcode فارغ لسهولة المشاهدة.
بناءً على الحدس، وجدنا أن Appdelegate هو MircoMessengerAppDelegate الخاص بـ WeChat، ويمكننا رؤية هيكل مشروع WeChat تقريبًا، وما إلى ذلك. في الواقع، الهندسة العكسية هي أيضًا طريقة للتعلم.
ثم دعونا نفكر في الوظيفة التي نريد تنفيذها. نريد تغيير موقعنا لتغيير الأشخاص القريبين. يمكننا أن نخمن تقريبًا أنه يجب إرسال هذه الفئة إلى الموقع القريب أو ما شابه، ويمكننا البحث عن ملف الرأس المقابل.
لقد وجدنا أن هناك الكثير منها بعد البحث في مكان قريب، أي منها هو؟
في الواقع، بالإضافة إلى طريقة الإزالة والتكهنات واحدًا تلو الآخر، يمكننا استخدام الأداة القوية Reveal لمساعدتنا في تحديد موقع
يمكن القول أن تفريغ الفصل يساعدنا في سرد ملف الرأس بالكامل، مما يمنحنا فهمًا عامًا للهيكل العام للمشروع، لكن خطة التنفيذ المقابلة في .m لا تزال بمثابة صندوق أسود بالنسبة لنا. ويتعين علينا في هذا الوقت أن نستخدم أدوات التحليل القوية التي تستخدمها المؤسسة الدولية للتنمية.
افتح المؤسسة الدولية للتنمية وحدد جديد
نحن نخرج ثنائي WeChat من Wechat.app ونسحبه إلى IDA أعلاه نظرًا لأنني أستخدم وحدة المعالجة المركزية itouch 5 والهندسة المعمارية هيarmv7، فإنني أستخدم الأول إذا تم استخدامه بشكل غير صحيح، فسيتم الحصول على الإزاحة بواسطة نقطة التوقف سيكون خطأ، وبالتالي غير قادر على التصحيح بشكل طبيعي
وبعد الانتهاء من المعالجة سيكون كما هو موضح في الصورة أدناه
من بينها، يمكننا أن نرى بسهولة تنفيذ أساليب محددة في MicroMessengerAppDelegate، اضغط على شريط المسافة للتوسيع إلى وضع العرض.
هنا يمكننا أن نرى التنفيذ في .m
التصحيح الديناميكي هو عندما لا يكون لدينا كود المصدر، نستخدم lldb لتعيين نقاط التوقف في موقع الكود لتصحيح الأخطاء. الغرض الرئيسي هو حساب عنوان تنفيذ الكود المقابل وكيفية تصحيح الأخطاء للحصول على القيمة التي نريدها . كما ذكرنا سابقًا، نستخدم نتائج فك الترجمة الخاصة بـ IDA
يفتح iOS خادم تصحيح الأخطاء ويستمع إلى المنفذ 1234 debugserver *:1234 -a "WeChat"
قم بتشغيل lldb على جهاز Mac واستمر في الاتصال بخادم iOS. قم بتشغيل عملية lldb وconnect://iOSIP:1234
الإزاحة هي 0xd000
احصل على عنوان نقطة التوقف br s -a 0xd000+0x649D8 // نقطة توقف أقل
ابدأ في تصحيح أخطاء ni po وأوامر التصحيح الأخرى
ابدأ التطبيق مباشرةً: debugserver -x backboard *:1234 /path/to/app/executable
libsubstrate.dylib
القرص يعني "الضبط الدقيق" في الكلمة، وهو في الواقع مكتبة الارتباط الديناميكي لجهة خارجية dylib تمت كتابته استنادًا إلى MobileSubstrate ويمكنه تغيير تطبيق الخطاف في وقت التشغيل.
Theos عبارة عن مجموعة أدوات لتطوير كسر الحماية، وقد تم تقديم هذه الطريقة أيضًا في "كتاب الهندسة العكسية لتطبيقات iOS"، لكنني شخصيًا أفضل استخدام iOSOpenDev لإنشاء المشاريع (ملاحظة: بعد التعرف على سطر أوامر git، فكرت في استخدام sourceTree المزيد. بديهية)، لذلك سأذكرها بإيجاز هنا، يبدو أن iOSOpenDev يحول قالب NIC لسطر الأوامر إلى قالب مرئي.
التثبيت بسيط للغاية. قم بتنزيل برنامج التثبيت وتثبيته.
بعد اكتمال التثبيت، أنشئ مشروعًا جديدًا وسيظهر iOSOpenDev في قالب iOS
هنا نختار Logos Tweak ويتم الانتهاء من الإنشاء على النحو التالي
يوجد ملف fakeloc.xm، وهو المكان الذي نريد كتابة التعليمات البرمجية فيه. افتح الملف fakeloc.xm ويمكننا أن نرى أن التعليمات البرمجية الموجودة بداخله مكتملة باستخدام الشعارات. بالنسبة للشعارات، وهي لغة جديدة، فلا داعي للقلق. تركيبها الأساسي مشابه لـ Objc. هناك العديد من تركيبات الجملة المحددة التي تتطلب خاصة انتباه:
بناء الجملة الأساسي للشعارات: يحدد %hook الفئة التي يجب ربطها، ويجب أن ينتهي بـ %end، ويكتب %log معلومات الوظيفة إلى syslog لطباعة المعلومات .
يتوافق fakeloc.xm مع fakeloc.mm
نحن فوق
كما ترون في إعدادات البناء، يوجد عمود في الأسفل يسمى "تعريف المستخدم"، وهذا هو الجزء المخصص لدينا في مكان iOSOpenDevDevice ، اكتب عنوان IP لجهاز iOS الخاص بنا (عنوان LAN مثل 192.168.1.103). الفرضية هي أن جهاز iOS مثبت عليه OpenSSH
خطأ في مصادقة SSH iosod sshkey -h 192.168.1.109
في البداية، اعتقدت أن إنشاء تطبيق كسر الحماية يجب أن يكون مكتوبًا بلغة الشعارات، وهو ما أخافني بشدة. في الواقع، فإن تطوير تطبيق كسر الحماية لنظام iOS هو تقريبًا نفس التطبيق العادي.
أولاً، لا نزال ننشئ مشروعًا، تمامًا مثل إنشاء مشروع عادي، يمكنك أيضًا استخدام CocoaPods لإدارة مكتبات الطرف الثالث الخاصة بك.
قم أولاً بإنشاء مشروع جديد كالمعتاد، وقم بتكوينه على النحو التالي ثم قم بتغيير إعدادات البناء.
قم بإضافة Run Script وإزالة التحكم من موارد حزمة النسخ
الهيكل العام للمشروع
بناء لمنفذ التنميط
بعد إنشاء التطبيق وTweak، كيف نطلق على Tweak في تطبيقنا؟ الجواب هو استخدام dlopen
void *handle = dlopen(TWEAK_PATH, RTLD_LAZY); //TWEAK_PATH 是dylib 的地址
if (handle) {
NSLog(@"handle");
if (0 != dlclose(handle)) {
printf("dlclose failed! %sn", dlerror());
}else {
}
} else {
NSLog(@"nohandle");
printf("dlopen failed! %sn", dlerror());
}
ثم الحصول على الفئة المخصصة المقابلة بشكل حيوي
Class TweakBridge = NSClassFromString(@"TweakBridge");
لقد حيرتني هذه المشكلة في البداية، وأخيراً اعتمدت الطريقة الأكثر استقرارًا وأبسط لتحقيق ذلك، وهي قراءة البيانات وكتابتها في نفس الملف. ويمكن استخدام هذا الملف كوسيلة لنقل البيانات. لكن في البداية، وضعت الملف في /var/mobile/xxx.plist، لكن القرص لم يتمكن من قراءة القيمة والسبب هو أن القرص وتطبيقنا لهما أذونات مختلفة، لذلك نحتاج إلى العثور على مكان يمكن أن يكون فيه هذا المكان مكتوب علنًا **/var/mobile/Library/Preferences/ ** لذلك، يستخدم تفاعل معلومات التطبيق والتعديل طريقة واحدة للكتابة وطريقة القراءة الأخرى لتحقيق غرض النقل إذا كان لديك أفضل وأكثر الطريقة المباشرة، يمكنك اقتراح ذلك دعونا نناقش معا
وبالتالي فإن الكود النهائي هو:
- (void)setLocWithLat:(double)lat andLng:(double)lng {
NSLog(@"set lat & lng is %f &&&& %f", lat, lng);
Class TweakBridge = NSClassFromString(@"TweakBridge");
void *handle = dlopen(TWEAK_PATH, RTLD_LAZY);
if (handle) {
NSLog(@"handle");
TweakBridge = NSClassFromString(@"TweakBridge");
NSDictionary *dict = @{@"lat":[NSNumber numberWithDouble:lat], @"long":[NSNumber numberWithDouble:lng]};
BOOL isSuccess = [dict writeToFile:LOCATION_PATH atomically:YES];
NSLog(@"isSuccess, %d", isSuccess);
CLLocation *location = [[TweakBridge shareInstance] getCoreLocation];
if (0 != dlclose(handle)) {
printf("dlclose failed! %sn", dlerror());
}else {
}
} else {
NSLog(@"nohandle");
printf("dlopen failed! %sn", dlerror());
}
}
إذن، كيف نجمع بين برنامجنا Tweak وتطبيقنا بحيث يمكن للمستخدمين استخدامه مباشرة بعد التثبيت، في ضوء تنسيق deb الذي ذكرناه أعلاه، فإن طريقة التغليف والبنية هي في الواقع نفس ملف ZIP ويمكن تثبيته بواسطة نظام iOS. لقد شرحنا بالفعل تنسيق الحزمة وبنيتها أعلاه، والآن كيفية إنشاء حزمة Deb
نقوم بإخراج الدلائل التي تم إنشاؤها لـ dylib والتطبيق على التوالي.
ضعهم جميعًا في دليل حزمة منفصل، وتكون بنية الدليل النهائية كما يلي:
نقوم بترتيب جميع الملفات وفقًا لبنية الدليل التي يرتبها Deb وفقًا للتسلسل الهرمي الموضح أدناه، ثم نستخدم طريقة dpkg-deb للتغليف. لاحظ أنه من الأفضل عدم وجود ملفات .DS_Store في deb عند التعبئة البرنامج النصي التالي لإزالته وإنشاء ملفات Deb في نفس الوقت
#!/bin/bash
find ./Package -name ".DS_Store" -depth -exec rm {} ;
dpkg-deb -Zgzip -b Package fakeLoc.deb
حزمة التثبيت التي تم إنشاؤها هي كما يلي، ثم نقوم بتثبيتها على الجهاز
نستخدم iFunbox لسحب fakeLoc .deb الذي تم إنشاؤه إلى الدليل الجذر، ثم نفتح iFile على الهاتف وننقر فوق fakeLoc.deb لتثبيت البرنامج، بعد التثبيت، نقوم بإعادة تثبيت AppSync وإعادة تشغيل الهاتف، وبعد ذلك يمكننا فتح التطبيق الخاص بنا. ، ووجدت أيضًا أنه لا يمكن إلغاء تثبيت تطبيقنا بالضغط عليه لفترة طويلة، تمامًا مثل تطبيقات النظام، وCydia، وما إلى ذلك. ويجب أن يكون هذا لأننا قمنا بتثبيته ضمن /Applications، لإلغاء التثبيت، يمكننا استخدام سطر الأوامر لحذفه، أو استخدم سيديا.
بعد اكتمال التثبيت، فقط قم بإعادة تشغيل الجهاز.
افتح التطبيق، ودعنا ندخل الدقة وخط العرض، ثم ننفذه، وأخيرًا، افتح WeChat People Nearby لمعرفة ما إذا كان الأشخاص القريبون قد تغيروا، وإذا قمنا بعمل أفضل، فحدد خط العرض الدقيق على الخريطة، واترك وظائفنا الأساسية ينتهي الشرح هنا، نتائج الاختبار البسيطة لدينا هي كما يلي:
يمكننا تحديد مواقع مختلفة في محدد عنوان الخريطة للاختبار
يمكنك أن ترى أن معظم الناس من بكين
تمت محاكاة الأشخاص القريبين بنجاح على WeChat
هذا ليس مثل النشر على AppStore، فأنت تحتاج أولاً إلى مصدر استضافة إذا كنت لا ترغب في إنشائه بنفسك، فيمكنك استخدام thebigboss.org/hosting-repository-cydia/submit-your-app.
املأ المعلومات ذات الصلة، ولن يتم وصفها مرة أخرى.
هذه المقالة هي مقدمة للموضوع، أتمنى أن يكون لديك فهم أولي لكسر الحماية لنظام التشغيل iOS، وأن تكون قادرًا على إكمال أي من تطبيقاتك الخاصة، وتطوير المزيد من التعديلات الممتعة، على سبيل المثال، المكون الإضافي لالتقاط المظاريف الحمراء على WeChat يبدو أن هذا المشروع النموذجي مستضاف بالكامل على Github، حيث Fakeloc هو dylib، أي أن tweak TestFakeTweak هو مشروع التطبيق، HackAppTool، توضح مقالتنا أعلاه أدوات الطرف الثالث التي يجب استخدامها.
عنوان المشروع: https://github.com/jackrex/FakeWeChatLoc
重新安装下AppSync 并重启SpringBoard
由于iOS7之后引入一些新的类库等,在iOS6设备上的兼容性一般,所以在工程的framework 中把 require 改为 option
root密码文件存放地方: / etc / master . passwd
用iFile的文本编辑功能打开master . passwd ,更改之前记得权限
你会找到类似这样的一行字符—— root : UlD3amElwHEpc : 0 : 0 :: 0 : 0 : System
UlD3amElwHEpc就是加密过的密码
把它更替为ab3z4hnHA5WdU ,这是对应的密码就是abc123 。
保存,重启。
有了密码abc123你就可以进一步修改成其它的密码了