Board logo

标题: 如何添加修改自身密码功能 [打印本页]

作者: chainliq     时间: 2006-11-24 20:28    标题: 如何添加修改自身密码功能

呵呵,前几天用批处理写啦个管理工具,里面设有密码的如下:
set /p pass=请输入密码:
if "%pass%"=="adminzhoulichainliq" goto game
set /a num=%num% + 1
if %num%==3 goto error

请问如何添加一项修改密码功能的代码呀 .
选啦这一项后,能把 adminzhoulichainliq 随意改成自己想要的密码!
呵呵,问题好多哦。。。快成啦个问题大王啦,每天都在发问题。
不过 ,偶太想学习啦,没办法呀,哪个叫偶那么稀饭搞这个东东呢!~!
请各位多多指教,谢谢!
作者: youxi01     时间: 2006-11-24 22:11
最简单的办法是从文件或注册表中读取密码。
作者: chainliq     时间: 2006-11-30 19:12
呵呵,都放啦那么久啦,请问哪位知道呀,讨教讨教!
作者: redtek     时间: 2006-12-1 09:11
chainliq兄的 “如何添加修改自身密码功能” 可以实现,但没有见到兄完整的批处理代码,所以无法精确定位用代码再次修改代码自身。

全自动寻找并使用代码修改代码自身中的密码设置一项到是可以完成,但复杂一些,也没什么意义~:)

帮兄做了一个简单的更改密码的测试,使用代码修改自身的密码项中的密码来完成:)

(注: 下面代码是基本模型)


(注:此功能的实现要求批处理名字不得含有空格--与Debug有关)
(  批处理的名字请填在set filename=)
@echo off

::  此代码段到下面 :viewpass 之间的代码段位置固定不变,Debug精确定位
goto :setpass

:dataset
        set filename=run.bat                                      
        set debug=01E0
        goto :eof

:passset

        set pass=Redtek
        goto :eof

:viewpass

        echo 当前密码是:%pass%
        goto :eof


:setpass

        ::  初始化Debug精确定位数据
        call :dataset

        ::  加载密码变量
        call :passset

        echo 原密码为:%pass%

        set "p="
        set /p P=请输入新密码:
        if [%p%]==[] goto :eof

        ::  Debug 精确定位修改为新设置的密码到自身
        echo exit|cmd/k prompt n %filename%$_l$_e %debug% "%p%"$_w$_q$_|debug       
        chcp 936>nul
        echo.

        ::  新 Debug 刚修改完 :passset 代码段中的密码,但此时内存中的变量并未更新
        ::  需要重新加载一次密码变量,“刷新”内容密码变量内容。
        ::  echo 新密码为:%pass%
        call :passset
        ::  call :viewpass
        echo 当前密码是:%pass%
        pause

        goto :eof




:://///////////////////////////////////////////////////////////////////////////
::                                                @Redtek@sweetmeet.com         2006
:://///////////////////////////////////////////////////////////////////////////


-d 01a5
13C0:01A0                 31 32 33-37 38 39 0D 0A 09 67 6F        123789...go
13C0:01B0  74 6F 20 3A 65 6F 66 0D-0A 0D 0A 3A 76 69 65 77   to :eof....:view
13C0:01C0  70 61 73 73 0D 0A 0D 0A-09 65 63 68 6F 20 B5 B1   pass.....echo ..
13C0:01D0  C7 B0 C3 DC C2 EB CA C7-A3 BA 25 70 61 73 73 25   ..........%pass%
13C0:01E0  0D 0A 09 67 6F 74 6F 20-3A 65 6F 66 0D 0A 0D 0A   ...goto :eof....
13C0:01F0  0D 0A 3A 73 65 74 70 61-73 73 0D 0A 0D 0A 09 3A   ..:setpass.....:
13C0:0200  3A 20 20 B3 F5 CA BC BB-AF 44 65 62 75 67 BE AB   :  ......Debug..
13C0:0210  C8 B7 B6 A8 CE BB CA FD-BE DD 0D 0A 09 63 61 6C   .............cal
13C0:0220  6C 20 3A 64 61                                    l :da


-d 01a0
13C0:01A0  70 61 73 73 3D 31 32 33-37 38 39 0D 0A 09 67 6F   pass=123789...go
13C0:01B0  74 6F 20 3A 65 6F 66 0D-0A 0D 0A 3A 76 69 65 77   to :eof....:view
13C0:01C0  70 61 73 73 0D 0A 0D 0A-09 65 63 68 6F 20 B5 B1   pass.....echo ..
13C0:01D0  C7 B0 C3 DC C2 EB CA C7-A3 BA 25 70 61 73 73 25   ..........%pass%
13C0:01E0  0D 0A 09 67 6F 74 6F 20-3A 65 6F 66 0D 0A 0D 0A   ...goto :eof....
13C0:01F0  0D 0A 3A 73 65 74 70 61-73 73 0D 0A 0D 0A 09 3A   ..:setpass.....:
13C0:0200  3A 20 20 B3 F5 CA BC BB-AF 44 65 62 75 67 BE AB   :  ......Debug..
13C0:0210  C8 B7 B6 A8 CE BB CA FD-BE DD 0D 0A 09 63 61 6C   .............cal

-d 01d7
13C1:01D0                       73-65 74 20 70 61 73 73 3D          set pass=
13C1:01E0  31 32 33 34 35 36 0D 0A-09 67 6F 74 6F 20 3A 65   123456...goto :e
13C1:01F0  6F 66 0D 0A 0D 0A 3A 76-69 65 77 70 61 73 73 0D   of....:viewpass.
13C1:0200  0A 0D 0A 09 65 63 68 6F-20 B5 B1 C7 B0 C3 DC C2   ....echo .......
13C1:0210  EB CA C7 A3 BA 25 70 61-73 73 25 0D 0A 09 67 6F   .....%pass%...go
13C1:0220  74 6F 20 3A 65 6F 66 0D-0A 0D 0A 0D 0A 3A 73 65   to :eof......:se
13C1:0230  74 70 61 73 73 0D 0A 0D-0A 09 3A 3A 20 20 B3 F5   tpass.....::  ..
13C1:0240  CA BC BB AF 44 65 62 75-67 BE AB C8 B7 B6 A8 CE   ....Debug.......
13C1:0250  BB CA FD BE DD 0D 0A                              .......

:://///////////////////////////////////////////////////////////////////////////
(注: 直接copy上面的代码有可能会出现无法精确定位。)
(   如果出现上面问题,那是因为用Debug实现了精确定位,即16进制的位置不能误差一个字节)

(   所以,可以直接下载附件测试)

(这是做的一个好玩的代码,如果兄没这样好玩的问题我也不会想到要这么干,非常感谢~~)
附件 1: run.rar (2006-12-1 09:11, 1000 bytes, 下载附件所需积分 1点 ,下载次数: 53)

作者: redtek     时间: 2006-12-1 09:13
echo exit|cmd/k prompt n %filename%$_l$_e %debug% "%p%"$_w$_q$_|debug >nul

请将原代码中修改为最后一项加入 >nul 操作信息显示在屏幕上。
不过后面会遇到切换代码页时系统也会自动清屏~:)
作者: chainliq     时间: 2006-12-1 17:18
那请问如何套用到这段下呀!
set /p pass=请输入密码:
if "%pass%"=="adminzhoulichainliq" goto game
set /a num=%num% + 1
if %num%==3 goto error
作者: redtek     时间: 2006-12-1 21:43

...
...
::    注意:后面是空格占位符"                                                                "
::             在pass值后还有很长一段空格,方便写入不同长度的密码之用
set "password=adminzhoulichainliq"                                                         
...
...

::  真实密码值之所以不写在下面,而是写在上面固定独占一行的 set password=...
::  是因为密码长度有可能是可变的,如果Debug精确直接修改下面if判断中的密码,
::  因为可变密码长度有可能会“擦”去后面的 goto 语句,……

if "%pass%"=="%password%" goto game
...
[ Last edited by redtek on 2006-12-1 at 08:45 AM ]
作者: ccwan     时间: 2006-12-1 21:55
redtek兄的密码不能低于6位,是吧?
作者: redtek     时间: 2006-12-1 22:02
4楼测试代码是固定了6位~:)

但在实际代码中,密码是可变长度的,于是下面方法可以达到可变长度:)
...
set "password=my12345678"                                                            
注:在上面 set 后的赋值是放在引号中的,而且 my12345678 的引号后面还有空格
  空格是占位符,有多少个空格,密码长度就有多少个现在密码长度+空格原长度

  在16进制看来,那后面的空格就是 20 20 20 ....再长的密码长度无非是覆盖了那些空格,所以代码不会被覆盖掉。


做个实验:
C:\TEMP>set var=Redtek
在上面的 Retek 后面是没有空格的
C:\TEMP>echo %var% %time%
Redtek  9:07:10.87

C:\TEMP>set var=cn-dos.net                       
在 ..cn-dos.net 后面我加了很多空格,所以下面“连接”显示时空出了很多……
C:\TEMP>echo %var% %time%
cn-dos.net                         9:08:05.45

而且 var 的值后面是有空格的,这个空格也是值的一部分。

C:\TEMP>set "var=Redtek"             dslkfjdlsfjldsj
上面的var的值可是不包括我乱打的  “dslkfjdlsfjldsj” 这几个字符串,很微妙吧?

C:\TEMP>echo %var% %time%
Redtek  9:09:57.76
看结果,它并不包括那个乱打的字符串  dslkfjdlsfjldsj,
这是因为 set 要设置的值全在引号内,这就是为什么用引号可以防止打上多余的空格……
如果不设计出那些多余的空格出来,则象下面这样就会发生:
pass=123789(而在Debug中16进制显示,123789的16进制后面是0D 0A就是回车换行符)
这个回车换行符会带来密码可变长度的最大实行障碍。
有了多余的空格,Debug才可以精确写密码,只要计算出要写的起始地址就行了,顶多后面再怎么写也是覆盖掉空格,然后再写个引号保持一致:)

根据上面三个实验原理,在Debug中精确定位就可以使用 “多余” 的空格做为“占位” 符~:)

[ Last edited by redtek on 2006-12-1 at 09:21 AM ]
作者: namejm     时间: 2006-12-2 02:42
  可以考虑把新密码保存在注册表中,然后从注册表读取新密码。以下是一段演示代码:
@echo off
:begin
cls
echo.
echo   如果要使用默认密码,请直接输入密码;
echo.
echo   如果要使用新密码,请输入 1
echo.
echo   如果要修改密码,请输入 2
echo.
set input=
set /p input=  请输入:
if "%input%"=="abc" goto success
if "%input%"=="1" goto new
if "%input%"=="2" goto rewrite
goto begin

:new
cls
echo.
set new_password=
set /p new_password=  请输入密码:
for /f "skip=4 tokens=3" %%i in ('reg query HKLM /v test') do set var=%%i
if "%new_password%"=="%var%" goto success
goto new



:rewrite
cls
set set_password=
set /p set_password=  请设置新密码:
reg add HKLM /v test /d %set_password% /f
goto begin

:success
cls
echo.
echo   密码正确!
echo.
pause
goto begin

作者: redtek     时间: 2006-12-2 03:11
欣赏~~
写注册表真是方便~:)
作者: chainliq     时间: 2006-12-3 06:43
呵呵,不是我想要的结果,斑竹辛苦啦!
作者: vlq5299     时间: 2006-12-5 02:27


  Quote:
Originally posted by namejm at 2006-12-2 02:42:
  可以考虑把新密码保存在注册表中,然后从注册表读取新密码。以下是一段演示代码:
[code]
@echo off
:begin
cls
echo.
echo   如果要使用默认密码, ...

很实用
作者: tian88yuan     时间: 2010-5-29 11:30
看看 学习了