Co to jest config.plist i czym otwieramy?
Config.plist to po prostu lista konfiguracji-właściwości w formacie XML.
XML posiada wiele podobieństw do HTML. Config.plist możemy otworzyć programem Xcode, zwykłym edytorem jak TextWrangler albo graficznym Clover Configurator, ten będziemy później najczęściej używać.
Struktura
Mówiąc prostym językiem, kiedy Clover czyta config.plist, spodziewa się, że będzie miał pewne elementy w pewnych miejscach. Kolejność i zakres konfiguracji są zatem bardzo ważne, a umieszczenie informacji w niewłaściwym miejscu może skutecznie ukryć je przed Cloverem.
Co znajdziemy w config.plist - typy danych
Istnieje kilka głównych typów danych, na które natrafimy podczas pracy z konfiguracją. Zarysuję tutaj te najczęściej używane.
Strings
<string> To jest ciąg </string>
To po prostu tylko zwykły tekst.
Liczby całkowite (Integers)
integer>1</integer>
To są tylko liczby całkowite.
Dane
<data> QWx0ZW1pcmFiZWxsZQ== </data>
Wyglądają podobnie jak strings, w rzeczywistości jest to zapis danych w base64.
Co to takiego to base64?
Base64 służy do kodowania ciągu bajtów za pomocą ciągu znaków. Kodowanie to przypisuje 64 wybranym znakom wartości od 0 do 63. Ciąg bajtów poddawany kodowaniu dzielony jest na grupy po 3 bajty. Ponieważ bajt ma 8 bitów, grupa 3 bajtów składa się z 24 bitów. Każdą taką grupę dzieli się następnie na 4 jednostki 6-bitowe, więc istnieją dokładnie 64 możliwe wartości każdej z tych jednostek.
Dane base64 można przekonwertować na ASCII za pomocą Terminala:
echo QWx0ZW1pcmFiZWxsZQ== | python -m base64 -d && echo
Zobacz sam co to znaczy

Uwaga >> Wiele edytorów plist (Clover Configurator, Xcode itp.) wyświetli data jako hexadecimal zamiast base64, więc uważaj i upewnij się, z czego korzystasz.
Booleans
<true/> lub <false/>
Możesz myśleć o nich jak o przełączniku, włączony lub wyłączony.
Arrays
To jest nieuporządkowana lista elementów. Gdybyśmy chcieli zebrać zbiór nazwisk, moglibyśmy zapisać je jako wartości <string>.
<array>
<string>Tytus</string>
<string>Romek</string>
<string>Atomek</string>
</array>
Dictionaries - dict
<dict>
<key>Imię</key>
<string>Tytus</string>
<key>Wiek</key>
<integer>11</integer>
<key>Zna XML</key>
<true/>
</dict>
Dictionary tak jak arrays świetnie nadają się do przechowywania dodatkowych kolekcji danych, ale zamiast bazować na indeksie, wykorzystują organizację klucz/wartość.
Jak widać z powyższego przykładu, jesteśmy w stanie przechowywać określone dane o Tytusie za pomocą par key/value. Wszystkie klucze są tylko zwykłym tekstem.
Przykład
W tym przykładzie zamierzamy zmienić wartość logiczną (boolean value) z false na true lub vice versa.
Będę używał wartości Disabled wewnątrz wpisu KextsToPatch, aby uczynić ten przykład realistycznym. Najpierw podamy wpis KextsToPatch, z którym będziemy pracować:
<dict>
<key>Comment</key>
<string>External icons patch</string>
<key>Disabled</key>
<false/>
<key>Find</key>
<data>
RXh0ZXJuYWw=
</data>
<key>InfoPlistPatch</key>
<false/>
<key>Name</key>
<string>AppleAHCIPort</string>
<key>Replace</key>
<data>
SW50ZXJuYWw=
</data>
</dict>
To może wyglądać skomplikowanie, ale nie jest.
Znaczenie różnych kluczy:
Comment - to tylko komentarz opisujący działanie łatki.
Disabled - jest to trochę sprzeczne z intuicją, ale jest to wartość logiczna, która określa, czy ta poprawka jest wyłączona. Jeśli ustawione na <true/>, łatka zostanie wyłączona, a Clover będzie udawać że jej nie widzi.
InfoPlistPatch - jest to wartość logiczna, informacja dla Clovera.
Name - jest to nazwa rzeczywistego kexta, który zamierzamy załatać.
Find - to są dane base64, których chcemy szukać w kexcie.
Replace - to są dane base64 którymi właśnie zastąpimy dane szukane wcześniej w kexcie, jeśli je Clover znajdzie.
W porządku, teraz wyjaśnię, do czego ta łatka jest przeznaczona. Dzięki informacjom zawartym w tej łatce, Clover będzie szukać AppleAHCIPort.kext i wyszuka RXh0ZXJuYWw= oraz zastąpi go SW50ZXJuYWw=.
Efektem końcowym będzie to, że dyski, które można podłączać na gorąco (i zwykle są uważane za dyski zewnętrzne) będą wyświetlane jako dyski wewnętrzne i nie będą miały pomarańczowej ikony na pulpicie. To łatanie dzieje się w locie i jest nieniszczące - co oznacza, że AppleAHCIPort.kext pozostaje nietknięty w systemie.
Jak wyłączyć tą poprawkę?
Zmienimy <false/> na <true/> w ten sposób:
<dict>
<key>Comment</key>
<string>External icons patch</string>
<key>Disabled</key>
<true/>
<key>Find</key>
<data>
RXh0ZXJuYWw=
</data>
<key>InfoPlistPatch</key>
<false/>
<key>Name</key>
<string>AppleAHCIPort</string>
<key>Replace</key>
<data>
SW50ZXJuYWw=
</data>
</dict>
…..
(Tekst jest uproszczonym zarysem, wersją alfa
