Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Dragokas
Эксперт WindowsАвтор FAQ
17016 / 7073 / 856
Регистрация: 25.12.2011
Сообщений: 10,894
Записей в блоге: 16
1

Исследование макросов реестра Windows

15.04.2014, 15:10. Просмотров 676. Ответов 1

Макросы реестра Windows (авт. название) - это запись в реестре вида %a-%Z, %0-%9, которая инициируется через вызов глагола контекстного меню файла (каталога) и преобразуется в информацию, прямо или косвенно связанную с этим файловым объектом

Подумал, может, кому будет интересно почитать.
Исследование делал при поддержке Koza Nozdri 3 месяца назад и до сих пор не продолжал. Если будут новые идеи о неразгаданных переменных, прошу поделиться

Ниже исходный авторский текст на скорую руку и в вольном стиле,
т.ч. прошу не ругать.
___________________________________________________________

Я вооружился первой методикой поиска секретов от Сергея Ткаченко, сделав незамысловатый скрипт, который:
  • создает строку со всеми вариантами макросов,
  • создает в реестре глагол Test_Verb с этой строкой;
  • вызывает глагол или предлагает сделать пользователю это самостоятельно;
  • глагол записывает вывод в файл на рабочем столе в одну строку,
затем после нажатия ОК перекодирует файл во многострочный лог.

Скрипт VBS

Смотрите 3, 5 строки - настройка true или false
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
' Automatic Invoke Verb on Script (Имитировать выполнение глагола на самом скрипте автоматически (программно))
' In this case %W macros will be omitted (в этом случае исключаю макрос %W, т.к. получим исключение о неопределенном родителе)
SelfInvoke = false
' Удалить глагол после отработки скрипта
AutoDeleteVerb = false
 
RegVerb = "Test_Verb"
RegKey = "HKCR\AllFilesystemObjects\Shell\" & RegVerb & "\"
 
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject("WScript.Shell")
 
LogFile = oShell.SpecialFolders("Desktop") & "\" & RegVerb & "_Result.log"
if oFSO.FileExists(LogFile) then oFSO.DeleteFile(LogFile)
 
' Make me Admin :) Получаем права Администратора
if WScript.Arguments.Count = 0 then
    if not isAdminRights() then
        Elevate()
        WScript.Quit
    end if
end if
 
cur = oFSO.GetParentFolderName(WScript.ScriptFullName)
msgbox "ok"
' Generating Verb string (генерирую строку команды для глагола)
s = "cmd /c for /f ""delims="" %%a in ("""
for n = 0 to 255
    if (n>=65 and n<=90) or (n>=97 and n<=122) then
        s = s & "/n" & chr(n) & "=%" & chr(n)
    end if
next
for n = 0 to 9
        s = s & "/n" & n & "=%" & n
next
s = s & """) do echo %%a > """ & LogFile & """"""
if SelfInvoke then s = replace(s, "%w", "BLOCKED by Script", 1, -1, vbTextCompare)
 
' Writing to the registry (создаю в реестре глагол)
oShell.RegWrite RegKey, RegVerb
oShell.RegWrite RegKey & "command\", s
 
' Invoke Test Registry Verb onto this script themself (самовыполнение глагола скриптом себя)
me_file = WScript.ScriptFullName
if SelfInvoke then
    CreateObject("Shell.Application").Namespace(left(me_file, 3)).ParseName(mid(me_file, 4)).InvokeVerb(RegVerb)
    WScript.Sleep(2000)
end if
 
if not SelfInvoke then msgbox "Теперь выполните глагол контекстного меню " & RegVerb & " на любом файле или папке.  Не закрывайте это окно !!!"
 
' Clear the registry (удаление глагола контекстного меню)
if AutoDeleteVerb then
    oShell.RegDelete RegKey & "command\"
    oShell.RegDelete RegKey
end if
 
' Replace \n -> 0x0D 0x0A (заменяю в однострочном выводе псевдопереносы на перевод каретки)
with oFSO.OpenTextFile(LogFile,1) '1 - for Reading only
    s = .ReadAll()
    .Close
end with
 
s = Replace (s, "/n", vbCrLf)
 
with oFSO.CreateTextFile(LogFile, true) 'перезаписываю файл
    .Write s
    .Close
end with
 
' Open Log-file (открываю файл)
oShell.Run "explorer """ & LogFile & """", 1, false
 
Set oFSO = Nothing: Set oShell = Nothing
 
Sub Elevate()
  Const DQ = """"
  Set colOS = GetObject("winmgmts:\root\cimv2").ExecQuery("Select * from Win32_OperatingSystem")
  For Each oOS In colOS
    strOSLong = oOS.Version
  Next
  If Left(strOSLong, 1) = "6" Then
    If Not isAdminRights Then
        Set oShellApp = CreateObject("Shell.Application")
        oShellApp.ShellExecute WScript.FullName, DQ & WScript.ScriptFullName & DQ & " " & DQ & "Twice" & DQ, "", "runas", 1
        WScript.Quit
    End If
  End If
  set oOS = Nothing: set colOS = Nothing: set oShellApp = Nothing
End Sub
 
Function isAdminRights()
    Const KQV = &H1, KSV = &H2, HKCU = &H80000001, HKLM = &H80000002
    Set oReg = GetObject("winmgmts:root\default:StdRegProv")
    strKey = "System\CurrentControlSet\Control\Session Manager"
    intErrNum = oReg.CheckAccess(HKLM, strKey, KQV + KSV, flagAccess)
    isAdminRights = flagAccess
    Set oReg = Nothing
End Function


Вывод скрипта

A=A
B=B
C=C
D=C:\Users\Alex\Desktop\Special Character.txt
E=E
F=F
G=G
H=0
I=:192046304:2236

J=J
K=K
L=C:\Users\Alex\Desktop\Special Character.txt
M=M
N=N
O=O
P=P
Q=Q
R=R
S=1
T=T
U=U
V=C:\Users\Alex\Desktop\Special Character.txt
W=C:\Users\Alex\Desktop

X=X
Y=Y
Z=Z
a=a
b=b
c=c
d=C:\Users\Alex\Desktop\Special Character.txt
e=e
f=f
g=g
h=0
i=:192046304:2236
j=j
k=k
l=C:\Users\Alex\Desktop\Special Character.txt
m=m
n=n
o=o
p=p
q=q
r=r
s=1
t=t
u=u
v=C:\Users\Alex\Desktop\Special Character.txt
w=C:\Users\Alex\Desktop
x=x
y=y
z=z
0=C:\Users\Alex\Desktop\Special Character.txt
1=C:\Users\Alex\Desktop\Special Character.txt

2=
3=
4=
5=
6=
7=
8=
9=



Из анализа видно, что:
  • регистр букв макроса не имеет значения;
  • для папок и файлов результаты не отличаются;
  • Доступные макросы: %D, %H, %I, %L, %S, %V, %W, %0 - %9
  • %D,%L,%V,%0,%1 - выдают одинаковую информацию - путь и имя целевого объекта
  • %W - выдает путь к папке, в которой находится объект;
  • %H - всегда показывает 0
  • %S - всегда показывает 1
  • %I - что такое для меня сначала было загадкой. :192046304:2236 ??? при этом последние 4 цифры за время тестов всегда были одинаковы.

1) Также я долго не мог понять, почему получаю ошибку при попытке исполнить глагол контекстного меню программно из скрипта
(да, такое возможно. Я ранее описывал полезность это метода для установки inf).

Методом исключения виновником нашелся макрос %W,
который не просто выдает путь к каталогу, в котором находится целевой файл или каталог,
а обращает внимание на родителя (а именно процесса), из которого вызван глагол для объекта.

В чем это выражается:
когда я нажимаю в Total Commander-e правой клавишей по любому файлу и выполняю глагол, получаю ту же ошибку:


Т.е. родитель - не Explorer, а TC.
Тоже самое, когда я делаю это программно. Родитель - wscript.exe

Забавно, что если в реестре оставить только само значение %W - это не вызывает ошибки. И в ответ на глагол открывается стандартное окно "Открыть с помощью"
связанное с типом файла целевого объекта.

Но при попытке явно раскрыть его как строку, передав в качестве аргумента любому приложению, например, если пропишу в Verb\Command: @=
Код
explorer %W
получаем ту же ошибку.

Напрашивается вывод: неужели внутри самих реестровых значений также существует некий подтип данных
(например, строка и Nothing - отсутствие объекта, вызывающее "исключение" у самой среды)?

2) И когда я обошел эту проблему путем удаления макроса %W из строки
и запустил глагол программно, макрос %%I поменял последние цифры !!!

Вуаля, первая мысль ProcessID. И команда tasklist | find "2236" указала на explorer.exe, что
так и есть. Глагол умеет определять ProcessID родителя, который его запустил.
Но там же не только PID.
192046304

Вбиваю не задумываясь:
Код
wmic process where caption="explorer.exe" get /value
Но дальше ждет облом, т.к. никакой зависимости я не нашел
Для желающих ее поискать

wscript.exe, запускающий глагол самого себя:
(поэтому PID всегда разный)

2980272:6116
3850752:4676
4785408:6752
2710240:6068

Запуск глагола через проводник:

275734032:2236
275733024:2236
275733600:2236

-- здесь выдержал некоторое время:

189618384:2236
189616656:2236
189618240:2236
189618096:2236

192040688:2236
191547376:2236
191545360:2236

Первые 5 цифр у explorer.exe часто совпадают,
да и их общее кол-во больше чем у wscript.exe
Но что это такое - остается загадкой.

На счет цифровых макросов нужно больше информации.
С 2 по 9 - пустые значения (но они точно есть, а иначе бы вывелась цифра)
На счет %H = 0, %S = 1. Также неизвестно, что это.

Продолжение следует...
1
Миниатюры
Исследование макросов реестра Windows  
Вложения
Тип файла: zip Generate_All.zip (1.8 Кб, 3 просмотров)
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2014, 15:10
Ответы с готовыми решениями:

Редактирование реестра Windows.
Добавит ключ в реестр или удалить и посмотреть

Windows-приложение "Формирование реестра заказов "
Помогите пожалуйста, не совсем понимаю как реализовать данное задание ...

Написание макросов к Corel
sabj? нашел в sabj меню вида - VB кто-то знает что это или где можно почитать

Конвертация макросов Excel
Народ! подскажите есть ли такая возможность,конвертация макросов excel в VB?...

Автозапус макросов в word
Необходимо, чтобы при открытии документа запускался простенький макрос,...

1
Dragokas
Эксперт WindowsАвтор FAQ
17016 / 7073 / 856
Регистрация: 25.12.2011
Сообщений: 10,894
Записей в блоге: 16
15.04.2014, 15:14  [ТС] 2
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Дополнение от Koza Nozdri на счет цифровых переменных:
Код
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\txtfile\shell\open\command
%SystemRoot%\system32\NOTEPAD.EXE /p %1
%SystemRoot%\system32\notepad.exe /pt "%1" "%2" "%3" "%4"
Такой вариант будет отправлять объект на печать при отрытии в блокноте.
Здесь %1 это открытие файла,как обычно.

%2 - отправка на принтер
%3 вызов драйвера печати
%4 номер порта
% 3 и% 4 не заключаются в кавычки.

Аргументы
%fn - путь к файлу
%pt - имя принтера

например
Код
notepad.exe /pt "%fn" "%pt"
отправляет файл %fn на принтер %pt

printo и pt печатает файл на указанном принтере. Используется Оболочка с поддержкой drag-and-drop для принтеров.

%1-это имя файла и %2-имя принтера.
Можно игнорировать %3 и %4 для Windows 95 и более поздних системах.
Для систем Windows 3.1, %3 представляет собой имя драйвера и %4 имя порта
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2014, 15:14

Как посмотреть коды макросов в документе
Дан макровирус в Word на Visual Basic. Нужно разобрать, что он делает. Как мне...

Небольшой обман при запуске макросов
Есть файл xls с кучей макросов, которые, естественно, запаролены. Предположим,...

Вылетает проект при запуске макросов в Ворде
здравствуйте, при запуске одного макроса в Ворде прога на ВБ6 &quot;вылетает&quot; -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru