2017-07-01 7 views
1

私はIOSの開発者で、私は客観的なCを知っています。私は同じMacで利用可能な別のアプリをパッチすることが唯一のスタンドアロンのMacアプリケーションを作りたいと思っています。ソフトウェアパッチャーをMacで作成する

私は自分のアプリケーションフォルダにXという名前のアプリがあるとします。このアプリXは望ましくない動作をします。だから私はこの動作を修正しようとしました。私はホッパーの逆アセンブラの助けを借りてアプリケーションの実行可能ファイルを分析し、00000001003e3790で始まるアセンブリ命令を変更しなければならないことを知りました。私はそれらのアセンブリ命令を変更し、新しい実行可能ファイルを生成しました。それから、私は古いものを新しい実行可能ファイルに置き換えました。そして、その望ましくない振る舞いは今や消え去っているようです。

ほとんどの人がこの望ましくない動作を排除したいと思っていたので、私はパッチャーを書いてそれらにパッチャーを配布することに決めました。

どうすれば私のパッチャーアプリでアプリケーションXの実行ファイルの中で利用可能なアセンブリ命令を変更し、元のものを自分の修正版に置き換えることができますか?

誰かが私を正しい方向に助けてくれれば素晴らしいだろう。

+1

これはApp Storeで決して承認されない動作のようです。 –

+1

@David私はアプリストアで私のアプリをリリースするつもりはない。 –

答えて

2
  1. 通常、/Applications/に見つからない場合は、アプリケーションバンドルの場所をユーザーに問い合わせる必要があります。
  2. パッチを適用する前の実行ファイルと同じバンドル内のターゲット実行可能ファイルに同じハッシュ(CRC、MD5、SHAなど)があるかどうかを確認する必要があります。
  3. ハッシュが一致する場合は、ファイルを書き込み用に開き、誤った命令が格納されているハードコーディングされた場所を探します。 16進エディタでパッチされたファイルを検索して、パッチされたバイトで始まる十分長いバイト文字列を探して、その場所を特定できます。
  4. 最後に、ターゲットバイトを自分のものに書き換えて(a.k.a.パッチ)、ファイルを閉じます。

[UPD。] [3]のコード例。

これは、任意のにObjC関連のメカニズムを必要とせず、構築することができ、唯一の平野libcを使用して実行します。

long PatchSomething(char *name, char *data, size_t offs, size_t size) { 
    long file = open(name, O_WRONLY); 
    if (file != -1) { 
     lseek(file, offs, SEEK_SET); 
     write(file, data, size); 
     close(file); 
    } 
    return file != -1; 
} 

  • nameがパッチへのファイルの名前です。
  • dataは、書き込まれるデータです。
  • offsは、ファイルオフセットです。データを入れてください
  • sizeはデータサイズです。ファイル内の古いバイトの正確にsizeが書き換えられます
+0

あなたの答えは本当にありがとうございます。ステップ1,2および4は明らかである。ステップ3を実装するためのサンプルコードを提供するともっと役に立ちます。実行可能なアセンブリを目的コードcで開き、パッチを挿入する正確な場所を見つける方法と同様です。 –

+0

@ JafferSheriffは、バイナリデータを含むファイルとして、実行可能ファイル(バンドルではなく、 '。/ Content/MacOS'の中にある非常に実行可能なファイル)を扱います。これは本当にあなたが考えるほど複雑ではありません。私の答えを編集しました。 – hidefromkgb

+0

感謝の男私はそれをして本当に貴重な助けを感謝:) –

関連する問題