2017-10-08 142 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