読者の皆さん、こんにちは。この記事では、IOSオペレーティングシステムのシステムファイルの変更についてお話ししたいと思います。 実験として、第1世代のiPhoneを使用します。これは現在では珍品を指しますが、この情報は他のAppleデバイスに関連します。
知らない人のために、最初のiPhoneはこのように見えます

実験を行うには、Jajebreakによって起動された電話自体、システムファイルを表示および変更するためのIFunBoxプログラム、IDA逆アセンブラー、HEXエディターが必要です。
携帯電話にiOS 3.1.3をインストールしましたが、これらの変更は他のバージョンでも動作します(おそらく)。
私はあなたが言葉から行為に行くことができると思います。
ロック解除、デスクトップなどを含むインターフェイスを担当するシステムアプリケーションSpringBoardを変更します。
スマートフォン(この言葉は怖くありません)をコンピューターに接続し、IFunBoxプログラムを開いてSystem / Library / CoreServices / SpringBoard.appディレクトリに移動し、ディレクトリの内容をコンピューターにコピーして、さらなる調査と修正を行います。
ここでは、多くの.pngファイルとローカリゼーションデータが保存されているフォルダーを確認できますが、これには興味がありません。 アプリケーションコード自体に興味があり、このコードはSpringBoardファイルにあります。

IDAを起動し、その中のSpringBoardファイルを開き、表示されるウィンドウで[OK]をクリックし、次のすべてのウィンドウで[OK]をクリックします。
しばらくすると、コード分析が完了し、逆アセンブルされたリストが表示されます
ご覧のとおり、すべての関数には「クラス+メソッド名」という形式の「人間の」名前が付いています。 これで、スプリングボード自体の改造を開始できます。
デスクトップアイコンの最大数を変更する
アイコンのデスクトップで見ることができるように、水平方向に最大4個、垂直方向に最大4個を配置できますが、この制限を変更して非常に簡単に変更できます。 もちろん、最も単純なオプションはsidiaから調整することですが、このオプションは私たちには適していません。目標を達成するために実行可能ファイルにパッチを適用します。
関数「SBIconList maxIconRows」を開きます
この関数のアルゴリズム全体は、4という数値を返すことです。この数値は、デスクトップ上の垂直アイコンの最大数であり、5ずつ変更することをお勧めします。
この制限を変更するには、ファイル内の「MOV R0#4」命令のオフセットを見つける必要があり、これは非常に簡単に行われます。このため、命令0x4DE18のアドレスを0x1000にする必要があり、実行可能ファイル内の命令のオフセットを4CE18に取得します。
HEXエディターを開き、オフセット4CE18に移動します
図で強調表示したバイトには、デスクトップ上のアイコンの数が垂直方向にあり、その値を5に変更して保存します。
ファイルを保存した後、IFunBoxに移動し、元のSpringBoardファイルを変更されたファイルに置き換えます。次に、電話を再起動して結果を確認します。
変更前
後
数字の5の代わりに、他の数字を入力できます。 次に、アイコンの数を垂直方向に変更し、このために、隣接する関数「 SBIconList maxIconColumns 」に移動して、前回とまったく同じようにします。
アイコンの数を垂直方向に6ずつ変更します。これにより、コマンドのオフセットを計算し、ファイルに再度パッチを適用して、デバイスにダウンロードします。
デスクトップは次のようになります
では、アイコンがまったく表示されないようにしましょう
この変更はほとんど役に立ちませんが、経験を積むためだけでなく、楽しむためにも役立ちます。
関数「SBIconModel isIconVisible」に移動します
この関数は、アイコンを表示するかどうかを決定し、対応する結果を返します。 関数がアイコンを表示する必要があると判断した場合は1を返し、解が負の場合は0を返します。
私たちのタスクは、常に0を返すように関数を微調整することです。
「グラフ表示」モードを開き、機能図を見てください。 2番目のブロックに注意を払いましょう。それよりも後の条件付き遷移とその先に注目してみましょう。

関数の最後に、結果に応じて、すべてのブランチが2つの可能な場所で終了することがわかります。

上記で説明した条件付き遷移は、条件が満たされた場合、レジスターR3に番号0が割り当てられているブロックに進み、条件が満たされない場合、遷移は実行されず、さらなる計算がアイコンの表示を開始します。
最も単純なオプションは、CMPコマンド、またはむしろその引数を、たとえば2ずつ変更する必要があるブランチで常に遷移が発生するようにすることです。

しかし、少し複雑な方法で進めて、BNEコマンド(条件が満たされない場合の遷移)をBEQコマンド(条件が満たされる場合の遷移)に置き換えます。 確かに、この状況では、条件を単純に反転します。つまり、理論的には表示されるべきアイコンはこれを停止し、表示されるべきではないアイコンは表示されます。
HEXエディターでBNEコマンド(CMPの後に表示されます)のアドレスを開きます

このコマンドは2バイトかかります。 最初は「ジャンプ」する必要があるオフセットであり、2番目は変更する必要があるコマンドのオペコードです。
0XD1であるBNEコマンドのオペコードをBEQコマンド0xD0のオペコードに変更し、その後、変更したファイルをデバイスに保存してロードします。
下のスクリーンショットでは、結果

恐竜の構造を研究することにした理由
最初のモデルのiPhoneを長い間夢見ていたのですが、ごく最近になって購入する機会があり、非常に良い状態でした。 1週間使用した後、簡単に使用するには不十分になり、ボンネットの下にあるものを見つけることに熱心でした。 リバースエンジニアリングのアセンブラーの知識と経験はすでにありましたが、内部のiOSデバイスに関するドキュメント(外国語であっても)がほぼ完全に存在しないため、非常に複雑でした。そのため、試行錯誤で学ぶ必要がありました。
この記事に興味がある場合は、2番目のパートで、最初のiPhoneのファームウェアの変更に関する多くの興味深い情報を説明します。