Дешифровка и кодировка данных в реестре

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,011
Реакции
5,815
Баллы
648
Предлагаю в этой теме накапливать знания
о стандартных алгоритмах шифрования значений и параметров в реестре,
а также способах их дешифровки.

_______________
Начну,
1) ROT-13 (Цезарь)
К коду символов всех латинских литер добавляется число 13.
На примере зашифрованного пути к ярлыка в меню "Пуск":
Ветка: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\

Coded.png
Функция дешифровки на VBS за авторством REMS (www.petri.co.il)
VB.NET:
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

Decoded.png
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,687
Реакции
6,072
Баллы
913
Dragokas, у тебя где то был vbs для дешифровки бинарников - обратной и классической последовательности?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,011
Реакции
5,815
Баллы
648
Там не шифрование, а простое кодирование было. Код символа -> текст.
Найду - отправлю код. Или нужен образец байтов.

На счет Reversed Hex. Такой вывод давала мне WMI при попытке получить серийный номер диска.
При этом в режиме повышенных привилегий, S/N выдавался уже в нормальном виде (как на этикетке ЖД).
Скрины результатов без прав (слева) и с правами (справа) прилагаются:
Phys_Media_Rights_off.pngPhys_Media_Rights_on.png
Сам запрос для получения S/N:
VB.NET:
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:
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 всех физических дисков прилагаю.
 

Вложения

Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,011
Реакции
5,815
Баллы
648
классической последовательности
Нашел тот VBS.

Hex -> String
VB.NET:
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:
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)
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,687
Реакции
6,072
Баллы
913
Dragokas, не замечал такую штуку:
знаки
00 и 2e отображаются точкой.
Причем 2e на любой раскладке.
Что за точка в знаке 00?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,011
Реакции
5,815
Баллы
648
Ну дык, считай в уме.
[latex]
2E_1_6 = 10_1_6 + 10_1_6 + E_1_6 = 16_1_0 + 16_1_0 + 14_1_0 = 46_1_0
[/latex]

Открывай блокнот и пиши: ALT + 46. Что видишь?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,011
Реакции
5,815
Баллы
648
Нули - то наверное из реестра взято 2-байтовое значение.
Старший байт пустой, вот и нули.
Точка самая обычная. Смотри таблицу символов.
 
Сверху Снизу