附近跳转自动短跳
问题描述:
我需要附近跳转(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:
答
一个简单的方法来强制使用附近跳代替短跳转有足够的字节来跳过去!
-
既可以使用一些填充像:
COMFILE DB ’*.COM’,0 ;search string for a com file padding db 127 dup (0) VIRUS_START:
否则标签VIRUS_START
另一种可能性是为编码前添加一些有用的子程序(S)手动跳转。
只要写db 0E9h, 14, 0
答
我不知道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
它为什么重要?你是否试图让我们*帮助你使病毒发挥作用? –
我需要这个为教育目的,请帮助,如果你知道,谢谢 –
我一直很高兴,当汇编修复我的跳跃,并从未试图让它不这样做。 –