批处理输入密码但显示其他符号
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
方法1:不显示*号
@echo off
chcp 936>nul&graftabl 936>nul
echo hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x>
set /p password=请输入密码:
del
echo.
echo The Password is:"%password%"
pause
中的
echo hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x>
这一句问了一下我的老师;他给我讲解是这样的:我觉得更清楚更容易理解些;
拿出来分享一下
这个例子中的文件名是加了单引号,这就意味着这是一个外部命令,
也就是说,它是要被执行的。
经过反汇编后,代码如下:
00000000: 685031 push 3150
00000003: 58 pop ax ; AX=3150
00000004: 353030 xor ax,3030 ; AX=0160
00000007: 50 push ax
00000008: 5B pop bx ; BX=0160
00000009: 50 push ax
0000000A: 5A pop dx ; DX=0160
0000000B: 42 inc dx
0000000C: 42 inc dx
0000000D: 42 inc dx ; DX=0163
0000000E: 666823622323 push 23236223
00000014: 6658 pop eax ; EAX=23236223
00000016: 662D56406024 sub eax,24604056 ; EAX=FEC321CD
0000001C: 6650 push eax
0000001E: 665D pop ebp ; EBP=FEC321CD
00000020: 66332F xor ebp,dword ptr [bx] ; EBP=EBP ^ [0160]
00000023: 66312F xor dword ptr [bx],ebp ; [0160]=FEC321CD
; +0160 CD
; +0161 21
; +0162 C3
; +0163 FE
其中+0160 与 +0161中的两个字节CD 21反汇编出来就是int 21h指令
+0162中的C3反汇编出来就是ret指令
最后那个+163中的FE是DOS输入功能0Ah的参数(前面的DX=0163就是指向了这个FE),
表示最多允许输入254个字符(包括回车在内)
00000026: 352B2B xor ax,2B2B ; AX=0AE6,其中0Ah是DOS功能号,
; E6没有用处
00000029: 7535 jnz 00000060 ; 这里肯定会发生跳转,相当于jmp 160
0000002B: 78 ; 最后的78无用
0000002C: 0D ; 0D与0A是echo时自动
0000002D: 0A ; 产生的回车换行符
程序跳转到160后,就会执行以下指令:
int 21h ; 此时AH=0Ah, DX=0163h, 因此执行DOS的输入功能,
; 输入内容自动保存到+165开始的缓冲区中,而for循环会把各个字符逐个读出
ret ; 程序返回到操作系统,自动结束
总结一下,这个的
作用是通过键盘输入一串字符,长度不超过254个(含回车)。
这个批处理还是比较巧妙的,它用一串可显示的字符串构造了一个可执行代码,实现了
键盘输入功能,配合for循环使得在批处理中可以实现不回显输入。
P.S.: 根据分析,这个批处理中的echo语句所包含的一堆乱码里的最后
那个字符(即>前面++u5x中的x)可以删除不要。也可就是说,
echo hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x>
可以改成
echo hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5>
方法2:显示*号
@set setPassWord=123456
@echo off&setlocal&pushd %tmp% %Hide password by displaying * {s11ss 2007-12-16}%
<"%~f0" more +10|debug>nul&move t ""
cls&echo ^<---------Input password:(less 32bit)
t
echo exit|cmd /kprompt d20:0 20$_q$_|debug>t
for /f "skip=2 tokens=*" %%a in (t) do set t=%%a&call set t=%%t:~61,16%%&call set s=%%s%%%%t%%
for /f "skip=2 tokens=2" %%a in (t) do set/a l=0x%%a&goto :t
:t
cls&echo The password is:&call set inputPassWord=%%s:~1,%l%%%&&cls
if "%inputPassWord%" equ "%setPassWord%" (
echo yes
) else (
echo no
)
del t &popd&echo.&echo Press any key to exit...&pause>nul&goto :eof
e0100 BB 00 B8 8E C3 BF 00 00 BE 00 00 B4 00 CD 16 80
e0110 FC 0E 75 0E 83 FE 00 74 F2 4E 4F 4F 26 C6 05 20
e0120 EB E9 80 FC 1C 74 1C 3C 20 72 E0 26 C6 05 2A 8C
e0130 C2 BB 00 00 8E C3 26 88 84 01 02 8E C2 83 C7 02
e0140 46 EB C8 BB 00 00 8E C3 8B C6 26 A2 00 02 B8 00
e0150 4C CD 21
rcx
53
n t
w
q