标题: ASCII Assembly代码分析之in.com
作者: Demon
链接: https://demon.tw/programming/ascii-assembly-in-com.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。
在《ASCII Assembly技术简介》中提到了这么一段代码:
: by Herbert Kleebauer
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
echo hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x>in.com
set /p password=Enter password:<nul
for /f "tokens=*" %%i in ('in.com') do set password=%%i
pause
del in.com
echo.
echo The Password is:"%password%"
简单分析一下这个用ASCII Assembly编写的in.com
0100 68 50 31 push 3150h ; By Demon, https://demon.tw
0103 58 pop ax ; ax = 3150
0104 35 30 30 xor ax, 3030h ; ax = 0160
0107 50 push ax
0108 5B pop bx ; bx = 0160
0109 50 push ax
010A 5A pop dx ; dx = 0160
010B 42 inc dx
010C 42 inc dx
010D 42 inc dx ; dx = 0163
010E 66 68 23 62 23 23 push 23236223h
0114 66 58 pop eax ; eax = 23236223
0116 66 2D 56 40 60 24 sub eax, 24604056h ; eax = FEC321CD
011C 66 50 push eax
011E 66 5D pop ebp ; ebp = FEC321CD
0120 66 33 2F xor ebp, [bx]
0123 66 31 2F xor [bx], ebp ; [160] = FEC321CD
0126 35 2B 2B xor ax, 2B2Bh ; eax = FEC30AE6, ah = 0A
0129 75 35 jnz 0160h ; 跳转到0160
012B 78 ; 最后的78是多余的
012C 0D 0A ; 0D 0A是echo的功劳
; 中间是什么不重要
0160 CD 21 int 21h ; 调用DOS中断, ah = 0A
; 键盘输入到缓冲区, ds:dx指向缓冲区
; byte ptr ds:[dx]为最大字符数
0162 C3 ret ; 返回DOS
0163 FE ; 最多允许输入254个字符
可见这个in.com的核心代码是DOS中断int 21h ax = 0Ah,由于只能使用ASCII字符来编写,所以人为的构造出上面复杂的代码,如果用一般的汇编来写,大概是这样:
.model tiny
code segment
org 100h
;By Demon
;https://demon.tw
start:
mov dx, offset buf
mov ah, 0Ah
int 21h
ret
buf db 0FEh
db 0
db 0FEh dup (0)
code ends
end start
当然,这段代码很久以前就有人分析过了(见《关于 批处理中 密码输入隐藏 我老师给出的解释》),这里再分析一次没什么新意,来点新的东西:
:: By Demon
:: https://demon.tw
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
echo , P_0E:0E=0E?!]@K1]@50050:mU@-!#>in2.com
set /p password=Enter password:<nul
for /f "tokens=*" %%i in ('in2.com') do set password=%%i
del in2.com
echo,
echo The Password is:"%password%"
pause
代码比Herbert Kleebauer的要短一些,不过里面出现了感叹号,兼容性没有他的好。
赞赏
微信赞赏
支付宝赞赏
随机文章:
回来了?