ASCII Assembly代码分析之in.com

标签: , , , ,

在《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, http://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
        ;http://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
:: http://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的要短一些,不过里面出现了感叹号,兼容性没有他的好。

随机文章:

  1. TiddlyWiki
  2. VBS文件拖拽的个数限制(无法执行 – 参数列表过长)
  3. 理解PHP中的stdClass类
  4. 邪恶的eval和new Function
  5. 用VBS处理二进制文件的实例

一条评论 发表在“ASCII Assembly代码分析之in.com”上

  1. still说道:

    回来了?

留下回复