2017-10-08 137 views
2

我需要附近跳转(E9 XX XX)并指定在代码中,但TASM(和MASM)在组装后将其更改为Short(EB XX NOP)。附近跳转自动短跳

MAIN SEGMENT BYTE 

ASSUME CS:MAIN,DS:MAIN,SS:NOTHING 

ORG 100H 


HOST: 

jmp NEAR PTR VIRUS_START 

db ’VI’ 

mov ah,4CH 

mov al,0 

int 21H ;terminate normally with DOS 

COMFILE DB ’*.COM’,0 ;search string for a com file 
VIRUS_START: 
+0

它为什么重要?你是否试图让我们*帮助你使病毒发挥作用? –

+0

我需要这个为教育目的,请帮助,如果你知道,谢谢 –

+0

我一直很高兴,当汇编修复我的跳跃,并从未试图让它不这样做。 –

回答

3

一个简单的方法来强制使用附近跳代替跳转有足够的字节来跳过去!

  • 既可以使用一些填充像:

    COMFILE DB ’*.COM’,0 ;search string for a com file 
    padding db 127 dup (0) 
    VIRUS_START: 
    
  • 否则标签VIRUS_START

另一种可能性是为编码前添加一些有用的子程序(S)手动跳转。
只要写db 0E9h, 14, 0

1

我不知道MASM或TASM的答案,但也许这将是有用的人:

在NASM,jmp near VIRUS_START确实执行长编码。你也可以使用像add dx, strict word 1这样的东西强制imm16编码而不是imm8。见http://www.nasm.us/doc/nasmdoc3.html#section-3.7

; ASSUME: I think there's a way to port that to NASM, but IDK how. 
ORG 100H 

HOST: 
jmp NEAR VIRUS_START ; with override 
jmp VIRUS_START  ; without 
... ; your code unmodified 
VIRUS_START: 

组装与nasm -fbin foo.asm。然后看看我们用ndisasm -o 0x100 foo(它只知道平面二进制文件)得到了什么:

00000100 E91000   jmp 0x113 
00000103 EB0E    jmp short 0x113