标题: 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的要短一些,不过里面出现了感叹号,兼容性没有他的好。
赞赏微信赞赏支付宝赞赏
随机文章:
回来了?