0

私の目標は、ARM プラットフォーム上のストリップされたバイナリにシンボルなしで C 関数をフックすることです。これらの関数のアドレスは変更される可能性があるため (つまり、バイナリの更新により)、介在する動的ライブラリ自体にアドレスを見つけてもらいたいと考えています。

さらに、これらの関数は、ある時点で、更新によって決して変更されない C 文字列を使用します。これを念頭に置いて、関数のアドレスを見つけるための 3 つの手順を次に示します。

1) C 文字列自体のアドレスを見つける (セグメント__cstring内のセクションを分析することによって.__TEXT

2) 文字列への参照のアドレスを見つけます。

3) xref アドレスから始めて、関数のプロローグが見つかるまでさかのぼります。

ステップ1)と3)は実装できましたが、2)については少し迷っています。外部参照とは正確には何ですか? C-string に対応するものを特定するにはどうすればよいですか? コードは必要ありません。理論だけです。

ありがとう !

4

2 に答える 2

0

文字列とその xref (LDR R5、= 0xnnnnnn) の検索の代わりにできることは、関数のエピローグを含むバイト配列を作成し、それを検索することです。検索に使用するバイト数が多いほど、一意性が高まります。(C / ASCII)文字列を使用するのはうまくいかず、手動で(IDAで手動で)作業する場合のみ

それ以外の場合は、逆アセンブラー エンジン (IDA の命令をデコードし、x86 プラットフォームの命令に匹敵するもの) を実装し、各命令を解析する必要があります。

于 2015-07-14T17:46:35.663 に答える
0

すべてのコードを逆アセンブルして、どのコードがメモリから読み取られるかを判断する必要があります。メモリから読み取る命令のアドレスをデコードする必要があります(ARMが相対か絶対かはわかりません)。さらに、すべてを適切に逆アセンブルするには、既知のエントリ ポイントから開始し、すべての呼び出しをたどって関数の開始位置を特定する必要があります (ARM には可変サイズの命令、つまり即値を含む命令があると想定しています)。これは簡単なことではありません。相互参照分析は、リバース エンジニアリング ソフトウェア (たとえば IDA Pro など) のかなり重要な機能です。さらに、メモリが直接アクセスされない場合は、すべての間接的なメモリ アクセス (レジスタを介したアクセス) を分析する必要があります。

于 2012-10-01T22:27:52.227 に答える