【发布时间】:2026-01-05 11:25:03
【问题描述】:
我有一个老游戏……星际飞行。我想它是在 86 年问世的。好 ol' IBM PC jr 日子。我想我会破解一个反汇编程序,看看它是如何工作的。我可以看到我已经解码的一点点,代码大小肯定是优化的......但我最终跳转到了文件外部的地址。这没有任何意义。
我在下面的列表中添加了 cmets;它们是我的“想法”。
直到其他文件被加载,我假设,int 0x3d 或 int 0x0f... 因为所有的段寄存器都指向同一个内存段.... 而那个段是代码段,.COM 文件,每个内存引用或跳转都应该保留在文件中。是吗?
Starflt.com
00000000 FA CLI ;Prevent interrupts
00000001 8CC8 MOV AX,CS ;Copy code segment to all segments
00000003 8ED0 MOV SS,AX
00000005 8EC0 MOV ES,AX
00000007 8ED8 MOV DS,AX
00000009 BE2901 MOV SI,word 0x0129 ;SI = 0x0129
0000000C 8B7C02 MOV DI,word [SI+0x02] ;DI = 0x3c15 (SI+2)
0000000F 47 INC DI
00000010 47 INC DI ;DI = 0x3c17
00000011 BB0507 MOV BX,word 0x0705 ;BX = 0x0705
00000014 8B1F MOV BX,word [BX] ;BX = 0xa924
00000016 81C30001 ADD BX,word 0x0100 ;BX = 0xaa24
0000001A 8BE3 MOV SP,BX ;SP = 0xaa24 (0x0e41)
0000001C 81C38000 ADD BX,word 0x0080 ;BX = 0xaaa4
00000020 8BEB MOV BP,BX ;BP = 0xaaa4 (0x0bae)
00000022 FB STI ;Restore Interrupts
00000023 FC CLD ;Clear direction flag
00000024 AD LODSW ;AX = DS:SI = 0xfa13
00000025 8BD8 MOV BX,AX ;BX = 0xfa13
00000027 FF27 JMP word [BX] ;Past COM EOF (0xd3a7)
内存:
00000705 24 byte 0x24 '$'
00000706 A9 byte 0xA9 '©'
00000129 13 byte 0x13
0000012A FA byte 0xFA 'ú'
0000012B 15 byte 0x15
0000012C 3C byte 0x3C '<'
0000AA24 41 byte 0x41 'A'
0000AA25 0E byte 0x0E
0000AAA4 AE byte 0xAE '®'
0000AAA5 0B byte 0x0B
【问题讨论】:
-
小世界。如果你认出我肩膀上那漂亮的蓝色,IDK。 (Schlumberger) 我刚拿到 CS 硕士学位。只需要说服某人我值得我的盐。
标签: assembly dos x86-16 disassembly