Assembly 近距离跳远自动变为短距离跳远
我需要近跳转(E9 XX XX)并在代码中指定,但TASM(和MASM)在组装后将其更改为短跳转(EB XX NOP)Assembly 近距离跳远自动变为短距离跳远,assembly,dos,masm,tasm,short,Assembly,Dos,Masm,Tasm,Short,我需要近跳转(E9 XX XX)并在代码中指定,但TASM(和MASM)在组装后将其更改为短跳转(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 ;
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:
- 或者在标签开始之前添加一些有用的子例程
只需编写
db 0E9h,14,0
我不知道MASM或TASM的答案,但这可能对某些人有用:
在NASM中,jmp靠近VIRUS_START
执行长编码。您还可以使用adddx、strict word 1
等工具强制imm16编码,而不是imm8编码。看
使用nasm-fbin foo.asm进行组装
。然后看看我们通过ndisam-o 0x100 foo得到了什么(它只知道平面二进制文件):
您可以通过手动编码rel16附近的jmp来绕过汇编程序:
db 0E9h ; JMP NEAR opcode
dw VIRUS_START-$-2 ; relative address
$是当前指令(dw)的绝对地址
下一条指令的($+2)地址(在我们的jmp之后)
(VIRUS_START-($+2))-目标地址(VIRUS_START)和下一条指令之间的差异。在执行JMP指令期间,它将被添加到IP寄存器。这有什么关系?你是想让我们帮助你让你的病毒工作吗?我需要这个是为了教育目的,如果你知道的话,请帮助,谢谢。当汇编程序修复我的跳转时,我一直很高兴,从来没有试图让它不这样做。谢谢你的回复,但在这个示例中,我不需要汇编程序优化,我需要一种方法来禁用它,虽然这段代码可以解决这个问题,但如何以及为什么解决这个问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。
00000100 E91000 jmp 0x113
00000103 EB0E jmp short 0x113
db 0E9h ; JMP NEAR opcode
dw VIRUS_START-$-2 ; relative address