Board logo

标题: [文本处理] 批处理密码破解 [打印本页]

作者: canyuexiaolang    时间: 2010-7-3 15:01     标题: 批处理密码破解

或许很多人会用
  1. set /p pass=请输入密码:
  2. if "%pass%"=="12345" echo 密码正确!&pause&goto :test
复制代码
但是这样,密码会被破解的!
只要输入 1"=="1" echo
(echo后面有一个空格)
密码就出来了
测试代码与测试结果如下

测试代码
  1. @echo off
  2. :start
  3. set /p pass=请输入密码:
  4. if "%pass%"=="12345" (
  5.      goto test
  6. ) else (
  7.      echo 密码错误
  8.      pause>nul
  9.      goto start
  10. )
  11. :test
  12. echo 密码正确!
  13. pause
复制代码
测试结果
  1. 请输入密码:1"=="1" echo
  2. "=="12345" (
  3. 密码正确!
  4. 请按任意键继续. . .
复制代码
直接通过了,也有不通过的,但是密码早就已经暴露出来了
============================================================
解决方法:

  1. if "%pass%"=="12345" (
  2.      goto test
  3. ) else (
  4.      echo 密码错误
  5.      pause>nul
  6.      goto start
  7. )
复制代码
中的"%pass%"改成
  1. if \\"%pass%"\\==\\"12345"\\ (
  2.      goto test
  3. ) else (
  4.      echo 密码错误
  5.      pause>nul
  6.      goto start
  7. )
复制代码
这样就破解不出来了
作者: raymai97    时间: 2010-7-3 15:38

楼主太厉害了!这样都给你破解到!佩服佩服!!
作者: zqz0012005    时间: 2010-7-3 16:11

原来你们引用密码都不用!password!的形式啊?

set /p pass=请输入密码: " neq "bathome"  (call type "%~f0" & pause) else call type "%~f0" & pause
作者: Seter    时间: 2010-7-3 16:27

LZ试试输入
  1. 1"\\==\\"1"\\ echo
  2. echo后有一个空格
复制代码
提出自己观点前先了解批处理机制
作者: Spring    时间: 2010-7-3 16:41

http://cn-dos.net/forum/viewthread.php?tid=50178
作者: neorobin    时间: 2010-7-3 16:58

再出一盾:
  1. @echo off & setlocal enableDelayedExpansion
  2. set "#12345=pwd" & rem 密码原文为 12345
  3. set /p pwdin=请输入密码:
  4. set "pwdin=!pwdin: =!"
  5. set "pwdin=!pwdin:a=z!"
  6. set "pwdin=!pwdin:e=x!"
  7. set "pwdin=!pwdin:i=c!"
  8. set "pwdin=!pwdin:o=v!"
  9. set "pwdin=!pwdin:u=b!"
  10. for %%p in (!pwdin!) do (
  11.   if not defined #%%p exit
  12.   if !#%%p!==pwd (echo 密码正确...)&pause  
  13. )
  14. exit /b
复制代码
告知 代码使用了 set 和 for 的转换方式, 但 第 2 行, 4--11行具体代码不明, 再求输入方式破解
作者: sgaizxt001    时间: 2010-7-3 21:51     标题: 回复6楼

你的密码设置的太简单了,set /p到for之间完全是误导,没起作用啊。
作者: neorobin    时间: 2010-7-3 21:55     标题: 回复 7楼 的帖子

这只是举例而已, 而且这种做法也是不完善的, 比如产生额外的假密码也可过关

这只是一个想法, 用 3 楼输入
" neq "bathome"  (call type "%~f0" & pause) else call type "%~f0" & pause
的方式是不会显示出代码原文的

[ 本帖最后由 neorobin 于 2010-7-3 21:59 编辑 ]
作者: sgaizxt001    时间: 2010-7-3 21:57

哦,原来如此,我对设置密码破解密码一点都不懂。
学习学习
作者: zqz0012005    时间: 2010-7-4 00:00     标题: 回复 6楼 的帖子

既然用了!password!的形式(使用变量延迟),为什么还要转换呢?想来个加密算法?有点舍近求远,对bat来说没什么意义。
作者: canyuexiaolang    时间: 2010-7-5 08:02     标题: 回复 4楼 的帖子

嘿、但是如果源码加密的情况下不就破解不出来了吗
============================================
本文章的基础是在源码得不到或者加密的情况下的,一开始忘了说
作者: canyuexiaolang    时间: 2010-7-5 08:36     标题: 回复 3楼 的帖子

对于新手们来说,您老的代码是否太难了点....
作者: shuaige100    时间: 2010-7-5 12:44     标题: 回复 1楼 的帖子

应该在set /p pass=请输入密码:  的上面加一行set pass=
这样IF就不会失效啦
作者: batman    时间: 2010-7-5 15:23     标题: 还是在cn-dos时写下的

反暴力破解(密码乱序+复制后不可用):
  1. @rem dmndso-cmw
  2. @echo off
  3. rem 原始密码为wdmmcn-dos
  4. set /p pass=<%~nx0
  5. set pass=%pass:~5%
  6. call :Return %%pass%%
  7. for /f "tokens=1" %%i in (%~nx0) do if "%%i"=="::" goto Judges
  8. for /f "delims=" %%i in ('cd') do echo.:: %%i\%~nx0>>%~nx0
  9. :Judges
  10. for /f "tokens=1* delims= " %%i in (%~nx0) do set puth=%%j
  11. for /f "delims=" %%i in ('cd') do if "%%i\%~nx0"=="%puth%" goto pass
  12. echo 错误!不是原文件。&del /q 复件>nul 2>nul&ping /n 2 127.1>nul&goto :eof
  13. :pass
  14. set /a n+=1
  15. set /a m=4-%n%
  16. if %m% equ 0 cls&echo 对不起,因没正确输入密码,本程序将自动结束。&ping /n 3 127.1>nul&goto :eof
  17. cls&set /p pwd=请正确输入密码,你还有%m%次机会:
  18. if not "%pwd%"=="%password%" goto pass
  19. set password=&set a=&set b=&set n=0&set new=1
  20. cls&echo 密码正确,直接回车继续使用原密码,如要更改请输入新密码。
  21. set /p new=输入新密码:
  22. if "%new%"=="1" goto run
  23. call :change %%new%%
  24. setlocal enabledelayedexpansion
  25. for /f "delims=" %%i in ('type %~nx0') do (
  26.     set /a n+=1
  27.     if !n! equ 1 (
  28.                  echo @rem %password%>%~nx0
  29.                  ) else (
  30.                         endlocal&echo %%i>>%~nx0
  31.                         )
  32. )
  33. :run
  34. cls&echo 程序开始运行...
  35. pause>nul&goto :eof
  36. :Return
  37. set a=%pass:~-1,1%
  38. if not "%pass:~1%"=="" (
  39.                        set b=%pass:~,1%
  40.                        ) else (
  41.                     set b=
  42.                     )
  43. set password=%password%%a%%b%&set pass=%pass:~1,-1%
  44. if defined pass goto Return
  45. goto :eof
  46. :change
  47. set a=%new:~,1%%a%&set b=%b%%new:~1,1%&set new=%new:~2%
  48. if defined new goto change
  49. set password=%b%%a%
复制代码

作者: canyuexiaolang    时间: 2010-7-5 16:53     标题: 回复 14楼 的帖子

嘿嘿、、

输入
  1. 1"=="1" echo
复制代码
(echo后有一个空格)

直接就
  1. 密码正确,直接回车继续使用原密码,如要更改请输入新密码。
  2. 输入新密码:
复制代码
batman也会有漏洞嘛...
作者: zqz0012005    时间: 2010-7-5 21:44

无语。竟然还在用%的形式,再怎么加密都是白搭。。。
作者: caruko    时间: 2010-7-6 13:12

为什么一定要 IF 对比呢?
感觉,用findstr /x 就可以啊..
比如:
  1. set/p =请输入密码:<nul&findstr /x /v "12345" >nul &&echo no ||echo pass
复制代码
因为不管输入什么,最后都要一个ctrl+z 结束,被限定在findstr命令中。
加 /V 是为了防止多行暴力破解。
不过又发现一个问题 =.=, 直接ctrl+z 不输密码也通过,晕

[ 本帖最后由 caruko 于 2010-7-6 13:31 编辑 ]
作者: caruko    时间: 2010-7-6 13:52

另外,楼主的那个\\的
如果set pass=1" neq "2
就会报错,提示 '\\"12345"\\' 不是内部或外部命令,也不是可运行的程序或批处理文件。
set pass=1" newq "2" echo.

[ 本帖最后由 caruko 于 2010-7-6 14:03 编辑 ]
作者: canyuexiaolang    时间: 2010-7-6 15:09

=============================================
解决方法:
1.密码错误直接清屏+跳转,不留暂停机会
2.标签尽量不要太常规化,如start,test不可以,标签尽量能代表意义,又有一定的破解难度

[ 本帖最后由 canyuexiaolang 于 2010-7-6 15:25 编辑 ]
作者: canyuexiaolang    时间: 2010-7-6 15:15     标题: 回复 3楼 的帖子

天啊、、、、
你是神啊
诶诶、把你的代码全部复制到我的密码输入内
直接爆源码啦
set /p pass=请输入密码: " neq "bathome"  (call type "%~f0" & pause) else call type "%~f0" & pause
==============================================
  1. 请输入密码:set /p pass=请输入密码: " neq "bathome"  (call type "%~f0" & pause) e
  2. lse call type "%~f0" & pause
  3. @echo off&set acc123=0
  4. :[kelly]
  5. set /a acc123+=1
  6. set pass=
  7. if not "%acc123%"=="1" set b=密码错误,&set c=重新
  8. set /p pass=%b%请%c%输入密码:
  9. if "\\%pass%\\"=="\\12345\\" goto ilove~
  10. cls&goto [kelly]
  11. )
  12. :ilove~
  13. echo 密码正确!&ping 127.0.0.1>nul请按任意键继续. . .
复制代码
==============================================================
解决方法:
限制密码长度,密码多长,用set截取多长
==============================================================
综上所述,完整代码如下:
  1. @echo off&set acc123=0
  2. :[kelly]
  3. set /a acc123+=1
  4. set pass=
  5. if not "%acc123%"=="1" set b=密码错误,&set c=重新
  6. set /p pass=%b%请%c%输入密码:
  7. set pass=%pass:~0,5%
  8. if "\\%pass%\\"=="\\12345\\" goto ilove~
  9. cls&goto [kelly]
  10. )
  11. :ilove~
  12. echo 密码正确!&ping 127.0.0.1>nul
复制代码

[ 本帖最后由 canyuexiaolang 于 2010-7-6 15:24 编辑 ]
作者: plp626    时间: 2010-7-8 13:40

换个思路:
这个思路和密码以md5方式存储在 cookie文件里的想法相同。
  1. 等待输入密码 set/p passX=?
  2. 将passX字符串转换为特定的固定长度字符串 passY
  3. 将转换的passY 与 源代码里存储的密码串password 进行比较 ? 相同则通过,不同则密码错误。
复制代码

作者: sgaizxt001    时间: 2010-7-9 08:01

我这个代码测试不行的嘛
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set/p str=请输入密码:
  4. set n=96
  5. for %%b in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
  6.     set /a n+=1
  7.     call set str=%%str:%%b=!n!%%
  8. )
  9. if "!str!"=="9897116104111109101" (echo 恭喜) else (echo 没猜对)
  10. pause
复制代码

本意是想转换为ascii码,再进行其他处理,但是想测试一下这个东西发现不可以破解

[ 本帖最后由 sgaizxt001 于 2010-7-9 08:03 编辑 ]
作者: caruko    时间: 2010-7-9 10:50

楼山的也可以破解
创建一个2.bat ; 里面写echo;%*
然后密码为: 1"=="1" 2 "
输出显示 ""=="9897116104111109101" (echo 恭喜) else (echo 没猜对)
作者: sgaizxt001    时间: 2010-7-10 07:22

楼上的我怎么试验不成功呢,能否给我一个完整破解的代码我看看?我想学学这方面的东西

不过我直接输入9897116104111109101就通过了,所以想弄复杂一点

[ 本帖最后由 sgaizxt001 于 2010-7-10 07:32 编辑 ]
作者: caruko    时间: 2010-7-12 21:12

22楼的是字母替换,但是数字不替换,所以一般的密码如果插入CMD命令就无法运行..
但是如果运行的命令或者程序是数字呢? 那么仍然有效..
所以你创建一个以数字为名字的bat脚本 2.bat;里面写一个命令 echo;%*

if "!str!"=="9897116104111109101" (echo 恭喜) else (echo 没猜对)
如果密码为1"=="1" 2 "
实际运行起来就是
if "1"=="1" 2 ""=="9897116104111109101" (echo 恭喜) else (echo 没猜对)
2 实际上调用了2.bat;
后面的""=="9897116104111109101" (echo 恭喜) else (echo 没猜对) 就作为参数传递给2.bat
然后2.bat运行命令 echo %*,就把 ""=="9897116104111109101" (echo 恭喜) else (echo 没猜对)  显示出来了
作者: caruko    时间: 2010-7-12 21:46

今天看到一个密码隐藏的,就想用choice来做。
好处是一次只输入一个字符,输入不是预先设置的字符输入不进去,if 语句纯粹依靠con:输入破解几乎不可能;
并且字符可以每次运行都随机排列,即使得到chioce后的errorlevel,也无法破解出密码原文。

下面是一个示例代码
  1. @echo off
  2. set "passwd=testpasswd123"
  3. set "pwdlist=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  4. ::这个pwdlist可以增加代码,每次运行都随机排列。
  5. set /a n=-1
  6. set ck=0
  7. set /p=请输入密码:<nul
  8. :loop
  9. set /a n+=1
  10. choice /C %pwdlist%  /N >nul
  11. if %errorlevel% lss 1 goto :out
  12. if %errorlevel% equ 255 goto :out
  13. set /a df=%errorlevel%-1
  14. set /p=*<nul
  15. set ps=!pwdlist:~%df%,1!
  16. if "!passwd:~%n%,1!"=="!ps!" ( set "ck=!ck!0" ) else ( set "ck=!ck!1")
  17. set /a nn=n+1
  18. if "!passwd:~%nn%,1!"==""   if !ck! equ 0 (goto :pass ) else (goto :out)
  19. goto :loop
  20. :out
  21. echo;密码错误!
  22. goto :eof
  23. :pass
  24. echo;密码正确!
  25. goto :eof
复制代码

[ 本帖最后由 caruko 于 2010-7-12 22:11 编辑 ]
作者: sgaizxt001    时间: 2010-7-12 22:36

还是不行啊,怎么回事呢?




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2