2016-08-10 2 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 파일을 조립하려고 할 때

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 -fbin 그것은 나에게 다음과 같은 출력을 (실행하지 않음) 제공 작동하지 않습니다

NASM에 무엇이 잘못 되었습니까?

PS1 : 이전 A86 Assembler을 사용할 때 완벽하게 작동합니다.

PS2 : Windows 7 32 비트를 사용하고 있습니다.

+0

아마도 NASM에서 코드의 문자열 필드가 DATA 영역으로 이동하고 CODE 영역에서 멈춤을 나타내는 일종의 지시문을 작성해야합니다. 일부 호환성 정보를 찾으려면 NASM 문서를 봐야합니다. –

+1

EICAR은 자체 수정 코드이므로 문자열을 DATA 영역으로 이동할 수 없으므로 문자열 **은 주소 0x1C에서 시작하고 주소 0x140에서 끝나야합니다. –

답변

2

-fbin (대문자 "O", 영) 모든 최적화를 끌 것 -O0을 NASM -O0을보십시오. 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

물론 - 두 가지를했습니다 : 올바르게 조립되지 않은 jge 명령을 제거하고 문자열에서 누락 된 문자를 다시 추가했습니다. .com 파일의 올바른 버전은 68 바이트입니다. 소스 코드에서 나온 길이가 70 바이트 였으므로 jge 명령어는 상대 주소 점프가 아닌 절대 주소로 어셈블됩니다. – querist

+1

마침내 알았습니다. NASM이 짧게 건너 뛰기 만 했으므로 코드에 대한 유일한 변경 사항은'jge short 140h'입니다. 실제로 문자열에 '} $'을 추가했을 때 정확히 무엇을했는지는 정확히 알려지지 않았습니다. 실제로는 '0F 8D 22 00' (4 바이트의 opcode) 대신'7D 24 '(짧은 점프의 2 바이트 opcode)로 변환됩니다. 멀리뛰기). –