0

我有一个 Windows 批处理文件,它可以解码我拥有的密码(没有讨厌的评论,它只是为了看看 somthing 是如何工作的)。

密码是从一个没有问题的文件中读取的,但是我现在尝试对其进行解码,除了我不知道如何适应未知长度的密码字符之外,我不会有任何问题。

以下工作但仅适用于有限数量的字符我如何为未知(无限)大小的密码编程类似的东西?

如果您想知道为什么 ~0,2 ,因为字母表中的每个字母都由一个双数字字符集表示,例如 00 代表 A 或 01 代表 B 这些是在我之前构建的另一个程序中随机生成的。

IF %MYPASSWORD:~0,2% == %AA% msg * first letter is A
IF %MYPASSWORD:~0,2% == %BB% msg * first letter is B
IF %MYPASSWORD:~0,2% == %CC% msg * first letter is C
IF %MYPASSWORD:~0,2% == %DD% msg * first letter is D
IF %MYPASSWORD:~0,2% == %EE% msg * first letter is E
IF %MYPASSWORD:~0,2% == %FF% msg * first letter is F
IF %MYPASSWORD:~0,2% == %GG% msg * first letter is G
IF %MYPASSWORD:~0,2% == %HH% msg * first letter is H
IF %MYPASSWORD:~0,2% == %II% msg * first letter is I
IF %MYPASSWORD:~0,2% == %JJ% msg * first letter is J
IF %MYPASSWORD:~0,2% == %KK% msg * first letter is K
IF %MYPASSWORD:~0,2% == %LL% msg * first letter is L
IF %MYPASSWORD:~0,2% == %MM% msg * first letter is M
IF %MYPASSWORD:~0,2% == %NN% msg * first letter is N
IF %MYPASSWORD:~0,2% == %OO% msg * first letter is O
IF %MYPASSWORD:~0,2% == %PP% msg * first letter is P
IF %MYPASSWORD:~0,2% == %QQ% msg * first letter is Q
IF %MYPASSWORD:~0,2% == %RR% msg * first letter is R
IF %MYPASSWORD:~0,2% == %SS% msg * first letter is S
IF %MYPASSWORD:~0,2% == %TT% msg * first letter is T
IF %MYPASSWORD:~0,2% == %UU% msg * first letter is U
IF %MYPASSWORD:~0,2% == %VV% msg * first letter is V
IF %MYPASSWORD:~0,2% == %WW% msg * first letter is W
IF %MYPASSWORD:~0,2% == %XX% msg * first letter is X
IF %MYPASSWORD:~0,2% == %YY% msg * first letter is Y
IF %MYPASSWORD:~0,2% == %ZZ% msg * first letter is Z

很好,因为这只涵盖了第一个字符。例如,如果我有 100 个字符,如果我有 1000 1000 倍以上,我将不得不重复上述 100 次(对不起,我认为这是循环的理想选择,但我总是遇到问题)

简而言之,如果密码中有 1000 个字符,我试图循环到 %MYPASSWORD:~998:2%,如果有一百万个字符,则尝试循环到 %MYPASSWORD:~99998:2%。显然没有人编码那个数量

4

1 回答 1

1

如果您颠倒字符映射变量的定义,您的工作会变得容易得多。您使用字母作为名称,使用代码作为值。我会使用名称中的代码,并使用字母作为值。该名称应以非数字字符为前缀,以便解析器不会混淆%17%参数%1

例如,您可能已经定义了set AA=21,我会定义set map21=A

批处理变量的长度不是无限的 - 最大长度为 8192 个字符。将其除以 2,您就有了最大循环数。FOR /L 命令是一个快速循环结构。

您还将受益于使用延迟扩展。

如果您采用上述建议,这就是您所需要的一切:

setlocal enableDelayedExpansion
set "decodedPassword="
for /l %%N in (0 2 8191) do (
  for /f "delims=" %%C in ("!MYPASSWORD:~%%n,2!") do (
    set "decodedPassword=!map%%C!"
  )
)

上面的代码可以进一步优化。例如,在处理完最后一个代码后继续寻找更多代码会浪费时间。但是在您的情况下,浪费的时间可能无关紧要。

于 2013-02-20T19:58:57.580 回答