2016-08-10 13 views
0

でEICARテストファイルをアセンブルすることはできません私は、EICARテストファイルを逆アセンブルし、次のコードを得た:はNASM

[org 100h] 
pop ax 
xor ax,214Fh 
push ax 
and ax,4140h 
push ax 
pop bx 
xor al,5Ch 
push ax 
pop dx 
pop ax 
xor ax,2834h 
push ax 
pop si 
sub [bx],si 
inc bx 
inc bx 
sub [bx],si 
jge 0140h 
db "EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$" 
dec ax 
sub cx,[bx+si+2Ah] 

私は理解していないが、なぜ私が使用してバックDOSのCOMファイルにそれを組み立てるしようとすると、それは動作しませんnasm -fbin、それは私に(実行しません)次のような出力が得られます。

それは実際にあるべき
X5O!P%@AP[4\PZX54(P^)7CC)7..".EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* 

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* 

NASMで何が問題になったのかを指すポインタはありますか?

PS1:古いA86 Assemblerを使用している場合、それは完全にうまく動作します。

PS2:私はWindows 7 32ビットを使用しています。

+0

おそらくNASMでは、コード内に文字列フィールドがあることを示すORをDATAエリアに移動し、CODEエリアから抑制する一種のディレクティブを作成する必要があります。互換性に関する情報を見つけるには、NASMのマニュアルを参照する必要があります。 –

+1

EICARは自己修正コードなので、文字列をDATAエリアに移動することはできません。そのため、文字列**はアドレス0x1Cで開始し、アドレス0x140で終了する必要があります。 –

答えて

2

は、-O0(首都 "o" は、ゼロは)すべての最適化をオフにしますNASM -O0 -fbin

を試してみてください。 Nasmはあなたを助けようとします。また

、あなたがソースコードを少し...

bits 16 
[org 100h]  
pop ax 
xor ax,214Fh 
push ax 
and ax,4140h 
push ax 
pop bx 
xor al,5Ch 
push ax 
pop dx 
pop ax 
xor ax,2834h 
push ax 
pop si 
sub [bx],si 
inc bx 
inc bx 
sub [bx],si 
db "}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$" 
dec ax 
sub cx,[bx+si+2Ah] 

を微調整する場合、それは動作します。私のAVは出力にフラグを立てました。

その問題が問題になっているようです。さまざまな長さのジャンプなど、ファイルの違いを説明している可能性があります。特に、出力が正しい出力とは異なる長さのように見えます。

+0

今は完璧に動作します!私はちょうどあなたが文字列で行った小さな微調整の意味を知ることができますか? –

+0

確かに - 私は2つのことをしました。正しくアセンブルしていないjge命令を削除し、文字列にない文字を追加しました。 .comファイルの正しいバージョンは68バイトです。あなたのソースコードのものは70バイトの長さだったので、jge命令は、相対アドレスジャンプの代わりに絶対アドレスにアセンブルされていたと私は考える。 – querist

+1

私はついにそれを得ました:私はNASMに、ショートジャンプであることを明示的に指定しなければならなかったので、コードに唯一の変更は 'jge short 140h'です。これは、 '0F 8D 22 00'(4バイトのオペコード)の代わりに、実際に' 7D 24'(ショートジャンプの2バイトオペコード)に変換される文字列に '} $'を追加したときに_implicitly_したことです。走り幅跳び)。 –