标题: 【出题】批处理设置密码以及修改密码 [打印本页]
作者: jinzeyu 时间: 2012-2-29 11:46 标题: 【出题】批处理设置密码以及修改密码
本帖最后由 jinzeyu 于 2012-2-29 19:01 编辑
目的:掌握改写文本技巧
加分:技术+1
题目:运行批处理后检查是否设置密码
检查方法:
设置密码后将密码记录在批处理或其他地方中
检查是否记录过密码
若没有设置密码
则提示用户设置密码
若已设置密码
就让用户输入密码
进入后还可以修改密码
要求:代码最好简洁高效通用,具有可读性,最好是无临时文件(本题的重点)。
有兴趣的可以尝试注册并记录多个用户以及密码
作者: batman 时间: 2012-2-29 11:52
如何验证是否设置了密码?难道是验证有没有set /p xxx=命令?
作者: find 时间: 2012-2-29 11:53
检查当前系统用户是否有密码么?
还是检查其它什么东东?
作者: jinzeyu 时间: 2012-2-29 11:54
本帖最后由 jinzeyu 于 2012-3-3 10:43 编辑
回复 2# batman
额 不是 是查看用户以前是否设置过密码
设置后将密码把存在某个地方
检查是否存过密码
作者: jinzeyu 时间: 2012-2-29 11:56
本帖最后由 jinzeyu 于 2012-3-3 10:44 编辑
回复 3# find
设置密码后将密码记录在某个地方中
检查是否记录过密码
作者: QIAOXINGXING 时间: 2012-2-29 17:18
本帖最后由 QIAOXINGXING 于 2012-2-29 17:52 编辑
跟练习 30 很像:http://www.bathome.net/viewthrea ... p;extra=&page=1- @echo off&SetLocal EnableDelayEdexpansion&cd /d "%~dp0"
-
- rem 1、判断是否添加了注册表项,没有则添加。
- REG QUERY hkcr\.### /v "mima" 1>nul 2>nul||reg add hkcr\.### /v "mima" /d "" /f >nul
- rem 2、查询注册表项,获取密码。
- for /f "tokens=1-3" %%a in ('REG QUERY hkcr\.### /v "mima"') do (set "mima=%%c")
- if "!mima!"=="" ( echo 没有设置密码。 ) else (goto :2)
-
- rem 设置密码
- :1
- set /p "code=设置密码:"
- if "!code!"=="" echo 密码不能为空。& goto :1
- reg add hkcr\.### /v "mima" /d "!code!" /f
- pause & goto :3
-
- rem 验证密码
- :2
- echo 设置了密码。
- set /p "code=输入密码:"
- if "!code!"=="!mima!" (
- echo;
- echo 密码正确。。
- pause
- ) else (
- echo =============
- echo 你妹,不对。
- goto :2
- )
-
- rem 操作
- :3
- cls
- echo 1.修改密码。
- echo 2.删除密码。
- echo 3.退出。
-
- set /p "case=请选择:"
- if "!case!"=="1" goto :1
- if "!case!"=="2" reg delete hkcr\.### /f & pause & goto :3
- if "!case!"=="3" exit
- echo 输入错误。& pause & goto :3
复制代码
好吧,我承认我写得很繁琐。。。。。。
作者: ivor 时间: 2012-2-29 18:14
我首先想对楼主说,不要急于说出自己的解题思路。方法很多的,说出来就没啥子意思了。。
认为添加注册表安全一些,代码还简单。。
作者: vsbat 时间: 2012-2-29 19:31
本帖最后由 vsbat 于 2012-2-29 19:33 编辑
- @echo off
- for /f "tokens=3" %%i in ('find /C "Y#PASS" %0') do (set c=%%i)
- if %c% GTR 3 (goto :InputPsw) else (echo No Password available ! & goto :SetPsw)
-
-
- :InputPsw
- for /f %%i in ('findstr /E "Y#PASS" %0') do (set psw=%%i)
- set psw=%psw:~0,-6%
- set /p in=Please Input Password(case sensitive):
- if %psw%==%in% (goto :Login) else (echo Wrong !!!& goto :Inputpsw)
-
-
- :Login
- echo.
- echo Login Success !
- set /p in=do you want to change your Password ?(Y or N)
- if %in%==Y (goto :SetPsw) else (echo Now you are to leave... & pause & goto :Out)
-
-
- :SetPsw
- echo.
- set /p in=Please Input your New Password:
- echo .>>%0
- echo %in%Y#PASS>>%0
- echo Set Password OK !
- pause
- goto :Out
-
-
- :Out
- EXIT
- REM ### ENSURE NEWLINE BELOW ###
复制代码
作者: qzwqzw 时间: 2012-2-29 21:45
其实有一种方法可以比较安全的保存密码
只不过说出来就不灵了
再等等看是否有人也能想到同样的思路
作者: batman 时间: 2012-2-29 21:58
回复 9# qzwqzw
期待神人出手。。。
作者: plp626 时间: 2012-3-2 16:31
本帖最后由 plp626 于 2012-3-2 16:44 编辑
如果把ascii2base64的那个索引表
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
字符替换替换,就不易破解出密码,但若懂原理,还是能逆推出来的;(base64是个可逆函数,批处理也容易实现)
理想状态下md5存储,但是批处理实现起来难度太大;
base64_d.cmd 见 http://www.bathome.net/thread-587-1-1.html (6楼)- @echo off&setlocal enabledelayedexpansion
- set/p input=输入密码?
- for /f "delims=" %%a in ('base64_d.cmd !input!')do set B64=%%a
- if "!B64!"=="cGxwNjI2" (
- echo 密码正确
- )else (
- echo 密码错误
- )
- pause
复制代码
作者: bluewing009 时间: 2012-3-2 21:59
本帖最后由 bluewing009 于 2012-3-2 22:12 编辑
回复 11# plp626
关于MD5 似乎也能破解
作者: plp626 时间: 2012-3-2 23:11
回复 12# bluewing009 - @echo off&setlocal enabledelayedexpansion
- set/p input=输入密码?
- for /l %%x in (1 1 5)do (
- for /f "delims=" %%a in ('base64_d.cmd "!input!"')do set input=%%a
- )
-
- if "!input!"=="VjFSQ2EwNUhVWGRPV0VaVVZrVnJPUT09" (
- echo 密码正确
- )else (
- echo 密码错误
- )
- pause
复制代码
base64 5次,增加破解难度;
同样md5也同样可N次,这样有效防止目前一些常见字符串的md5明文建立的数据库来破解;
王小云的论问是说md5在理论上是不安全的;
但这仅仅是理论上证明有漏洞,从实践上破解还是很困难;
作者: jinzeyu 时间: 2012-3-4 11:32
回复 9# qzwqzw
同样期待
作者: garyng 时间: 2012-3-5 22:11
因为大多数的批处理判断密码都是用IF
IF判断密码的 非常容易被破解
举个例子
就那6楼的代码来做示范- @echo off&SetLocal EnableDelayEdexpansion&cd /d "%~dp0"
-
- rem 1、判断是否添加了注册表项,没有则添加。
- REG QUERY hkcr\.### /v "mima" 1>nul 2>nul||reg add hkcr\.### /v "mima" /d "" /f >nul
- rem 2、查询注册表项,获取密码。
- for /f "tokens=1-3" %%a in ('REG QUERY hkcr\.### /v "mima"') do (set "mima=%%c")
- if "!mima!"=="" ( echo 没有设置密码。 ) else (goto :2)
-
- rem 设置密码
- :1
- set /p "code=设置密码:"
- if "!code!"=="" echo 密码不能为空。& goto :1
- reg add hkcr\.### /v "mima" /d "!code!" /f
- pause & goto :3
-
- rem 验证密码
- :2
- echo 设置了密码。
- set /p "code=输入密码:"
- if "!code!"=="!mima!" (
- echo;
- echo 密码正确。。
- pause
- ) else (
- echo =============
- echo 你妹,不对。
- goto :2
- )
-
- rem 操作
- :3
- cls
- echo 1.修改密码。
- echo 2.删除密码。
- echo 3.退出。
-
- set /p "case=请选择:"
- if "!case!"=="1" goto :1
- if "!case!"=="2" reg delete hkcr\.### /f & pause & goto :3
- if "!case!"=="3" exit
- echo 输入错误。& pause & goto :3
复制代码
注意复制代码
如果在要求书填入密码是输入:复制代码
那就成功破解了
为什么呢?
现在复制代码
中的 !code! 是复制代码
如果代入进去就会变成- if ""=="" goto 3 & echo "=="!mima!"
复制代码
if ""=="" 这里条件始终是正确的
所以 goto 3就会跳转到- :3
- cls
- echo 1.修改密码。
- echo 2.删除密码。
- echo 3.退出。
-
- set /p "case=请选择:"
- if "!case!"=="1" goto :1
- if "!case!"=="2" reg delete hkcr\.### /f & pause & goto :3
- if "!case!"=="3" exit
- echo 输入错误。& pause & goto :3
复制代码
也就是密码输入正确的地方
但这技巧只是绕过了密码验证
没有真正的得到密码
作者: HAT 时间: 2012-3-5 22:16
回复 13# plp626
http://www.cmd5.com/
作者: plp626 时间: 2012-3-5 22:23
回复 15# garyng
怎么绕过,那个是!!,非%%;愿闻其详
作者: qzwqzw 时间: 2012-3-7 22:24
我的思路说出来也很简单就是利用NTFS的stream
它的优点是实现起来比较简单
同时因为Windows没有内置NTFS流查看工具
所以存储上相对比较隐蔽一些
缺点就是需要NTFS卷
而且跟其它已有的密码保存策略一样
安全性是依靠代码和算法的不公开来保证的
一旦代码泄漏安全性自然也就不存在了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |