SPOSOBY AUTOMATYCZNYCH MODYFIKACJI REJESTRU*


Zajmować się będziemy strukturami plików:
*.reg
*.bat
*.inf

Jeśli to czytasz to zakładam, że znasz choć podstawowe informacje o rejestrze, takie jak: typy wartości rejestru, struktura rejestru, ... . Jeśli nie masz pojęcia o tych rzeczach, powinieneś przeczytać najpierw FAQ na temat rejestru.


Modyfikacja plikami *.reg


Modyfikowanie rejestru systemowego z urzyciem plików reg jest bardzo popularnym sposobem. Może przejde odrazu do budowy plików reg. Jest ona poniekąd podobna do struktury plików ini. Tak czy inaczej ogólny schemat pliku .reg napisanego przy pomocy np. notatnika wygląda tak:

Windows Registry Editor Version 5.00

[HKEY??\Klucz]
@="dane wartości domyślnej"
"xxx"="Dane wartości ciągu o nazwie xxx"
"yyy"=dword:0000006f
"binarnawar"=hex:74,6f,20,64,6f,20,63,68,75,6a,61,20,6a,65,73,74,20,77,61,72,\
74,6f,63,73,20,62,69,6e,61,72,6e,61

[HKEY??\inny_Klucz]
@="dane wartości domyślnej innego klucza"
"vvv"="Dane wartości ciągu o nazwie vvv"
"aaa"=dword:0000000c
"bbb"=dword:0000000d
"ccc"=dword:0000000e
"zzz"=dword:0000000f

Teraz podejmę się wyjaśnienia przykładu.
Pierwsza linijka jest obowiązkowa. Informuje ona system o wersji programu Regedit, dzięki czemu nie dojdzie do błędu podczas wprowadzania zmian w życie jeżeli będziemy pracować na wcześniejszych wersjach windows'a niż XP. Po niej musi nastąpić wolna linijka bez żadnego znaku.
Następnie w nawiasie kwadratowym występuje ścieżka do modyfikowanego klucza (w nie skróconej wersji, np.: HKEY_CURRENT_USER\Software\Klucz).
Kolejne linijki nie są już obowiązkowe. Pierwsza określa jakie nowe dane ma posiadać wartość domyślna danego klucza. Wartości domyślne kluczy ustala się więc w ten sposób: @= (otwieramy cudzysłów - ") dane wartości domyślnej (zamykamy cudzysłów - "):
@="dane"
Kolejna linijka dodaje do określonego wcześniej w nawiasach kwadratowych klucza wartość ciągu o nazwie xxx i danych określonych w cudzysłowiach po prawej stronie znaku równości - = (w tym wypadku te dane to: Dane wartości ciągu o nazwie xxx).
Kolejna linijka dodaje do określonego w nawiasach kwadratowych klucza wartość DWORD. Wartość dword dodaje się w taki sposób:
w cudzysłowiu pierwszym podajemy nazwę wartości, następnie piszemy znak równości, następnie (bez znaku spacji) piszemy dword:, i na końcu dopisujemy (w formie cyfr szesnastkowych) liczbę będącą danymi wartości.
Ostatnia linijka która odnosi się do pierwszego modyfikowanego klucza, dodaje (lub zmienia jeśli już taka wartość istnieje) wartość binarną o nazwie binarnawar. Dodowanie (lub zmienianie) wartości binarnej konstruuje się tak:
w cudzysłowiu podajemy nazwę wartości, następnie piszemy (bez spacji) =hex:, i na końcu piszemy dane tej wartości (także bez spacji). Same dane wartości binarnej piszemy jako bajty przedstawione w formie szesnastkowej oddzielane przecinkami. Jeśli chcemy przejść do kolejnej linijki kontynuując pisanie danych należy użyć znaku \.

Modyfikacji drugiego klucza już nie będe omawiał, ale spróbuj sam sobie odpowiedzieć na pytanie jakie wartości ta część pliku reg dodaje do rejestru.

Przedstawiłem sposób dodawania do rejestru wartości typu: wartość ciągu, wartość DWORD, wartość binarna.
Praktycznie wartości innych typów używać nie będziesz w ogóle, jednak jeżeli chcesz nauczyś się je tworzyć to przedstawie ci kolejny przykład:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Klucz]
"wielociąg"=hex(7):54,00,6f,00,20,00,6a,00,65,00,73,00,74,00,20,00,57,00,61,\
00,72,00,74,00,6f,00,5b,01,07,01,20,00,57,00,69,00,65,00,6c,00,6f,00,63,00,\
69,00,05,01,67,00,75,00,00,00,00,00
"ciąg rozwijalny"=hex(2):74,00,6f,00,20,00,6a,00,65,00,73,00,74,00,20,00,57,00,61,\
00,72,00,74,00,6f,00,5b,01,07,01,20,00,63,00,69,00,05,01,67,00,75,00,20,00,\
72,00,6f,00,7a,00,77,00,69,00,6a,00,61,00,6c,00,6e,00,65,00,67,00,6f,00,00,\
00

Te typy wartości to wartość wielociągu oraz wartość cięgu rozwijalnego.
Jak widzisz sposób w jaki się je tworzy jest bardzo zbliżony do sposobu tworzenia wartości binarnych, więc opiszę tylko różnice.
Jeżeli chodzi o wartości wielociągu to pierwszą różnicą w zapisie jest =hex(7): zamiast =hex: jak ma to miejsce w wartościach binarnych. Pisałem, (w opisie wartości binarnych) że dane zapisuje się w postaci bajtów w zapisie szesnastkowym oddzielonych od siebie przecinkami. Tak samo jest teraz. Te bajty to kody ASCII (opisane w systemie szesnastkowym) liter. Pomiędzy każdą literą wstawić należy znak NULL o kodzie 00. Aha tabelę kodów ASCII znajdziesz w Tabeli kodów ASCII ( to chyba logiczne ;) ).
No to teraz druga wartość dodawana przez nasz przykład. Jest to wartość ciągu rozwijalnego o nazwie ciąg rozwijalny. Sposób pisania danych wartości tego typu jest taki sam jak ostatnio. Różnicą jest tutaj oznaczenie typu wartości, czyli ciąg zaków =hex(2): zamiast ciągu =hex(7): . Reszta jest taka sama.
Aha. Jeszcze jedno. Dla bezpieczeństwa, żebyś czasem czegoś nie spier...ł, w przypadku wartości wielociągu należy podać pięć ostatnich bajtów jako 00, a w przypadku wartości ciągu rozwijalnego trzy ostatnie bajty jako 00 (patrz przykład).

Oki no to teraz przykład z obrazkiem (na wszelki wypadek gdybyś nie umiał czytać ;) )
Taki plik .reg :

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Klucz1]
"cos"=dword:000003db
@=" "
"opcja"=hex(7):6e,00,6f,00,00,00,00,00
"war"=hex:01,23,45
"ciag"="No i ch**"
"widzisz"=hex(2):77,00,69,00,64,00,7a,00,65,00,00,00

[HKEY_CURRENT_USER\Klucz2]

Dokonuje takich zmian:



No i to było by na tyle jeśli chodzi o pliki reg. No może jeszcze jedno :
Kontynuując ten przykład stwórz taki plik reg i go uruchom:

Windows Registry Editor Version 5.00

[-HKEY_CURRENT_USER\Klucz1]

[-HKEY_CURRENT_USER\Klucz2]

Nie wdając się w szczegóły powiem tylko że jeśli ścieżkę jakiegoś klucza poprzedzimy minusem (-), to klucz ten zostanie usunięty z rejestru. Tak więc opisany wyżej plik reg usunie z rejestru klucze o nazwach klucz1 oraz klucz2 z gałęzi HKEY_CURRENT_USER.


Modyfikacja plikami *.bat


Pliki bat czyli pliki wsadowe mają możliwość także modyfikowania rejestru systemowego (oczywiście to nie działa spod DOS'a). Może od razu zajmę się podstawowymi komendami obsługującymi rejestr. A więc są to komendy add oraz delete. Tak właściwie to według mnie pliki bat modyfikujące rejestr pisze się dużo łatwiej niż pliki reg. Może przejde od razu do przykładu:

reg add "HKCU\Klucz1"
reg add "HKCU\Klucz2" /ve /t REG_SZ /d "dane"
reg add "HKCU\Klucz2" /v "sz" /t REG_SZ /d "dane 2"
reg add "HKCU\Klucz2" /v "bin" /t REG_BINARY /d "01020304"
reg add "HKCU\Klucz2" /v "dword" /t REG_DWORD /d "00000031"
reg delete "HKCU\Klucz1"
reg delete "HKCU\Klucz2" /v "sz"

Na przykładzie łatwo domyślić się że:
Komenda reg add dodaje coś do rejestru.
Komenda reg delete usuwa coś z rejestru.
Po każdej z tych komend musi znaleźć się ścieżka do modyfikowanego klucza (najlepiej w cudzysłowiach).
Jeżeli po ścieżce klucza nie występują żadne parametry (/ve /v /t /d), to klucz jest dodawany lub usuwany.
Parametr /t określa typ dodawanej wartości. (Jakie mogą być typy napisze później)
Parametr /ve określa że ma być usuwana lub tworzona domyślna wartość klucza
Parametr /v określa nazwę tworzonej lub usuwanej wartości (dobrze byłoby gdyby ta nazwa wystąpiła w cudzysłowiach)
Parametr /d określa dane jakie ma mieć tworzona wartość.

Oto jakie typy mogą wystąpić po parametrze /t:
REG_SZ - wartość ciągu
REG_DWORD - wartość DWORD
REG_BINARY - wartość binarna
oraz kilka innych którymi się tu zajmował nie będe.

Przejdźmy do analizy przykładu:
Pierwsza linijka mówi nam że ma zostać utworzony klucz o nazwie Klucz1 w kluczu HKCU.
Druga linijka mówi, że w kluczu HKCU\Klucz2, dane wartości domyślnej mają zostać zmienione na dane. (Jeśli taki klucz nie istnieje zostanie utworzony).
Trzecia linijka mówi, że w kluczu HKCU\Klucz2, ma zostać utworzona wartość ciągu o nazwie sz, oraz danych dane 2.
Czwarta linijka mówi, że w tym kluczu ma zostać utworzona wartość binarna o nazwie bin oraz danych 01 02 03 04. Zauważ że poszczególne bajty w przykładzie nie są od siebie oddzielone żadnym separatorem.
Piąta linijka mówi, że w kluczu (tym samym co zwykle), ma zostać utworzona wartość DWORD o nazwie dword oraz danych 31. Tutaj taka mała uwaga. Dane wartości DWORD w plikach bat są podawane w systemie dziesiętnym. Oznacza to, że napisana liczba 31 rzeczywiście przedstawia 31. Linijka odpowiadająca za to samo w pliku reg wyglądałaby więc tak: "dword"=dowrd:0000001f.
Szósta linijka natomiast coś usuwa. Ponieważ wystąpiła tu tylko ścieżka do klucza, oznacza to, że usunięty zostanie cały klucz.
W siódmej linijce oprócz ścieżki klucza, wystąpiła także nazwa wartości, więc usunięta zostanie tylko ta wartość. (komenda reg delete nie potrzebuje ani parametru /t, ani też /d.

Jeszcze jedna sprawa. Podczas dodawania do rejestru wartości, może zdarzyć się, że taka wartość już istnieje, a my chcemy tylko zmienić jej dane. Wtedy zostaniemy zapytani, czy chcemy nadpisać (zmienić) wartość. Wszystko jest oki, ale jeśli w naszym pliku bat znajduje się 100 linijek zmieniających już istniejące wartości to będziemy musieli 100 razy potwierdzać zmianę wartości. Aby się od tego uchronić na końcu każdej linijki możemy dodać parametr /f. Mówi on, że jeżeli wartość istnieje, to bez pytania o zgodę system ma zmienić jej dane na nowe podane przez nas w pliku.

Jak zwykle dla nieumiejących czytać przedstawię przykład z obrazkiem ;) :
Taki pliczek *.bat:

reg delete "HKCU\Klucz1" /f
reg add "HKCU\Klucz2" /v "war1" /t REG_SZ /d "dane" /f
reg add "HKCU\Klucz2" /v "war2" /t REG_DWORD /d "00002005" /f
reg add "HKCU\Klucz2" /v "war3" /t REG_BINARY /d "23ef0a" /f

Dokonuje takich zmian:



Chyba zajażyłeś.


Modyfikowanie rejestru plikami *.inf


Modyfikowanie rejestru plikami inf różni się od poprzednich sposobów właściwie jedną rzeczą. Aby taki plik uruchomić należy kliknąć na nim prawym przyciskiem myszy i z menu wybrać polecenie zainstaluj, a nie dwukrotnie kliknąć na nim lewym przyciskiem myszy.
Opisze tu tylko jak modyfikować rejestr przy pomocy plików inf, ponieważ aby opisać wszystko co można zrobić przy ich pomocy, musiałbym napisać jeszcze jeden tekst dużo dłuższy od tego który właśnie czytasz.
Dosyć pier***enia. Zacznę od ogólnej konstrukcji pliku inf, który modyfikuje rejestr:

[Version]
signature="$Windows NT$"

[DefaultInstall]
AddReg=
xxx
DelReg=
yyy

[xxx]
HKEY,Klucz,Nazwa,Typ,Dane

[yyy]
HKEY,Klucz,Nazwa
lub
HKEY,Klucz

Zaczynając od początku:
Pierwsza i druga linijka są obowiązkowe. Trzecia linijka (pusty wiersz) też ;) .
No i czwarta też obowiąkowa.
Piąta określa która sekcja będzie odpowiedzialna za dodanie czegoś do rejestru.
Szósta określa która sekcja będzie odpowiedzialna za usunięcie czegoś z rejestru.
Czyli my określiliśmy, że sekcja xxx będzie coś dodawała do rejestru, a sekcja yyy będzie coś z rejestru usuwała.

No to teraz struktury tych sekcji:

W przypadku sekcji dodającej informacje do rejestru, należy podać następujące dane:
Klucz główny - HKEY (np. HKLM)
Nazwę podklucza - Klucz (np. Software\Microsoft)
Nazwę dodawanej wartości - Nazwa (np. Imie)
Typ dodawanej wartości - Typ (0 dla wartości ciągu, 1 dla wartości binarnej,65536 dla wartości wielociągu lub 65537 dla wartości dword)
Dane tej wartości - Dane (w wypadku typu 0 i 65536, po prostu podajemy jakiś ciąg znaków. W wypadku typu 1, podajemy kolejne wartości bajtów w formie szesnastkowej odzielając je przecinkami, tak jak ma to miejsce z wartościami binarnymi w plikach .reg, w przypadku wartości DWORD - typu 65537 podajemy wartość liczby w systemie szesnastkowym, poprzedzając ją znakami 0x, np. 0xAF3E)

W przypadku sekcji usuwającej informacje z rejestru, należy podać następujące dane:
Klucz główny - HKEY (np. HKCU)
Nazwę podklucza - Klucz (np. Control Panel)
Wtedy zostanie usunięty cały podany klucz (W tym wypadku HKCU\Control Panel). Jeśli chcemy usunąć tylko jakąś wartość tego klucza to należy podać jeszce jej nazwę - Nazwa (np. Opened).

Przykładzik z obrazkiem chyba to wyjaśni:
Taki plik inf:

[Version]
signature="$Windows NT$"

[DefaultInstall]
AddReg=dodaj
DelReg=usun

[dodaj]
HKCU,Software\Klucz1,War,0,"Ciąg"
HKCU,Software\Klucz1,Warr,1,01,02,03,0f

[usun]
HKCU,Software\Klucz2,war
HKCU,Software\Klucz3

Dokona takich zmian:



Jeszcze jeden przykładzik (tym razem już bez obrazka):

[Version]
signature="$Windows NT$"

[DefaultInstall]
AddReg=plus

[plus]
HKCU,Software\aaa,Wara,0,"Ciąg"
HKCU,Software\aaa,Warb,1,01,02,03,0f
HKCU,Software\aaa,Warc,65536,"Jakieś dane wartości wielociągu"
HKCU,Software\aaa,Ward,65537,0x1

Sam sie domyśl co robi taki pliczek :)

No i koniec :) .
Na zakończenie powiem tylko że pliki inf najbardziej mi odpowiadają, z tego względu, że nigdy nie pytają o pozwolenie modyfikowania rejestru. Odpalisz i se możesz kompa zjeb** bez żadnych ostrzeżeń ;) .



* Automatyczny w rozumieniu takim, że wszystkie wcześniej zdefiniowane zmiany wykonywać mają się same bez interwencji użytkownika. (Jadyną interwencją jest zapoczątkowanie procesu poprzez "odpalenie" pliku).