[Daftar Daftar]
Artikel ini didorong oleh minat saya yang kuat pada rekayasa balik. Saya membaca "Rekayasa Pembalikan Aplikasi iOS" dan menerapkan fungsi yang menarik. Saya ingin membaginya dengan Anda dan ini juga merupakan ringkasan sederhana dari pembelajaran saya sendiri. BTW iOS Reverse Forum iOSRe adalah komunitas komunikasi terbalik iOS yang bagus.
Semua kode dan alat untuk contoh ini dihosting di GitHub. Silakan periksa https://github.com/jackrex/FakeWeChatLoc
Semua artikel ini murni untuk hiburan pribadi dan nilai pembelajaran. Teknologi terkait hanya untuk pembelajaran dan komunikasi. Mohon jangan menggunakannya untuk tujuan ilegal atau untuk tujuan komersial lainnya! ! !
Jailbreak sistem iOS, terus terang, mirip dengan Root Android. Ini setara dengan meningkatkan izin ponsel, memungkinkan Anda mengontrol hal-hal yang sebelumnya tidak dapat Anda kendalikan.
Karena Objective-C adalah bahasa tingkat tinggi berorientasi objek, format file Mach-O yang digunakan oleh iOS berisi banyak informasi metadata, memungkinkan kita menggunakan class-dump untuk memulihkan file headernya. Ini adalah awal yang baik untuk iOS rekayasa terbalik.
MobileSubstrate adalah kerangka kerja yang memungkinkan pengembangan iOS untuk memfasilitasi pengait. MobileSubstrate terdiri dari tiga bagian berikut:
Substrat Seluler
Sistem operasi turunan Unix ini umumnya memiliki hierarki direktori yang sama. Anda sebaiknya membandingkan Android dan MacOS dan Anda akan menemukan bahwa banyak nama direktori yang sama. Mari kita pilih beberapa dan jelaskan secara singkat:
`/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 即是我们一般用户的主目录
Struktur Deb sebenarnya adalah gzip dari file kontrol Aplikasi Perpustakaan di data.tar.gz dan meletakkannya di control.tar.gz.
Alat yang umum digunakan untuk debugging dinamis dan analisis statis dalam rekayasa terbalik:
class-dump adalah alat yang digunakan untuk membuang semua file header dari Aplikasi yang sudah di-jailbreak.
IDA adalah alat dekompilasi terbaik. Faktanya, rekayasa balik sederhana dapat diselesaikan hanya dengan menggunakan IDA.
Hopper Disassembler dapat digunakan pada OS X dengan biaya lisensi yang rendah
Alat canggih untuk proses debug dinamis bekerja dengan IDA untuk membuat segalanya bergerak dan diam.
Alat debug yang memfasilitasi debugging dan pemosisian UI. Kita dapat dengan cepat mengidentifikasi antarmuka Aplikasi mana yang sesuai dengan kelas tertentu.
Perangkat lunak asisten manajemen file yang nyaman
OpenSSH memungkinkan komputer Anda untuk masuk ke ponsel Anda dari jarak jauh
Alat yang sangat canggih yang memungkinkan pengembang berinteraksi dengan aplikasi dari baris perintah dan melihat serta memodifikasi aplikasi saat runtime.
Sebuah perangkat lunak yang dengan mudah mengelola sistem file pada ponsel, seperti iFunbox dan Re manager Android, yang dapat dengan mudah memodifikasi file dan menginstal binari Deb.
APPsync adalah patch yang paling sering diinstal setelah melakukan jailbreak pada iPhone, iPad, dan iPod touch. Setelah instalasi, Anda dapat melewati verifikasi tanda tangan sistem dan menginstal serta menjalankan perangkat lunak ipa yang di-crack sesuka hati.
Berdasarkan pemahaman di atas, karena kami ingin melakukan simulasi positioning di WeChat, kami menggunakan WeChat sebagai objek analisis. Gunakan class-dump untuk mengekspor file header WeChat. Meskipun kami melihat metode ekspor langsung class-dump -H xxx -o output/ di situs web resmi class-dump, tidak mungkin untuk mendekompresi wechat secara langsung di ipa dan membuangnya. Kami akan Menemukan bahwa hanya ada file CDStructures.h di folder keluaran, dan itu kosong.
Alasannya adalah karena setelah diunggah ke AppStore, AppStore secara otomatis mengenkripsi semua ipas, jadi kita perlu shell biner WeChat sebelum membuangnya.
Pertama-tama kita harus mencoba Kopling yang lebih nyaman
Ketika Clutch gagal, coba langkah-langkah berikut. Kami memerlukan alat seperti dumpdecrypted.dylib untuk membuang shell di Aplikasi kami. Pertama-tama kami melakukan ssh ke ponsel iOS kami, kami mengakhiri semua program, membuka WeChat dan mengeksekusi
ps - e //列出当前运行的进程
TODO Anda dapat melihat bahwa proses yang terdaftar dimulai dengan /var/mobile/Containers/ adalah proses WeChat. Kita tahu bahwa jalur sandbox semua Aplikasi adalah /var/mobile/Containers/Bundle/Application/03B61840-2349-4559-B28E. - 0E2C6541F879/ , tapi kita tidak tahu App 03B61840-2349-4559-B28E-0E2C6541F879 yang mana. Akan sangat sulit jika kita membuka direktori untuk menemukannya satu per satu.
Saat ini cycript berguna, jalankan
cycript -p WeChat
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/D41C4343-63AA-4BFF-904B-2146128611EE/Documents/"
Dengan cara ini, kita mendapatkan direktori Dokumen WeChat. Selanjutnya, gunakan scp atau ifunbox untuk menyalin dumpdecrypted.dylib ke direktori Dokumen WeChat.
Mulailah memecahkan cangkangnya
DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /path/to/executable
WeChat.decrypted akan dibuat di direktori saat ini. Ini adalah WeChat yang telah di-shell. Sebelum membuangnya, kita dapat menggunakan alat otool untuk melihat informasi file Match-o.
otool -H WeChat.didekripsi
Gunakan otool -l WeChat.decrypted untuk menemukan cryptid, dan gunakan lipo untuk memisahkan struktur yang didekripsi.
melaksanakan
./class-dump -H WeChat.decrypted --arch armv7 -o output/
Hasilkan folder Output di direktori saat ini, yang berisi semua file header yang diekspor oleh WeChat, termasuk SDK pihak ketiga, dll. Kami memasukkan semua file header ini ke dalam proyek Xcode kosong agar mudah dilihat.
Berdasarkan intuisi, kami menemukan bahwa Appdelegate adalah MircoMessengerAppDelegate dari WeChat. Secara kasar kita dapat melihat struktur proyek WeChat, dll. Faktanya, rekayasa balik juga merupakan cara pembelajaran.
Lalu mari kita pikirkan fungsi yang ingin kita terapkan. Kita ingin mengubah lokasi kita untuk mengubah orang-orang terdekat. Kita dapat menebak secara kasar bahwa kelas ini harus dikirimkan ke Lokasi Terdekat atau sejenisnya, dan kita dapat mencari file header yang sesuai.
Kami menemukan banyak sekali setelah mencari di Sekitar, yang mana?
Faktanya, selain metode eliminasi dan spekulasi satu per satu, kita dapat menggunakan alat canggih Reveal untuk membantu kita menemukan lokasinya.
Dapat dikatakan bahwa class-dump membantu kita membuat daftar seluruh file header, memberi kita pemahaman umum tentang keseluruhan struktur proyek, namun rencana implementasi terkait di .m masih merupakan kotak hitam bagi kita. Saat ini kita perlu menggunakan alat analisis IDA yang canggih.
Buka IDA dan pilih baru
Kami mengeluarkan biner WeChat dari Wechat.app dan menyeretnya ke IDA di atas. Karena saya menggunakan CPU itouch 5 dan arsitekturnya armv7, saya menggunakan yang pertama. Jika digunakan secara tidak benar, offset diperoleh dari break point akan salah. , sehingga tidak dapat melakukan debg secara normal
Setelah proses selesai maka akan seperti terlihat pada gambar di bawah ini
Diantaranya, kita dapat dengan mudah melihat penerapan metode tertentu di MicroMessengerAppDelegate. Tekan bilah spasi untuk memperluas ke mode tampilan.
Di sini kita bisa melihat implementasinya di .m
Debugging dinamis adalah ketika kita tidak memiliki kode sumber, kita menggunakan lldb untuk mengatur breakpoint di lokasi kode untuk debugging. Tujuan utamanya adalah untuk menghitung alamat eksekusi dari kode yang sesuai dan cara men-debug untuk mendapatkan nilai yang kita inginkan . Seperti disebutkan di atas, kami menggunakan hasil dekompilasi IDA
iOS membuka debugserver dan mendengarkan port 1234 debugserver *:1234 -a "WeChat"
Jalankan lldb di Mac dan tetap terhubung ke server iOS
offsetnya adalah 0xd000
Dapatkan alamat breakpoint br s -a 0xd000+0x649D8 // Lower breakpoint
Mulai men-debug ni po dan perintah debugging lainnya
Mulai Aplikasi secara langsung: debugserver -x backboard *:1234 /path/to/app/executable
libsubstrate.dylib
Tweak berarti "penyempurnaan" dalam kata tersebut. Ini sebenarnya adalah dylib pustaka tautan dinamis pihak ketiga. Tweak ditulis berdasarkan MobileSubstrate dan dapat mengubah Aplikasi hook saat runtime.
Theos adalah perangkat pengembangan jailbreak. Metode ini juga diperkenalkan di "Buku Rekayasa Terbalik Aplikasi iOS", tetapi saya pribadi lebih suka menggunakan iOSOpenDev untuk membuat proyek (ps: Setelah terbiasa dengan baris perintah git, saya berpikir untuk menggunakan sourceTree Selengkapnya intuitif), jadi saya akan menyebutkannya secara singkat di sini. Rasanya iOSOpenDev mengubah template NIC baris perintah menjadi template visual.
Instalasinya sangat sederhana. Unduh penginstal dan instal.
Setelah instalasi selesai, buat proyek baru dan iOSOpenDev akan muncul di template iOS
Di sini kita memilih Logos Tweak dan pembuatannya selesai sebagai berikut
Ada file fakeloc.xm, dimana kita ingin menulis kode. Buka file fakeloc.xm dan kita dapat melihat bahwa kode di dalamnya sudah selesai menggunakan logo.Untuk logo, bahasa baru, Anda tidak perlu khawatir, Sintaks dasarnya mirip dengan Objc Perhatian:
Sintaks dasar logo: %hook menentukan kelas yang perlu dihubungkan. Itu harus diakhiri dengan %end. %log menulis informasi fungsi ke syslog untuk mencetak informasi. %orig menjalankan fungsi kaitan dan hanya dapat dijalankan dalam metode khusus %hook .
fakeloc.xm sesuai dengan fakeloc.mm
Kami berada di atas
Seperti yang Anda lihat di Pengaturan build, ada kolom di bagian bawah yang disebut Definisi Pengguna. Ini adalah bagian khusus kami. Di tempat iOSOpenDevDevice , tulis alamat IP perangkat iOS kami (alamat LAN seperti 192.168.1.103). Premisnya adalah perangkat iOS diinstal OpenSSH
kesalahan otentikasi ssh iosod sshkey -h 192.168.1.109
Pada awalnya, saya berpikir bahwa membuat Aplikasi yang sudah di-jailbreak harus ditulis dalam sintaksis Logos, yang membuat saya takut setengah mati. Faktanya, pengembangan Aplikasi yang sudah di-jailbreak di iOS hampir persis sama dengan Aplikasi biasa.
Pertama, kami masih membuat proyek. Sama seperti membuat proyek biasa, Anda juga dapat menggunakan CocoaPods untuk mengelola perpustakaan pihak ketiga Anda.
Pertama buat proyek baru seperti biasa, konfigurasikan sebagai berikut, lalu ubah Pengaturan Build.
Tambahkan Jalankan Skrip dan hapus kontrol dari sumber daya bundel salinan
Struktur proyek secara keseluruhan
Bangun untuk pelaksana Profiling
Setelah membuat Aplikasi dan Tweak, bagaimana kita memanggil Tweak di Aplikasi kita? Jawabannya adalah dengan menggunakan 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());
}
Kemudian secara dinamis dapatkan kelas khusus yang sesuai
Kelas TweakBridge = NSClassFromString(@"TweakBridge");
Saya awalnya bingung dengan masalah ini, dan akhirnya mengadopsi metode paling stabil dan paling sederhana untuk mencapainya, yaitu membaca dan menulis data ke file yang sama. Tapi pada awalnya saya meletakkan file di /var/mobile/xxx.plist, tetapi tweak tidak dapat membaca nilainya. Alasannya adalah tweak dan Aplikasi kami memiliki izin yang berbeda, jadi kami perlu mencari tempat yang memungkinkan ditulis secara publik. Tempat ini adalah **/var/mobile/Library/Preferences/ ** Oleh karena itu, interaksi informasi Aplikasi dan Tweak kami menggunakan satu metode penulisan dan metode membaca lainnya untuk mencapai tujuan transmisi metode langsung, Anda bisa mengusulkannya. Mari kita bahas bersama
Jadi kode terakhirnya adalah:
- (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());
}
}
Jadi bagaimana kami menggabungkan Tweak kami dengan Aplikasi kami sehingga pengguna dapat menggunakannya langsung setelah instalasi? Mengingat format deb yang kami sebutkan di atas, metode dan struktur pengemasan serta zip sebenarnya sama dan dapat diinstal oleh sistem iOS. Format dan struktur paket sudah kami jelaskan di atas, sekarang bagaimana cara menghasilkan paket Deb
Kami masing-masing mengambil direktori dylib dan app yang dihasilkan.
Masukkan semuanya ke dalam direktori Paket terpisah. Struktur direktori terakhir adalah seperti yang ditunjukkan di bawah ini.
Kami mengatur semua file sesuai dengan struktur direktori yang diatur oleh Deb sesuai dengan hierarki yang ditunjukkan di bawah ini, dan kemudian menggunakan metode dpkg-deb untuk mengemasnya. Perhatikan bahwa yang terbaik adalah tidak memiliki file .DS_Store di deb saat saya menulis skrip berikut untuk menghapusnya
#!/bin/bash
find ./Package -name ".DS_Store" -depth -exec rm {} ;
dpkg-deb -Zgzip -b Package fakeLoc.deb
Paket instalasi yang dihasilkan adalah sebagai berikut, lalu kita scp ke perangkat
Kami menggunakan iFunbox untuk menyeret fakeLoc .deb yang dihasilkan ke direktori root, lalu buka iFile di ponsel dan klik fakeLoc.deb untuk menginstal program. Setelah instalasi, kami menginstal ulang AppSync dan memulai ulang ponsel, lalu kami dapat membuka Aplikasi kami. , dan juga menemukan bahwa Aplikasi kami tidak dapat dihapus dengan menekan lama, seperti aplikasi sistem, Cydia, dll. Ini seharusnya karena kami menginstalnya di / Aplikasi. Untuk menghapusnya, kami dapat menggunakan baris perintah untuk menghapusnya, atau gunakan Cydia.
Setelah instalasi selesai, restart saja perangkatnya.
Buka Aplikasi, masukkan presisi dan garis lintang, lalu jalankan. Terakhir, buka WeChat Orang Terdekat untuk melihat apakah orang di sekitar telah berubah. Jika kita melakukannya dengan lebih baik, garis lintang presisi dipilih di peta fungsinya adalah Penjelasannya berakhir di sini. Hasil tes sederhana kami adalah sebagai berikut:
Kita dapat memilih lokasi berbeda di pemilih alamat peta untuk pengujian
Anda dapat melihat bahwa sebagian besar orangnya berasal dari Beijing
Berhasil menyimulasikan orang-orang terdekat di WeChat
Ini tidak seperti mempublikasikan ke AppStore. Pertama, Anda memerlukan sumber hosting. Jika Anda tidak ingin membuatnya sendiri, Anda dapat menggunakan thebigboss.org/hosting-repository-cydia/submit-your-app.
Isi informasi yang relevan, ini tidak akan dijelaskan lagi.
Artikel ini adalah pengantar topik. Saya harap Anda memiliki pemahaman awal tentang jailbreak iOS, dapat menyelesaikan aplikasi Anda sendiri, dan mengembangkan Tweak yang lebih menyenangkan, misalnya plug-in untuk mengambil amplop merah di WeChat tampaknya tidak sulit untuk diterapkan. Contoh proyek ini semuanya dihosting di Github, di mana fakeloc adalah dylib, yaitu tweak TestFakeTweak adalah proyek aplikasi, HackAppTool Artikel kami di atas menjelaskan alat pihak ketiga yang perlu digunakan.
Alamat proyek: 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你就可以进一步修改成其它的密码了