22

アプリケーションの実行中に個々のアセンブリ命令を変更するにはどうすればよいでしょうか?

既存のアプリケーション用に書いている Mobile Substrate の微調整があります。微調整のコンストラクター ( MSInitialize) では、アプリのコード内の個々の命令を書き直すことができる必要があります。つまり、アプリケーションのアドレス空間には変更したい場所が複数ある可能性がありますが、各インスタンスで変更する必要があるのは 1 つの命令だけです。私はすでにアプリケーションの ASLR を無効にしており、パッチを適用する命令の正確なメモリ アドレスを知っています。また、新しい命令の 16 進バイト (char[] として、ただしこれは重要ではなく、必要に応じて変更できます) を持っています。変更を実行する方法を理解する必要があります。

iOS がデータ実行防止 (DEP) を使用して、実行可能メモリ ページも書き込み可能にできないこと、およびその逆を指定することは知っていますが、ジェイルブレイクされたデバイスではこれをバイパスできることはわかっています。また、iDevices で使用される ARM プロセッサには、変更を反映するために更新する必要がある命令キャッシュがあることも知っています。しかし、私はこれをどこから始めるべきかさえ知りません。

ですから、そうでなければきっと尋ねられるであろう質問に答えるために、私は何も試していません. これは私が怠け者だからではありません。むしろ、これがどのように達成されるのかまったく見当がつかないからです。どんな助けでも大歓迎です。

編集:

それが少しでも役立つなら、私の最終的な目標は、App Store アプリケーションをフックする Mobile Substrate の微調整でこれを使用することです。以前は、このアプリケーションを変更するには、まずアプリを解読してバイナリにパッチを適用できるようにする必要がありました。私は強く反対している著作権侵害につながる可能性があるため、人々がアプリをクラックする必要がないようにしたいと考えています。すべての作業が Objective-C ではなく C++ で行われ、アプリケーションが取り除かれ、使用するシンボルが残っていないため、通常は Mobile Substrate を使用できませんMSHookFunction

4

3 に答える 3

4

適切なジェイルブレイクでジェイルブレイクされていると仮定して、vm_protect を w^x にします (たとえば、mobilesubstrate が機能する場合)。

于 2012-12-19T20:44:48.957 に答える
3

プロセッサレジスタから命令メモリへの書き込みは、他の人が上で述べたように、少し注意が必要です。特に iPhone では、Apple がプロセッサの詳細を秘密にしようとしているためです。

最初の問題は、メモリ アクセスのパーミッションです。実行可能メモリは通常、書き込み可能ではありません。ただし、これが克服された場合、プロセッサ レジスタから命令パイプラインにデータを取得するために、少し手間がかかります。一般に、前後のメモリアクセスに特定の順序を強制する同期命令と、ダーティな書き込みデータをメモリに強制的に出力し、クリーンで古い可能性のある読み取りデータをフラッシュするキャッシュコマンドがあります。これらは両方とも、プロセッサの詳細な実装に大きく依存しています。

Arm には、特定のプロセッサについてこれらを詳細に説明する素晴らしいマニュアルがウェブ上にあります。ただし、iPhone 内のプロセッサが Arm の公開マニュアルに記載されているとおりに動作するかどうかはわかりません。

1 つのプロセッサの Arm メモリ同期モデルの理解を開始する場所は次のとおりです : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0092b/ch04s03s04.html制御レジスタへの書き込みによって命令キャッシュをフラッシュする方法を教えてください。Arm プロセッサ用の自己変更コードを作成することは確かに可能です。そのマニュアルのどこかに、それは避けられない場合があり、サポートする必要があると書かれている文を見つけたからです。

(これが答えだと主張しているわけではありませんが、コメントには収まりません。)

于 2012-12-01T15:57:00.030 に答える