批处理输入密码但不显示字符的代码---分析

从中国DOS联盟看到这个帖子:批处理输入密码但不显示字符的代码

感觉很有趣,分析一下:

  1. @echo off
  2. :echo hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x>in.com
  3. echo hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5>in.com
  4. set /p password=Enter password:<nul
  5. echo %password%
  6. for /f "tokens=*" %%i in ('in.com'do set password=%%i
  7. :pause
  8. del in.com
  9. echo.
  10. echo The Password is:"%password%"
  11. set password=
  12. pause
  13. goto exit
  14. comment:all data or code are printable!!!
  15. for /f "tokens=*" %%i in ('in.com'do set password=%%i
  16. variable i is the output string of program in.com
  17. in.com==hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x==>
  18. xxxx:0100 68 50 31 58 35 30 30 50-5B 50 5A 42 42 42 66 68 hP1X500P[PZBBBfh
  19. xxxx:0110 23 62 23 23 66 58 66 2D-56 40 60 24 66 50 66 5D #b##fXf-V@`$fPf]
  20. xxxx:0120 66 33 2F 66 31 2F 35 2B-2B 75 35 78 0D 0A 00 00 f3/f1/5++u5x....
  21. in.com:
  22. xxxx:0100 685031 PUSH 3150h
  23. xxxx:0103 58 POP AX;ax=3150
  24. xxxx:0104 353030 XOR AX,3030h;ax=160
  25. xxxx:0107 50 PUSH AX
  26. xxxx:0108 5B POP BX;bx=160 <--
  27. xxxx:0109 50 PUSH AX
  28. xxxx:010A 5A POP DX;dx=160;can not use 'add dx,3'-->83C203 is not printable char
  29. xxxx:010B 42 INC DX;dx=161;printable char [0x20,0x7E]
  30. xxxx:010C 42 INC DX;dx=162;
  31. xxxx:010D 42 INC DX;dx=163 <--buffer base address
  32. xxxx:010E 666823622323 PUSHD 23236223h
  33. xxxx:0114 6658 POP EAX;eax=23236223h
  34. xxxx:0116 662D56406024 SUB EAX,24604056h;eax=FEC321CD;not printable char instruction,use this method(modify code 
  35. segment) or stack.
  36. xxxx:011C 6650 PUSH EAX
  37. xxxx:011E 665D POP EBP;ebp=FEC321CD,'FE'-->max char to input,'C3'-->RET,'CD21'-->INT 21
  38. xxxx:0120 66332F XOR EBP,[BX]
  39. xxxx:0123 66312F XOR [BX],EBP;[BX]=ds:[160]=cs:[160]=FEC321CD=INT 21,RET,buffer size
  40. xxxx:0126 352B2B XOR AX,2B2Bh;eax=FEC30AE6, ah=0A
  41. xxxx:0129 7535 JNZ Short 0160;yes
  42. xxxx:012B 780D JS Short 013A;78 is not needed,'x'
  43. xxxx:012D 0A00 OR AL,[BX+SI]
  44. xxxx:012F 0000 ADD [BX+SI],AL
  45. xxxx:0131 0000 ADD [BX+SI],AL
  46. xxxx:0133 0000 ADD [BX+SI],AL
  47. xxxx:.... .... ...
  48. xxxx:0160 CD21 INT 21h;ah=0A: get keyboard input to buffer. ds:dx=buffer base address,[ds:dx]=max buffer size,
  49. [ds:dx+1]=actual buffer size
  50. xxxx:0162 C3 RET
  51. xxxx:0163 FE <--max char to input
  52. xxxx:0164 x <--buffer_size
  53. xxxx:0165 <-- buffer

不过,还是有一点不理解,为什么变量password可以取到in.com的buffer的字符串呢??

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值