|  | 
 
| chainliq 高级用户
 
     学无尽止
 
 
 积分 635
 发帖 244
 注册 2006-4-15
 来自 广西贵港
 状态 离线
 | 
| 『楼 主』:
 如何添加修改自身密码功能
 
使用 LLM 解释/回答一下 
 
 
呵呵,前几天用批处理写啦个管理工具,里面设有密码的如下:set /p pass=请输入密码:
 if "%pass%"=="adminzhoulichainliq" goto game
 set /a num=%num% + 1
 if %num%==3 goto error
 
 请问如何添加一项修改密码功能的代码呀 .
 选啦这一项后,能把 adminzhoulichainliq 随意改成自己想要的密码!
 呵呵,问题好多哦。。。快成啦个问题大王啦,每天都在发问题。
 不过 ,偶太想学习啦,没办法呀,哪个叫偶那么稀饭搞这个东东呢!~!
 请各位多多指教,谢谢!
 
 
 
 
 |  | 
|  2006-11-24 20:28 |  | 
|  | 
 
| youxi01 高级用户
 
     
 
 
 积分 846
 发帖 247
 注册 2006-10-27
 来自 湖南==》广东
 状态 离线
 |  | 
|  2006-11-24 22:11 |  | 
|  | 
 
| chainliq 高级用户
 
     学无尽止
 
 
 积分 635
 发帖 244
 注册 2006-4-15
 来自 广西贵港
 状态 离线
 |  | 
|  2006-11-30 19:12 |  | 
|  | 
 
| redtek 金牌会员
 
       
 
 
 
 积分 2902
 发帖 1147
 注册 2006-9-21
 状态 离线
 | 
| 『第 4 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
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 == 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:11 |  | 
|  | 
 
| redtek 金牌会员
 
       
 
 
 
 积分 2902
 发帖 1147
 注册 2006-9-21
 状态 离线
 | 
| 『第 5 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
echo exit|cmd/k prompt n %filename%$_l$_e %debug% "%p%"$_w$_q$_|debug >nul
 请将原代码中修改为最后一项加入 >nul 操作信息显示在屏幕上。
 不过后面会遇到切换代码页时系统也会自动清屏~:)
 
 
 
 
 
 |  
                  |  Redtek,一个永远在网上流浪的人……
 
 _.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
 |  | 
|  2006-12-1 09:13 |  | 
|  | 
 
| chainliq 高级用户
 
     学无尽止
 
 
 积分 635
 发帖 244
 注册 2006-4-15
 来自 广西贵港
 状态 离线
 | 
| 『第 6 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
那请问如何套用到这段下呀!set /p pass=请输入密码:
 if "%pass%"=="adminzhoulichainliq" goto game
 set /a num=%num% + 1
 if %num%==3 goto error
 
 
 
 
 |  | 
|  2006-12-1 17:18 |  | 
|  | 
 
| redtek 金牌会员
 
       
 
 
 
 积分 2902
 发帖 1147
 注册 2006-9-21
 状态 离线
 | 
| 『第 7 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
...
 ...
 ::    注意:后面是空格占位符"                                                                "
 ::             在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 ] 
 
 
 
 
 |  
                  |  Redtek,一个永远在网上流浪的人……
 
 _.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
 |  | 
|  2006-12-1 21:43 |  | 
|  | 
 
| ccwan 金牌会员
 
       
 
 
 积分 2725
 发帖 1160
 注册 2006-9-23
 来自 河北廊坊
 状态 离线
 | 
| 『第 8 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
redtek兄的密码不能低于6位,是吧? 
 
 
 
 
 |  
                  |  三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
 |  | 
|  2006-12-1 21:55 |  | 
|  | 
 
| redtek 金牌会员
 
       
 
 
 
 积分 2902
 发帖 1147
 注册 2006-9-21
 状态 离线
 | 
| 『第 9 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
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 ]
 
 
 
 
 |  
                  |  Redtek,一个永远在网上流浪的人……
 
 _.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
 |  | 
|  2006-12-1 22:02 |  | 
|  | 
 
| namejm 荣誉版主
 
        batch fan
 
 
 积分 5226
 发帖 1737
 注册 2006-3-10
 来自 成都
 状态 离线
 | 
|   『第 10 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
  可以考虑把新密码保存在注册表中,然后从注册表读取新密码。以下是一段演示代码: @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
 
 
 
 
 
 
 
 |  
                  |  尺有所短,寸有所长,学好CMD没商量。
 考虑问题复杂化,解决问题简洁化。
 |  | 
|  2006-12-2 02:42 |  | 
|  | 
 
| redtek 金牌会员
 
       
 
 
 
 积分 2902
 发帖 1147
 注册 2006-9-21
 状态 离线
 | 
| 『第 11 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
欣赏~~写注册表真是方便~:)
 
 
 
 
 
 |  
                  |  Redtek,一个永远在网上流浪的人……
 
 _.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
 |  | 
|  2006-12-2 03:11 |  | 
|  | 
 
| chainliq 高级用户
 
     学无尽止
 
 
 积分 635
 发帖 244
 注册 2006-4-15
 来自 广西贵港
 状态 离线
 |  | 
|  2006-12-3 06:43 |  | 
|  | 
 
| vlq5299 初级用户
 
   
 
 
 
 积分 136
 发帖 59
 注册 2006-6-2
 状态 离线
 | 
| 『第 13 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
Originally posted by namejm at 2006-12-2 02:42:可以考虑把新密码保存在注册表中,然后从注册表读取新密码。以下是一段演示代码:
 
 @echo off
 :begin
 cls
 echo.
 echo   如果要使用默认密码, ...
 
很实用 
 
 
 
 |  | 
|  2006-12-5 02:27 |  | 
|  | 
 
| tian88yuan 新手上路
 
  
 
 
 
 积分 9
 发帖 6
 注册 2010-5-27
 状态 离线
 |  | 
|  2010-5-29 11:30 |  |