Предлагаю в этой теме накапливать знания
о стандартных алгоритмах шифрования значений и параметров в реестре,
а также способах их дешифровки.
_______________
Начну,
1) ROT-13 (Цезарь)
К коду символов всех латинских литер добавляется число 13.
На примере зашифрованного пути к ярлыка в меню "Пуск":
Ветка: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\
Функция дешифровки на VBS за авторством REMS (www.petri.co.il)
VB.NET / VBA:
function encodedecode(s)
' ROT13 ("ROTate by 13 places") is a simple Caesar cipher
' used for obscuring text by replacing each letter with the
' letter thirteen places down the alphabet.
' ROT13 scrambles only letters.
For i = 1 To Len(s)
cd = Asc(Mid(s, i, 1))
If cd >= 65 and cd =< 90 then 'uppercase
cd = cd+13
If cd > 90 then cd = cd-26
ElseIf cd >= 97 and cd =< 122 then 'lowercase
cd = cd+13
If cd > 122 then cd = cd-26
End If
coded = coded & chr(cd )
Next
encodedecode = coded
End Function
Там не шифрование, а простое кодирование было. Код символа -> текст.
Найду - отправлю код. Или нужен образец байтов.
На счет Reversed Hex. Такой вывод давала мне WMI при попытке получить серийный номер диска.
При этом в режиме повышенных привилегий, S/N выдавался уже в нормальном виде (как на этикетке ЖД).
Скрины результатов без прав (слева) и с правами (справа) прилагаются:
Сам запрос для получения S/N:
VB.NET / VBA:
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PhysicalMedia", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
if instr(objItem.Tag, "DRIVE") <> 0 then msgbox "Tag: " & objItem.Tag & vblf & "SerialNumber: " & objItem.SerialNumber
Next
Итого нужно строку вида: 2020202020202020202020203157304641444b57
превратить в строку: W1F0DAWK
Код будет такой:
VB.NET / VBA:
s = "2020202020202020202020203157304641444b57"
For i = 1 To Len(s) Step 4
d = d & Chr("&h" & Mid(s, i + 2, 2)) & Chr("&h" & Mid(s, i, 2))
Next
WScript.Echo Trim(d)
(спасибо за помощь Казанский)
CMD/BATCH:
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
call :Hex_To_String "2020202020202020202020203157304641444b57" out
echo -%out%-
pause
Exit /B
:Hex_To_String %1-in.Reversed.Hex.Number %2-out.String
SetLocal& set "x16=%~1"
set n=45
for %%A in (- . / 0 1 2 3 4 5 6 7 8 9) do set s.!n!=%%A& set /a n+=1
set n=65
for %%A in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set s.!n!=%%A& set /a n+=1
set n=97
for %%A in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set s.!n!=%%A& set /a n+=1
set xs=
for /L %%C in (0,4,8184) do (
if "!x16:~%%C,1!"=="" goto _ex_Hex
set /A cplus=%%C+2
call set /A x10=0x%%x16:~!cplus!,2%%
call set xs=!xs!%%s.!x10!%%
set /A x10=0x!x16:~%%C,2!
call set xs=!xs!%%s.!x10!%%
)
:_ex_Hex
EndLocal& set "%~2=%xs%"& Exit /B
Смысл в том, чтобы каждую пару 16-ричных чисел поменять местами, а затем x16 -> x10 -> String.
Собственно батник, в котором реализовано получение S/N всех физических дисков прилагаю.
strIn = InputBox("Введите значение REG_EXPAND_SZ (REG_MULTI_SZ)")
a = Split(strIn, ",")
For i = 0 To UBound(a) Step 2
strOut = strOut & Chr(CInt("&H" + a(i)))
Next
'Урезаем Null '\0'
Do While Right(strOut, 1) = vbNullChar
strOut = Left(strOut, Len(strOut) - 1)
Loop
'Копирование текста в буфер обмена
CreateObject("WScript.Shell").Run "cmd.exe /C <nul set /p ""=" & strOut & """ | CLIP", 0, False
ret = InputBox("Результат скопирован в буфер обмена", , strOut)
String -> Hex
VB.NET / VBA:
strIn = InputBox ("Введите текст для перевода в REG_EXPAND_SZ (REG_MULTI_SZ)")
For i = 1 To len (strIn)
strOut = strOut & Hex(Asc(mid(strIn,i,1))) & ",00,"
Next
strOut = strOut & "00,00"
'Копирование текста в буфер обмена
CreateObject("WScript.Shell").Run "cmd.exe /C <nul set /p ""=" & strOut & """ | CLIP", 0, False
ret = inputbox ("Результат скопирован в буфер обмена",,strOut)