2016-05-25 5 views
0

長い命令を短い命令に置き換える場合は、nopをパッドするだけで済みます。インラインで短い命令を置き換える(アセンブリ)

私はどのようにインラインで置き換えますか?

そしてインライン私は、他の空きメモリにはjmpがないことを意味します。

他の言葉で言えば、なにか可能です挿入 more ops?それはどうですか?バイナリのヘッダーは何とか変更する必要がありますか? jmpのすべてのopsで何が起こりますか?(理論的な変更の後も引き続き動作しますか?)絶対jmpがあるのはどうですか?それらも同様に変更する必要がありますか?それ以外は何をすべきか(これが実際に可能な場合)? 、(jmp)(jejneなど)条件付きまたは無条件のか、短いと近い2つの形態で存在し、簡単なジャンプの

すべての種類:

+0

どのコンパイラを使用しますか? – zx485

+0

質問は理論的なので重要ではありませんが、私はhttps://www.onlinedisassembler.com/odaweb/を使ってこれらのオペコードを取得しました。 – alexandernst

+2

私は過去にこれを正確に行うコードを書いていますが、参照を識別して修正するために基本的なオペコード・ディスアセンブラを書く必要があるので、やや複雑です。私は少し違ってアプローチしましたが、命令を追加するのではなく、さらにRAMを割り当て、ロングジャンプ命令で上書きされるアセンブラをコピーして、コピーされたアセンブラのすべての参照を更新して、場所(オンザフライPIC)。ジャンプは私の新しいメソッドを指していました。私の新しいメソッドは、私がコピーした変更されたアセンブラにジャンプして、古いメソッドのコードを継承することができました。 – Geoffrey

答えて

2

は、ここに劇中の問題がいくつかあります前者は符号付きバイトサイズのオフセット(範囲-128〜+127)を持ち、後者は符号付きのdwordサイズのオフセット(範囲-2147483648〜+2147483647)を持っています。

条件付きジャンプの条件を変更する場合、ジャンプサイズを変更する必要はありませんが、目的のターゲットアドレスが範囲外である場合はジャンプのターゲットアドレスを変更することがあります。

実際にジャンプ先を現在のジャンプタイプの範囲外の新しい場所に変更したい場合や、コードサイトでさらに指示を挿入する場合は、コードの場所を変更する必要があります。それの後に来る。

これは、コード内の新しいギャップにまたがっているすべての相対参照を修正することと、ギャップに続く絶対参照を跨ぐことを意味します。参照されるものが再配置される場合は、ギャップの前に。

このような操作の難しさは、コードがどのように構造化されているか、利用可能な情報によっては、適度に複雑なものから不可能なものになります。

コンパイラによってコードが発行され、使用可能なシンボル情報がある場合はそれを実行できます。それ以外の場合は、必要な変更が非常に少ない場合を除き、通常は非常に困難です。

+0

それは私の最初の質問に答える(そして私の恐れを確認する)。 Btw、IDA Proがこれを正しく処理しているかどうか知っていますか?どうやってやっているの? – alexandernst

+0

「ハンドル」の意味がわかりません。 IDA Proは逆アセンブラとしてのみ使用されています。パッチ適用機能があることを漠然と認識していますが、使用していません。 –

1

あなたはマシン命令

A; B; C; D; E; 

を持っていると、あなたはジャンプのための十分なスペースを作るためなど、C、Dを、削除することができ、より大きなXとBを交換する必要がある場合。

セイC; D;は十分です。したがって、最終的に

A; jmp freeSpace; back: E 
... 
<previous end of binary> 
freeSpace: X; C; D; jmp back; 

となります。これは、Cおよび/またはD自体がジャンプしている場合は少し変化します。しかし、あなたはいつもそれを働かせることができます。

私はこれを使用して、紙のアセンブリリストのみが利用可能なバイナリにパッチを当てました。エレガントではないが、うまく動作する。これがIda Proの場合は少し驚きません。

+0

確かに、私はその解決策を知っていました。それほど難しいはずはありませんが、ハッキリを感じます。 – alexandernst

+0

@alexandernst私が言ったように、 "エレガントではない" ... – Gene

関連する問題