HEXエディターでライブラリを編集しながら、その完全性を維持します

StackOverflow https://stackoverflow.com/questions/3709314

  •  02-10-2019
  •  | 
  •  

質問

HEXエディターのライブラリを編集しようとしています。主なポイントは、いくつかのエントリの名前を変更することです。 「otherwrite」モードで作成すると、すべてが正常に機能しますが、「挿入」モードで文字列の最後にいくつかのシンボルを追加しようとするたびに、ライブラリはロードできません。ここで見逃しているものはありますか?

役に立ちましたか?

解決

はい、あなたはたくさん欠けています。ライブラリが続きます PE/ff ファイル全体のポインターで非常に重い形式。 (たとえば、ファイルの先頭に向かって、ファイル内の各セクションの場所を指すテーブルがあります)。

リソースを編集している場合、編集後のポインターとサイズを修正することを確認すると、物事を壊すことなくそれを行う可能性がありますが、簡単になるとは思いません。 .textセクション(つまり、コード)を編集している場合、関数呼び出しとジャンプのオペランドはコード内の位置に相対的な場所であるため、それを完了させるとは思いません - 更新する必要があります編集を考慮するコード全体。

これを克服する手法の1つは「コード洞窟」です。ここでは、既存のコードの一部を空の場所に明示的なJMP命令に置き換えます(実行時にこれを行うことができます。ここで新しいメモリを作成する機能があります) - ここで任意の長さである可能性のある新しいコードを定義します。その後、明示的にJMPから呼び出した場所に戻ります(+5バイトはJMP OpCode + Operandについて発言します)。

他のヒント

名前は古い名前と同じ長さに変更していますか?そうでない場合、すべてのオフセットがシフトされます。そして、関数のいずれかが互いに呼びますか?それは別の問題ポイントかもしれません。ソースコードを(社内ではない場合はプロジェクトのWebサイトから、またはベンダーが閉じられている場合はベンダーから)取得し、その中に変更してから再コンパイルします。とにかくあなたが名前を変えている理由について私は興味があります。

DLLは複雑なバイナリ形式(つまり、コードをコンパイルします)です。コンパイルプロセスは、名前付き関数呼び出しをファイル内の特定の位置(「オフセット」)へのハードワイヤード参照に変換します。したがって、文字をファイルの中央に挿入すると、そのポイントの後のオフセットは、実際に参照される位置にあるものと一致しなくなります。まったく)。

基本的に、一番下の行は、あなたがしていることは常に物事を壊すことです。あなたが不運であれば、それはそれを壊すかもしれません 本当 ひどく、深刻な損害を引き起こします。

確かに - 形式の詳細な知識と、何が変更されなければならないか。編集の一部がロードが失敗する理由を疑問に思っている場合、その知識が欠けています。

ライブラリは、リンカーを使用するためにリンカーによって作成されることを目的としています。彼らは、リンカーが書き込みと読み取りを簡単にすることを目的とした明確な形式に従います。コンパイラーのように、人間の入力に対する耐性は必要ありません。

非常に簡単に言えば、ライブラリはHEXエディターによって変更されることを意図していません。エントリを同じ長さの名前で上書きすることでエントリを変更するか、どこかでインデックスを台無しにする可能性があります。何かの長さを変更すると、ポインターとメタデータを破る可能性があります。

あなたはこれをやりたい理由を与えません。それが楽しみのためであれば、それはあなたが思っていたよりも難しいです。別の理由がある場合は、ソースを取得するか、ソースを持っている人に名前を変更して再構築する方がよいでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top