2017-12-12 16 views
0

、ラベルの付いた例は次のようになります。x64 asmのRIPに相対的なジャンプで1命令だけをスキップするにはどうすればよいですか?私はラベルを使用せずに、正確に1命令をスキップしようとしている

cmp r12, r13 
je dest ; skip the jmp 
jmp whatever 
dest: 
nop 

しかし、私の制限は、私がラベルを使用することができないということですので、私は、私はジャンプを作成する必要がありますと仮定RIPレジスタを基準にして例えば(擬似):

cmp r12, r13 
je rip+0x05 ; this would obviously depend on the length of the next instruction 
jmp whatever 
nop 

しかし、私が働いて何かを作るための知識が不足している、また、私の知る限りでは、それは読んですることはできません/ハックすることなく、RIPレジスタを記述します。

編集:私はIntelの構文に精通しており、私はアセンブラとしてKeystoneを使用しています。私はバイトをアセンブリから取り出し、実行可能なメモリの場所にロードします。アセンブリからバイトを取得するために私自身のウェブサイトを使用していますが、itを見ればそのアイデアを得るかもしれません。

EDIT 2:しかし、私は両方のキーストーンでは動作しないことを確認することができます

je .+0x05 
; or 
je $+0x05 

私が使用することをお勧めジェスターズとマーガレット・ブルームのコメントを、試してみました!幸いにも、私はキーストーンは、このコードを処理することが可能であることに気づい:

je +0x05 

は、これが機能することを確認することができ、誰ですか?

EDIT 3:私はNASMで試してみましたが、$プレフィックスはテストされたコードで正常に動作します。私はそれをテストするために使用した:

section .text  
global [email protected]  

[email protected]: 
    jmp $+2+2 ; skip this jmp and the next jmp (each 2 bytes) 
    jmp $ 
    ret 16 

期待どおりに動作します。また、defuseはキーストーンと同じ出力を生成します。唯一の違いは、デフューザーは$接頭語を使用し、キーストーンはまったく必要ないということです! キーストーンと同等である:

jmp +4 
jmp . 
ret 16 
+1

'je。+ 5'またはアセンブラ(指定しなかったもの)が現在のアドレスをサポートしています。また、ラベルには何が問題なのですか? – Jester

+3

次の命令の長さを知っているなら、これはJesterの言う通りに行うことができます。しかし、あなたが次の指導の長さを知らないなら、チャンスはありません! –

+0

@ Jester、アセンブラはアセンブルしません。 – ioncodes

答えて

3

注NASMとMASMで$が接頭辞ではないこと。 It's a stand-alone keyword/symbol which refers to the address of the current linejmp rel32が5バイトであり、そして短いJCCだからあなたは2バイト命令をスキップする5バイトの命令をスキップするje $+7を必要とする、または$+4 2である:

je $+5は動作しません。

ジャンプは命令の最後からの変位をエンコードするため、rel8の変位は0x05または0x02になります。しかし、NASMの$ラベルは命令の開始アドレスを与え、アセンブラは常にターゲットアドレスに基づいて相対変位を計算します。したがって、$+xでは、現在の命令の長さを含める必要があります。

rel8を自分でエンコードする場合は、db疑似命令を使用して、必要なバイトを出力することができます。例えばあなたは次の命令がでどのくらい知って信頼できる方法を持っていない限り、任意のラベルを使用していないのdb 0xEB, 0x02


あなたの全体のアプローチ/目標は、根本的に欠陥があります。 (例えば、jmp NEARまたはjmp SHORTを使用して、長いエンコードまたは短いエンコードを強制する)。あなたができることは、幅にかかわらず、1命令をスキップするバイト数ではなく、固定バイト数に進むジャンプをエンコードすることだけです。

しかし、真剣にラベルを使用してください。 x86ジャンプは常に相対的なものなので、アセンブラでより簡単に作業を行い、正しい相対変位を計算できます。

+0

答えをありがとう!私は$がシンボルであることを知っていますが、私はその時より良い名前を見つけることができませんでした。私は次の命令の長さを計算する信頼できる方法を持っています。 – ioncodes

関連する問題