[目次]
この記事は、私が「iOS アプリケーションのリバース エンジニアリング」に強い興味を持ったことがきっかけで、興味深い機能を実装したので、それを皆さんと共有したいと思います。また、私自身の学習の簡単な要約でもあります。ところで、iOS リバース フォーラム iOSRe は、優れた iOS リバース コミュニケーション コミュニティです。
この例のすべてのコードとツールは GitHub でホストされています。https://github.com/jackrex/FakeWeChatLoc を確認してください。
この記事はすべて、純粋に個人的な娯楽と学習価値を目的としたものであり、学習とコミュニケーションのみを目的としています。違法な目的やその他の商業目的には使用しないでください。 ! !
iOS システムの脱獄は、端的に言えば、Android のルートに似ており、携帯電話の権限を増やし、以前は制御できなかったものを制御できるようになります。
Objective-C はオブジェクト指向の高級言語であるため、iOS で使用されるファイル形式 Mach-O には多くのメタデータ情報が含まれており、クラスダンプを使用してヘッダー ファイルを復元できます。これは iOS にとって良いスタートとなります。リバースエンジニアリング。
MobileSubstrate は、iOS 開発でのフックを容易にするフレームワークであり、次の 3 つの部分で構成されます。
モバイル基板
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 構造は、実際にはライブラリ アプリケーション gzip data.tar.gz 内の制御ファイルであり、control.tar.gz に配置されます。
リバース エンジニアリングにおける動的デバッグと静的分析に一般的に使用されるツール:
class-dump は、ジェイルブレイクされたアプリのすべてのヘッダー ファイルをダンプするために使用されるツールです。
IDA は最高の逆コンパイル ツールです。実際、単純なリバース エンジニアリングは IDA だけを使用して完了できます。
Hopper 逆アセンブラーは OS X で低額のライセンス料で使用できます
動的デバッグ用の強力なツールは IDA と連携して、すべてを動かしたり静止したりすることができます。
UI のデバッグと配置を容易にするデバッグ ツール。どのアプリ インターフェイスが特定のクラスに対応するかをすぐに識別できます。
便利なファイル管理アシスタントソフト
OpenSSH を使用すると、コンピュータが電話機にリモートでログインできるようになります
開発者がコマンド ラインからアプリケーションを操作し、実行時にアプリケーションを表示および変更できるようにする非常に強力なツールです。
iFunbox や Android の Re マネージャーなど、携帯電話上のファイル システムを便利に管理するソフトウェア。ファイルを簡単に変更したり、Deb バイナリをインストールしたりできます。
APPsync は、iPhone、iPad、iPod touch をジェイルブレイクした後に最も一般的にインストールされるパッチです。インストール後は、システム署名の検証をバイパスして、クラックされた ipa ソフトウェアを自由にインストールして実行できます。
上記の理解に基づいて、WeChat での測位をシミュレートしたいため、分析対象として WeChat を使用します。 class-dump を使用して WeChat のヘッダー ファイルをエクスポートします。 class-dump 公式 Web サイトには直接エクスポート方法がありますが、ipa で wechat を直接解凍することはできません。出力フォルダーには CDStructures.h ファイルのみが存在し、空であることがわかりました。
その理由は、AppStore にアップロードした後、AppStore がすべての ipa を自動的に暗号化するため、ダンプする前に WeChat バイナリをシェルする必要があるためです。
まずはより便利なクラッチを試してみましょう
クラッチが失敗した場合は、アプリのシェルをダンプするために dumpdecrypted.dylib などのツールが必要です。まず iOS フォンに ssh 接続し、すべてのプログラムを終了し、WeChat を開いて実行します。
ps - e //列出当前运行的进程
TODO /var/mobile/Containers/ で始まるリストのプロセスが WeChat プロセスであることがわかります。すべてのアプリのサンドボックス パスは /var/mobile/Containers/Bundle/Application/03B61840-2349-4559-B28E であることがわかります。 - 0E2C6541F879/ですが、 03B61840-2349-4559-B28E-0E2C6541F879がどのアプリなのかはわかりません。ディレクトリに 1 つずつアクセスして見つけるのは非常に困難です。
このとき、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 を使用して cryptid を検索し、lipo を使用して復号化された構造を分割します。
埋め込む
./class-dump -H WeChat.decrypted --arch armv7 -o output/
現在のディレクトリに出力フォルダーを生成します。このフォルダーには、WeChat によってエクスポートされたすべてのヘッダー ファイル (サードパーティの SDK などを含む) が含まれます。簡単に表示できるように、これらすべてのヘッダー ファイルを空の Xcode プロジェクトに配置します。
直感に基づいて、Appdelegate は WeChat の MircoMessengerAppDelegate であることがわかりました。WeChat のプロジェクト構造などが大まかにわかります。実際、リバース エンジニアリングは学習の方法でもあります。
次に、自分の位置を変更して近くの人を変更したい機能について考えてみましょう。このクラスを Nearby Location などに送信する必要があると考えられ、対応するヘッダー ファイルを検索できます。
Nearbyで検索したらたくさんあるのですが、どれでしょうか?
実際、消去法と 1 つずつの推測に加えて、強力なツール Reveal を使用して、
class-dump はヘッダー ファイル全体を一覧表示するのに役立ち、プロジェクトの全体構造を一般的に理解できるようになりますが、.m 内の対応する実装計画はまだブラック ボックスです。現時点では、IDA の強力な分析ツールを使用する必要があります。
IDAを開いて新規を選択します
Wechat.app から WeChat バイナリを取り出し、上の IDA にドラッグします。私は itouch 5 CPU を使用しており、アーキテクチャは armv7 なので、間違って使用される場合は、ブレークポイントによって取得されたオフセットを使用します。が間違っているため、正常にデバッグできません。
処理が完了すると下図のようになります。
その中で、MicroMessengerAppDelegate の特定のメソッドの実装を簡単に確認できます。スペース バーを押して表示モードに展開します。
ここでは .m での実装を確認できます。
動的デバッグは、ソース コードがない場合に、lldb を使用してコードの位置にブレークポイントを設定してデバッグします。主な目的は、対応するコードの実行アドレスを計算し、必要な値を取得するためにデバッグする方法です。 。前述したように、IDA の逆コンパイル結果を使用します。
iOS はデバッグサーバーを開き、ポート 1234 をリッスンします。 デバッグサーバー *:1234 -a "WeChat"
Mac で lldb を実行し、iOS サーバーに接続したまま lldb プロセスを実行します connect connect://iOSIP:1234
オフセットは0xd000です
ブレークポイントのアドレスを取得します br s -a 0xd000+0x649D8 // 下位ブレークポイント
デバッグを開始して、po およびその他のデバッグ コマンドを実行します。
アプリを直接起動します: debugserver -x backboard *:1234 /path/to/app/executable
libsubstrate.dylib
Tweak は言葉で「微調整」を意味します。実際には、Tweak は MobileSubstrate に基づいて書かれており、実行時にフックのアプリを変更できます。
Theos は脱獄開発ツールキットです。この方法は「iOS アプリケーション リバース エンジニアリング ブック」でも紹介されていますが、個人的には iOSOpenDev を使用してプロジェクトを作成することを好みます (追記: git コマンド ラインに慣れてきたら、sourceTree を使用することを考えました)。直感的) なので、ここで簡単に説明します。iOSOpenDev はコマンドラインの NIC テンプレートを視覚的なものに変えるようなものです。実際には、それほど難しいことではありません。
インストールは非常に簡単です。インストーラーをダウンロードしてインストールします。
インストールが完了したら、新しいプロジェクトを作成すると、テンプレート iOS に iOSOpenDev が表示されます。
ここでは「ロゴの調整」を選択し、次のように作成が完了します。
ファイル fakeloc.xm があり、そこにコードを記述します。 fakeloc.xm ファイルを開くと、内部のコードがロゴを使用して完成していることがわかります。ロゴという新しい言語の場合、その基本的な構文は Objc に似ていますが、特別な構文が必要です。注意:
ロゴの基本構文: %hook は、フックする必要があるクラスを指定します。%end で終わる必要があります。 %log は、フックされた関数を実行し、%hook 固有のメソッド内でのみ実行できます。 。
fakeloc.xm は fakeloc.mm に対応します
私たちは上にいる
ビルド設定でわかるように、一番下に User-Define という列があります。これはiOSOpenDevDeviceの場所に、iOS デバイスの IP アドレス (192.168.1.103 など) を書き込みます。 iOSデバイスにOpenSSHがインストールされていることが前提となります。
SSH 認証エラー iosod sshkey -h 192.168.1.109
最初は、脱獄アプリを作成するにはロゴ構文で書かなければならないと思っていましたが、実際、iOS 脱獄アプリの開発は通常のアプリとほぼ同じです。
まず、通常のプロジェクトを作成するのと同じように、CocoaPods を使用してサードパーティのライブラリを管理することもできます。
まず通常どおり新しいプロジェクトを作成し、次のように設定してからビルド設定を変更します。
実行スクリプトを追加し、コピー バンドル リソースから制御を削除します
プロジェクトの全体構成
プロファイリング実行プログラム用のビルド
アプリと 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());
}
次に、対応するカスタム クラスを動的に取得します。
クラス TweakBridge = NSClassFromString(@"TweakBridge");
最初はこの問題に戸惑いましたが、最終的には、同じファイルにデータを読み書きするという、最も安定して簡単な方法を採用しました。このファイルは、データを送信するための媒体として使用できます。 ただし、最初はファイルを /var/mobile/xxx.plist に置きましたが、tweak は値を読み取ることができませんでした。その理由は、tweak とアプリの権限が異なるため、それを保存できる場所を見つける必要があります。この場所は **/var/mobile/Library/Preferences/ ** です。 したがって、アプリと Tweak の情報のやり取りでは、送信の目的を達成するために、1 つの書き込み方法と他の読み取り方法が使用されます。直接的な方法を提案することもできます。一緒に議論しましょう。
最終的なコードは次のようになります。
- (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とappのディレクトリをそれぞれ取り出します。
これらをすべて別の Package ディレクトリに配置します。最終的なディレクトリ構造は次のとおりです。
以下に示す階層に従って、Deb によって配置されたディレクトリ構造に従ってすべてのファイルを配置し、dpkg-deb メソッドを使用してパッケージ化します。パッケージ化するときは、deb 内に .DS_Store ファイルを含めないことが最善であることに注意してください。以下のスクリプトを実行すると、同時に Deb ファイルが生成されます。
#!/bin/bash
find ./Package -name ".DS_Store" -depth -exec rm {} ;
dpkg-deb -Zgzip -b Package fakeLoc.deb
生成されたインストール パッケージは次のとおりです。これをデバイスに scp します。
iFunbox を使用して生成された fakeLoc .deb をルート ディレクトリにドラッグし、電話機で iFile を開き、fakeLoc.deb をクリックしてプログラムをインストールします。インストール後、AppSync を再インストールして電話機を再起動すると、アプリを開くことができます。また、システム アプリケーションや Cydia などと同様に、アプリを長押ししてもアンインストールできないこともわかりました。これは、アプリを /Applications の下にインストールしたためであるはずです。アンインストールするには、コマンド ラインを使用して削除することもできます。 Cydiaを使用します。
インストールが完了したら、デバイスを再起動するだけです。
アプリを開き、精度と緯度を入力して実行します。最後に、WeChat 付近の人々が変化したかどうかを確認します。うまくいけば、地図上で精度の緯度を選択し、コア機能を実行します。簡単なテスト結果は次のとおりです。
テスト用にマップ アドレス セレクターでさまざまな場所を選択できます
ほとんどの人が北京出身であることがわかります
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你就可以进一步修改成其它的密码了