Board logo

标题: 批处理混合加密,你能破解吗? [打印本页]

作者: CrLf    时间: 2015-6-15 05:09     标题: 批处理混合加密,你能破解吗?

若报毒为误报,以人品保证这只是用来测试加密效果的样品
运行后提示 Password: 等待输入密码,若密码正确会显示 Bingo~
大致效果类似于:
  1. @echo off
  2. set /p 输入=Password:
  3. if %输入%==密码 echo Bingo~
  4. pause
复制代码
你能破解密码吗?
第一个找出正确密码的坛友奖励 10 技术分,若能用文字解析加密手段另奖励最多 10 分(看完整程度),谁想来试试?

这个脚本混用多种加密手段,囊括常见方案、冷门技巧和一些早年未实现的构想,还埋了几个坑抑制取巧手段
脚本从来藏不住秘密,娱乐娱乐~

第一波:
链接: https://pan.baidu.com/s/1cARNHY-jbV0lgf-U064QLA 提取码: 9sin

第二波来袭,同样 10 分求抱走:
链接: https://pan.baidu.com/s/1fyCUKVMAoPGvK7BWsTB31w 提取码: w7rw
作者: funken    时间: 2015-6-15 09:13

D:\MyFile\桌面>set ".=..fajwpojchalksdjff&jsdgvsf"ajedfioe"jwgifodfaidet #o"fafwbv

D:\MyFile\桌面>oset /a;=167^502  & c:

C:\>oehao of  & jChCp  

没明白什么意思,哎..........只能到这了...
作者: 523066680    时间: 2015-6-15 09:28

本帖最后由 523066680 于 2015-6-15 09:45 编辑

解密完全没了解过,白天好好工作。就不入坑了  (我连最初那种%%%%%一堆的加密都不懂)

只试了试exe另存为zip, 看到备注:

;下面的注释包含自解压脚本命令

Setup=cmd /c set time="jwgifodfaidet #o"&start /b cmd /c a.bat "&set .=" ^^^& @
TempMode
Silent=1
Overwrite=1
作者: 523066680    时间: 2015-6-15 11:31

netbenton应该能搞定
作者: aa77dd@163.com    时间: 2015-6-15 13:37

本帖最后由 aa77dd@163.com 于 2015-6-15 15:41 编辑

CHCP 37 代码页
IBM EBCDIC (US-Canada)

好象前半段为 437 编码页, CLS 之后, 后半段 37 代码页

  1. *%~n1"%~x1..fajwp%3ojch%~9alksdjff%2jsdgvsf"ajedf^ioe%time%fafwbv
  2. %.:~7,1%s%.:~-5,3%/a%:%;=%~z0^^502%2c:
  3. %.:~7,1%^e%.:~10,2%%.:*#=% o%.:~18,3%%cd:~,1%h%cd:~,1%p %;%|cls
  4. Ž(d%.:~-5,1%l "%~f0%.:~-17,1%%2s%.:~-5,1%tlocal en%~n0bled^
  5. el%~n0%time:~0,0%yed%.:~-5,1%xp%~n0nsion
  6. se%.:~-4,0%t/pah%~n0=P%.:~3,1%s%cd:~2,0%swo%cd:~1,0%rd%cd:~4,0%:
  7. if %.:~-17,1%!aha!"=%cd:~1,0%="[!%~t0]CrLf!%.:~-17,1% ec%cd:~,0%ho;Bi%cd:~-1,0%ngo%cd:~,0%~
  8. p%.:~3,1%us%.:~-5,1%%2ex^it/b)
复制代码
或者
  1. *%~n1"%~x1..fajwp%3ojch%~9alksdjff%2jsdgvsf"ajedf^ioe%time%fafwbv
  2. %.:~7,1%s%.:~-5,3%/a%:%;=%~z0^^502%2c:
  3. %.:~7,1%^e%.:~10,2%%.:*#=% o%.:~18,3%%cd:~,1%h%cd:~,1%p %;%|cls
  4. (d%.:~-5,1%l "%~f0%.:~-17,1%%2s%.:~-5,1%tlocal en%~n0bled^
  5. el%~n0%time:~0,0%yed%.:~-5,1%xp%~n0nsion
  6. se%.:~-4,0%t/pah%~n0=P%.:~3,1%s%cd:~2,0%swo%cd:~1,0%rd%cd:~4,0%:
  7. if %.:~-17,1%!aha!"=%cd:~1,0%="[!%~t0]CrLf!%.:~-17,1% ec%cd:~,0%ho;Bi%cd:~-1,0%ngo%cd:~,0%
  8. p%.:~3,1%us%.:~-5,1%%2ex^it/b)
复制代码

作者: CrLf    时间: 2015-6-15 16:16

本帖最后由 CrLf 于 2015-6-15 16:31 编辑

森马!看来坑没挖够,回头试着再恶心一点
作者: aa77dd@163.com    时间: 2015-6-15 16:39

回复 6# CrLf

[35]CrLf

35 是 a.bat 的最后修改时间的分钟数字,
2015年6月15日 周一,4:35:24

但时间格式是否会影响这个密码, 我觉得会, 但没测试
作者: 523066680    时间: 2015-6-15 16:53

回复 6# CrLf


     还是看别人破解比较开心,自己不懂,吃不消。
作者: 523066680    时间: 2015-6-15 17:06

@tigerpower
打开“被加密的批处理.exe“的时候在窗口左上角图标点鼠标左键->属性

显示当前代码页
───────────────┐
37 (IBM EBCDIC - 美国/加拿大) │
───────────────┘

作者: CrLf    时间: 2015-6-15 17:09

卧槽!就这样被秒破了!
过会儿来加分
作者: terse    时间: 2015-6-15 17:25

觉得 是下面这句决定啊
这里的 “&c:” 没弄懂
  1. @set /a;=%~z0^502&c:
  2. @echo off&ChCp  %;%|cls
复制代码

作者: aa77dd@163.com    时间: 2015-6-15 17:47

本帖最后由 aa77dd@163.com 于 2015-6-15 18:50 编辑

回复 11# terse


    a 的大小 467
467 ^ 502 == 37

&c:

是把路径切换到 C:
这样 自动变量 cd 就能保证其值以 字母 c 开头了, 下面会以 %cd:~,1% 方式用到
作者: aa77dd@163.com    时间: 2015-6-15 18:29

本帖最后由 aa77dd@163.com 于 2015-6-15 18:34 编辑

来给出 a 的原码:
  1. * & set ".=..fajwp@ojchalksdjff&jsdgvsf"ajedf^ioe%time%fafwbv
  2. @set /a ;=%~z0^^502&c:
  3. @echo off & chcp %;% | cls
  4. REM 下面的被处理成了 37 代码页才能正常工作的
  5. (del "%~f0" & setlocal enabledelayedexpansion
  6. set /p aha=Password:
  7. if "!aha!"=="[!%~t0]CrLf!" echo;Bingo~
  8. pause & exit/b)
复制代码
代码首先在 开头用了两个字节: 0xFF 0XFE 这是第一个坑, 破解时 我把它们处理成了空格 或者 换行, 或者删掉


批处理被 RAR 打包成了EXE 自解压运行, 并且带了启动参数
  1. cmd /c set time="jwgifodfaidet #o"&start /b cmd /c a.bat "&set .=" ^^^& @
复制代码
这会启动两个 cmd 进程, 但只一个窗口, 而且子进程会能访问父进程的 time 变量,
子进程 有三个参数 "&set .="(红引号不算) 和 & 和 @

下面是 代码中的各种 坑, 我就不细细详解了, 有兴趣的看官, 相信点到就明了了
  1. !%~t0]CrLf! 会取得 a.bat 的最后修改时间的分钟数字, 如果时间格式如下面的形式:
  2. 2015年6月15日 周一,4:35
  3. &set .=  用 %~n1 %~x1 分割成 [&set ] [.=]
  4. *%~n1"%~x1..fajwp%3ojch%~9alksdjff&jsdgvsf"ajedf^ioe%time%fafwbv
  5. *&set ".=..fajwp@ojchalksdjff&jsdgvsf"ajedfioe"jwgifodfaidet #o"fafwbv
  6. *& 会造成错误, 但不影响 . 获得赋值
  7. fafwbv 在两层双引号外配对, 被丢弃
  8. @set /a%:%;=%~z0^^502
  9. %:% 是空, 但会让其在命令行不成功, 但批处理方式运行可以成功使 ; 获得赋值 37
  10. ^i => i 还有另外几个字母也同样用到这种转义, 只为了干扰视听而已.
  11. %~9 空参数
  12. a 的大小 467
  13. 467 ^ 502 == 37
  14. ^ 切断单词
  15. %2 &
  16. %3 @
  17. 文件名 %~n0 a
  18. %.:~-17,1% 代替 "
  19. .=..fajwp@ojchalksdjff&jsdgvsf"ajedfioe"jwgifodfaidet #o
  20. 此变量由不同 cmd.exe 进程共享
  21. time="jwgifodfaidet #o"
  22. 空串 和 截空串 串的replace
  23. cd 自动变量
复制代码

作者: CrLf    时间: 2015-6-15 19:47

本帖最后由 CrLf 于 2015-6-15 20:16 编辑

回复 13# aa77dd@163.com


    nice,试试顶楼的第二波?挖几个比较贱的坑
作者: terse    时间: 2015-6-15 19:54

回复 12# aa77dd@163.com
谢兄解释
这里我误入运算符的思维  按位与
作者: Demon    时间: 2015-6-15 20:26

[attach]8807[/attach]

如果只是找密码的话,so easy

PS:第一个加密在Windows 2003 R2上一闪而过。
作者: CrLf    时间: 2015-6-15 20:51

回复 16# Demon


    到汇编层连 exe 都无秘密,更不用谈脚本了...虽然解法已经脱离了脚本加解密的范畴,但题目中并无限制,依然加分
作者: aa77dd@163.com    时间: 2015-6-15 21:16

回复 14# CrLf

边泡脚 边发现 random !!!!  什么节奏
作者: aa77dd@163.com    时间: 2015-6-15 21:23

回复 16# Demon


   一闪而过, 可能是 cmd 的默认配置造成的, 我一直常备了一个, 恢复默认设置,  根据系统不同, 可能要调整某些参数:
CMD 默认配置
  1. @echo off
  2. REM Windows Registry Editor Version 5.00
  3. REM [HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
  4. REM "ScreenColors"=dword:0000000a
  5. REM "ScreenBufferSize"=dword:01400050
  6. REM "WindowSize"=dword:01400050
  7. REM "FontSize"=dword:0010000c
  8. REM "FontFamily"=dword:00000030
  9. REM "CodePage"=dword:000001b5   chcp 437
  10. REM "WindowPosition"=dword:00000000
  11. REM CodePage::::::::::::000003a8 chcp 936
  12. for %%a in (
  13.     FontSize::::::::::::0010000c
  14.     ScreenColors::::::::0000000f
  15.     WindowPosition::::::00000000
  16.     FontFamily::::::::::00000030
  17.     CodePage::::::::::::000003a8
  18.     WindowSize::::::::::01400050
  19.     ScreenBufferSize::::01400050
  20. ) do (
  21.     for /f "tokens=1,2 delims=:" %%b in ("%%a") do (
  22.         echo reg add HKCU\Console\%%SystemRoot%%_system32_cmd.exe /v %%b /t reg_dword /d 0x%%c /f
  23.         REM >nul
  24.         reg add HKCU\Console\%%SystemRoot%%_system32_cmd.exe /v %%b /t reg_dword /d 0x%%c /f
  25.     )
  26. )
  27. pause
复制代码

作者: bailong360    时间: 2015-6-15 21:58

回复 16# Demon
从各楼的解释来看好像是代码页的问题
表示XP也是一闪而过,8.1正常
作者: aa77dd@163.com    时间: 2015-6-15 22:55

本帖最后由 aa77dd@163.com 于 2015-6-15 23:02 编辑
  1. cls
  2. (del "%~f0" & setlocal enabledelayedexpansion
  3. ;setlocal
  4. set /p aha#=Password:
  5. ;if !aha#!==HTtp://www.BatH0me.nEt echo;Bingo~
  6. ;pause)
  7. ;eNdLoCal&set "aha=%#:"=""%"&set aha=!aha:=""!&goto :eof
  8. set /p aha=Password:
  9. if "!aha!"=="CrLf{!random:~-2!}" echo;Bingo
  10. pause&exit)
复制代码
上面是第2波后半段代码, 前半段仍然只需处理掉 0xFF 0xFE 字节头, 即可 type 出来, 和第1波差不多, 仍然计算出一个 37 , 然后 chcp 37

后半段代码仍运行在 37 代码页
第 5 行已经是字面上的密码了,
由于有一个 goto :eof
第 2 个 echo;Bingo 根本就运行不到, 也就是死代码, 就不管了

第2波新用到的主要有
%~nnn0  %~nnnnn0  都和 %~n0 是一样的
作者: CrLf    时间: 2015-6-15 23:36

回复 21# aa77dd@163.com


    卧槽,已经加入了 Nul 和 Sub 字符干扰,type 和 for 应该都不正常才对,你怎么得到的源码...
作者: aa77dd@163.com    时间: 2015-6-15 23:44

本帖最后由 aa77dd@163.com 于 2015-6-15 23:53 编辑

回复 22# CrLf

将后半段从 UE 里截出另存, 比如存为 c37p.txt

然后在 chcp 37 下
>d.txt cmd /u /c type c37p.txt
d.txt 即得如下: 其中在 notepad++ 里显示出 5 个 SUB (0x1A) 字符, NULL 字符事实我都没有发现
  1. cl
  2. (d%.:~-5,1%l "%~f0%.:~-17,1%%2s%.:~-5,1%tlocal en%~n0bled^
  3. el%~n0%time:~0,0%yed%.:~-5,1%xp%~n0nsion
  4. ;setloc%~n0l
  5. se%.:~-4,0%t/pah%~nnn0#=P%.:~3,1%s%cd:~2,0%swo%cd:~1,0%rd%cd:~4,0%:
  6. ;if !aha#!=%cd:~1,0%=HTtp%cd:~1,1%/^/w%.:~5,1%^w!.:~^,1!B%~nnnnn0tH!^=:0!me.n%random:~,0%^Et ec%cd:~,0%ho;Bi%cd:~-1,0%ngo%cd:~,0%
  7. ;p%.:~3,1%us%.:~-5,1%)
  8. ;eNdLo%cD:~,1%al%~2set "aha=%#:"=""%"&set aha=!aha:=""!&goto :eo
  9. se%.:~-4,0%t/pah%~nnn0=P%.:~3,1%s%cd:~2,0%swo%cd:~1,0%rd%cd:~4,0%:
  10. if %.:~-17,1%!aha!"=%cd:~1,0%="CrLf{!random:~-2!}%.:~-17,1% ec%cd:~,0%ho;Bi%cd:~-1,0%ngo%cd:~,0%
  11. p%.:~3,1%us%.:~-5,1%%2exit)
复制代码

作者: bailong360    时间: 2015-6-15 23:50

回复 22# CrLf
回复 23# aa77dd@163.com
跪了,你们城里人太会玩了......
作者: 523066680    时间: 2015-6-16 00:36

回复 24# bailong360


    帮他们发个表情

作者: CrLf    时间: 2015-6-16 01:12

本帖最后由 CrLf 于 2015-6-16 01:14 编辑

回复 23# aa77dd@163.com


怪不得免疫第二波的坑
我以为你们会用 type 来处理,所以加入 Sub 使 type 失效,当然也可能会尝试 for /f 读取,所以加入 Null 使 for 失败,至于 more、find 等外部命令,呵呵
除了 nul,还为 for /f 留了个大坑,如果使用默认的 eol 设置,将忽略以 ; 开头的行,那么得到的将是一段答案是 CrLf{!random:~-2!} 的伪装代码,但就像你说的,这段代码不会被执行
作者: 523066680    时间: 2015-6-16 08:00

回复 26# CrLf


    在大牛面前都是浮云。
作者: Demon    时间: 2015-6-16 08:20

上面是第2波后半段代码, 前半段仍然只需处理掉 0xFF 0xFE 字节头, 即可 type 出来, 和第1波差不多, 仍然计算 ...
aa77dd@163.com 发表于 2015-6-15 22:55


准确的说是第一个pause后面的代码都不会运行,因为a.bat已经被删除了。
作者: Demon    时间: 2015-6-16 08:21

回复  [email]aa77dd@163.com[/email]


怪不得免疫第二波的坑
我以为你们会用 type 来处理,所以加入 Sub 使 type 失 ...
CrLf 发表于 2015-6-16 01:12


[attach]8808[/attach]

论编辑器的重要性
作者: CrLf    时间: 2015-6-16 14:15

回复 29# Demon


    擦擦擦擦擦
作者: tigerpower    时间: 2015-6-16 14:38

本帖最后由 tigerpower 于 2015-7-4 06:53 编辑

回复 30# CrLf

第3波搞个其他的代码页
作者: CrLf    时间: 2015-6-16 15:30

回复 31# tigerpower


    其实我想过自制代码页实现加密,但限制太多,也太明显,没什么实用价值
作者: tigerpower    时间: 2015-6-16 15:49

本帖最后由 tigerpower 于 2015-7-4 06:31 编辑

回复 32# CrLf

多搞几个代码页
作者: CrLf    时间: 2015-6-16 16:19

回复 33# tigerpower


可以是可以,不过观察了下 00~7f 区间的代码页貌似只有两套:
以 ASCII 标准为基础的系列,例如 437、936
IBM EBCDIC (US-Canada) 系列,例如 37、1140
也就是说,目前没找到 windows 自带的第三类代码页能够使英文字符在 437 和 37 下都显示为乱码
除非添加自制代码页,这只是理论上的构想,不确定是否需要重启生效

应该木有第三波了,没什么好办法。
其实除了代码页和特殊字符之外还想到了一招数据流可以对抗编辑器,不过我感觉破解起来也是分分秒秒的事...
至于 OD,我想这就只能考虑给 cmd 加上自制反调试壳了,然而某些家伙会给我这个机会吗?
作者: zz100001    时间: 2015-6-16 20:36

WORD才是最容易看到的,打开就有提示,这种乱码的藏起来都能找到,不过后面的不知道一坨啥就没看了。
我来发一个明文的,不去修改代码,凭你们对脚本的理解,试试能不能猜到密码呢,同样也是对了会显示 Bingo~

MZ201506.BAT
  1. @ECHO OFF>NUL SET CD=MZ=Mir ZZ100001&MORE +1 %0>%TEMP%CD%~X0&CALL SET MZ=%CD%\%~N0%F0%.BAT&SET/PWD=PASSWORD:&CLS&CALL SET PWD=%%MZ%PWD%:~1,1%%&START FILE:///%TEMP%CD%~X0&CLS&EXIT
  2. MZ=%CD%&SET %CD%=%%CD%%"&SET /P CD=<Mir Zz100001 Presents>NUL SET PWD=%CD%&CALL SET PWD=%%MZ%%&MODE CON: CP SELECT=437
  3. SET PWD=%CD%%PWD%
  4. ECHO OFF
  5. CLS
  6. IF "%WD%"=="%PWD%" ECHO Bingo~
  7. PAUSE
复制代码

作者: bailong360    时间: 2015-6-16 22:15

回复 34# CrLf
嗯....要想一个复杂的判断输入是否正确的方式,比如先给密码套上几层算法,比如凯撒什么的...

群友凡心写过的一个脚本,不过据他所说算法尚有缺陷导致密码不唯一
  1. :::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. ::本程序主要功能
  3. ::    实现一个密码验证,当然是不容易破解的密码验证
  4. ::    密码验证的算法总有被破解的时候
  5. ::    能给作者带来成就的是在于寻找算法的过程
  6. ::   
  7. ::code by 凡心  2011-8-24
  8. ::::::::::::::::::::::::::::::::::::::::::::::::::::::
  9. @echo off
  10. color 0e
  11. mode con: cols=70 lines=6
  12. set im=echo I'm here!
  13. set try=3
  14. set "delay=for /l %%^%^%a in (1 1 2000) do echo.^^>nul"
  15. :res
  16. set col=07
  17. set a=0
  18. set/p mima=Please input password:
  19. set code=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz
  20. set code1=%code%
  21. call :cod
  22. call :word
  23. for /f "delims=" %%i in ('call call echo %%%%m%o_o%%%%%') do (
  24. color 07
  25. call :ts %%i
  26. )
  27. ::%im% And wrong here!
  28. goto err
  29. pause
  30. goto :eof
  31. :wro
  32. set /a a+=1
  33. call call set %mima:~0,1%=%%%%%%%mima:~0,1%%%%%%%
  34. call call set %mima:~3,1%=%%%%%%%mima:~3,1%%%%%%%
  35. call call set %mima:~4,1%=%%%%%%%mima:~4,1%%%%%%%
  36. if %a% lss 2 goto wro
  37. call call :%%%mima:~0,1%%%%%%mima:~3,1%%%%%%mima:~4,1%%% 2>nul
  38. :err
  39. cls
  40. set /a try-=1
  41. call :col
  42. color 0c
  43. echo.
  44. echo Now! You are here, that's the password is wrong!! Thy again!
  45. echo You will have %try% times to input the password!  
  46. if %try% gtr 0 (goto res) else (color 0c&echo BAD NEWS! SAY BAY TO YOU NOW!!)
  47. pause>nul
  48. goto :eof
  49. :ts
  50. set aa=%1
  51. call set _aa=%%aa:ai= %code1:~5,1%%code1:~23,1% %%
  52. for %%j in (%_aa%) do (if "%%j" equ "%code1:~5,1%%code1:~23,1%" (goto :wro))
  53. goto :eof
  54. :word
  55. for /l %%i in (0,1,61) do call set %%code:~0,1%%=%%code:~1,1%%&call set code=%%code:~1%%
  56. call set %%D%%=P
  57. call set %%M%%=K
  58. call set %%Y%%=G
  59. call set %%i%%=c
  60. call set %%m%%=l
  61. call set %%w%%=x
  62. call set %%r%%=b
  63. goto :eof
  64. :col
  65. if %col% equ 0c (color %col%&set col=07) else (color %col%&set col=0c)
  66. %delay%
  67. goto :eof
  68. :cod
  69. shift /1
  70. set /a oo_1=%random%%%8+1
  71. set /a oo_2=%random%%%8+1
  72. set /a o_o="((%oo_1%^%oo_2%)|255)"
  73. set /a o_o="(0%o_o%)>>3"
  74. set m%o_o%=mima
  75. goto :eof
  76. :end
  77. cls
  78. mode con: cols=55 lines=4
  79. echo.
  80. echo     Congratulates! Your have got the password!
  81. call :col
  82. set /a n+=1
  83. if %n% lss 30 goto end
  84. pause>nul
  85. exit
  86. goto:eof
  87. :p
  88. pause
  89. goto :eof
复制代码

作者: CrLf    时间: 2015-6-16 22:27

回复 35# zz100001


    卧槽,64 位运行失败,提示不支持 16 位应用程序
    以 MZ 开头的文件被当可执行文件了,微软真偷懒,不检测 pe 有效性而直接判断文件头 2 字节,测试这样的代码也会报错:
  1. MZ&pause
复制代码

作者: CrLf    时间: 2015-6-16 22:29

回复 36# bailong360


    凯撒加密是可逆的,可逆算法应该都一一对应才对,摘要算法才会出现密码不唯一的情况
作者: CrLf    时间: 2015-6-16 23:50

回复 35# zz100001


盲算得到的密码应是:
  1. %CD%:
复制代码
然后为了测试运行,只能在 MZ 前面加个空格,验证无误

另外,试了下万能密码,也通过了:
  1. " neq 1 if not "
复制代码

作者: amwfjhh    时间: 2016-12-1 15:33

给跪了……
作者: xyxlhappy    时间: 2017-11-23 10:48

这是怎么加密的呀?
作者: CrLf    时间: 2017-12-4 01:27

回复 41# xyxlhappy


    用 37 代码页输入就行
作者: LTSC1809    时间: 2023-4-9 10:40

密码是“密码”这两个字,因为当“输入”这个变量等于“密码”这两个字符时显示bingo,代码中都写了




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