ZProtect
Code_Confusion jest kodem kryptograficznym tagiem w nieuporządkowanej kolejności, który pozwala wybrać część kodu w nieodpowiedniej kolejności
Wstaw kod ({ 235, 8, 83, 84, 95, 83, 84, 65, 82, 84 }) ' Code_Confusion znak, aby zacząć
Wstaw kod ({ 235, 8, 83, 84, 95, 83, 84, 69, 78, 68 }) ' Code_Confusion koniec znaku
Code_Elimination to marker czyszczenia kodu, który pozwala wybrać fragment kodu do usunięcia z pamięci po uruchomieniu; Celem użycia tego znacznika jest zapobieganie wyrzucaniu całego kodu programu z pamięci przez crackery.
Wstaw kod ({ 235, 8, 79, 67, 95, 83, 84, 65, 82, 84 }) ' Code_Elimination tag się zaczyna
Wstaw kod ({ 235, 8, 79, 67, 95, 79, 67, 69, 78, 68 }) ' Code_Elimination znak na końcu
Decode_onExec jest dynamicznym znacznikiem dekodującym, który pozwala wybrać fragment kodu odszyfrowywający tylko podczas wykonywania; Ta część kodu jest dekodowana tylko wtedy, gdy musi zostać wykonana, i jest szyfrowana przed i po wykonaniu
Wstaw kod ({ 235, 8, 68, 89, 95, 83, 84, 65, 82, 84 }) // Decode_onExec zaczyna się tag
Wstaw kod ({ 235, 8, 68, 89, 95, 68, 89, 69, 78, 68 }) // Decode_onExec oznaczyć koniec
Decode_onReg jest tagiem dekodującym rejestrację, który pozwala wybrać część kodu odszyfrowaną za pomocą ważnego klucza; Jeśli klucz rejestracyjny jest nieprawidłowy, ta część kodu zawsze będzie szyfrowana. W prostych słowach, ta część kodu jest wykonywana tylko w zarejestrowanej wersji
W kodzie źródłowym można użyć dowolnej liczby Decode_onReg tagów, ale fragmenty kodu są deszyfrowane jednocześnie z ich wykonywaniem. Tag dekodowania rejestracji służy głównie do aktywowania funkcji ograniczonych w wersji niezarejestrowanej, aby zarejestrować ją jako pełną wersję.
Wstaw kod ({ 235, 8, 82, 68, 95, 83, 84, 65, 82, 84 }) // Decode_onReg tag się zaczyna
Wstaw kod ({ 235, 8, 82, 68, 95, 82, 68, 69, 78, 68 }) // Decode_onReg oznacz koniec
Zprotect_VM to tag szyfrowania maszyny wirtualnej, który pozwala wybrać fragment kodu do wprowadzenia maszyny wirtualnej do uruchomienia; System instrukcji maszyny wirtualnej jest zupełnie inny niż istniejące instrukcje x86, co skutecznie uniemożliwia przywracanie i analizę kodu
Wstaw kod ({ 235, 8, 86, 77, 95, 83, 84, 65, 82, 84 }) // Zprotect_VM zaznacz, aby zacząć
Wstaw kod ({ 235, 8, 86, 77, 95, 86, 77, 69, 78, 68 }) // Zprotect_VM oznacz koniec
----------- dla wersji ZProtect V1.4.9.0---------
VMProtect
Wprowadź kod ({ 235, 16, 86, 77, 80, 114, 111, 116, 101, 99, 116, 32, 98, 101, 103, 105, 110, 0 }) ' flaga startu ochrony VMP
'Kod klucza
Wstaw kod ({ 235, 14, 86, 77, 80, 114, 111, 116, 101, 99, 116, 32, 101, 110, 100, 0 }) ' flaga ochrony VMP na końcu
SDK języka szyfrującego Enigma
Wstaw kod ({ 235, 10, 69, 67, 82, 79, 78, 69, 88, 69, 69, 69, 67, 66 })
'Kod klucza
Wstaw kod ({ 235, 10, 69, 67, 82, 79, 78, 69, 88, 69, 69 }) znak na końcu znaku
NoobyProtect SDK dla języka szyfrowania
Wstaw kod ({ 235, 6, 78, 80, 66, 69, 71, 78 })' na początku
'Kod klucza
Wstaw kod ({ 235, 6, 78, 80, 69, 78, 80 })' na końcu
Pangolin wywołuje DEMO funkcjonalnego języka szyfrowania SDK
Umieść znak kodu ({ 235, 3, 214, 215, 1 })' na początku
'Kod klucza
Umieść kod ({ 235, 3, 214, 215, 0 })' na końcu znaku
Język szyfrowania ASP SDK
Wstaw kod ({ 235, 4, 235, 5, 25, 1, 233, 37, 0 })' na początku
'Kod klucza
Wstaw kod ({ 235, 4, 235, 5, 41, 1, 233, 133, 0, })' na końcu znaku
Shielden 2.0.1.0
Wstaw kod ({ 235, 7, 83, 69, 66, 69, 71, 78, 0 }) ' SE_PROTECT_START
' Kod klucza
Wstaw kod ({ 235, 7, 83, 69, 69, 78, 68, 80, 0 }) ' SE_PROTECT_END
Wstaw kod ({ 235, 7, 83, 69, 66, 69, 71, 78, 77 }) ' SE_PROTECT_START_MUTATION
Kod klucza
Wstaw kod ({ 235, 7, 83, 69, 69, 78, 68, 80, 0 }) ' SE_PROTECT_END
Wstaw kod ({ 235, 7, 83, 69, 66, 69, 71, 78, 85 }) ' SE_PROTECT_START_ULTRA
Kod klucza
Wstaw kod ({ 235, 7, 83, 69, 69, 78, 68, 80, 0 }) ' SE_PROTECT_END
Wstaw kod ({ 235, 7, 83, 69, 66, 69, 71, 78, 86 }) '
' Kod klucza
Wstaw kod ({ 235, 7, 83, 69, 69, 78, 68, 80, 0 }) ' SE_PROTECT_END
Metoda konwersji SDK w prostym języku ↓
Dzięki wsparciu statycznej kompilacji E5.0 dla standardowych formatów PE, stało się rzeczywistością wprowadzenie SDK powłoki szyfrującej w programach E, aby poprawić jakość ochrony oprogramowania.
SDK powłoki szyfrującej można w przybliżeniu podzielić na dwie kategorie: jedną jest funkcjonalne SDK, a drugą ochronne SDK.
1. Funkcjonalne SDK.
Funkcjonalne SDK jest używane do obsługi tegoNumer seryjnyWalidacja, weryfikacja czasu autoryzacji i inne operacje funkcjonalne. Ten typ SDK ma różne funkcje bezpośrednio zastosowane w powłoce, takie jak WL; Są też zewnętrzne DLL, które trzeba wprowadzić, takie jak pangoliny.
Dla DLL bez tabel wyjściowych, korzystając z importu zewnętrznego SDK, musimy załadować DLL, adresować funkcję w SDK i wywołać polecenie podprogramu () w E, aby łatwo zakończyć operację przekazywania parametrów i uzyskania wartości zwrotnej funkcji SDK.
Dla DLL z tabelami wyjściowymi można je wywołać za pomocą polecenia DLL E.
Dla tych, którzy już potrafią wywoływać DLL, można powiedzieć, że obsługa funkcjonalnych SDK jest łatwa do kontrolowania, wystarczy spojrzeć na konkretny podręcznik API shella.
2. Zaszyfrowane SDK
Po wykryciu konkretnego tagu SDK w oprogramowaniu, powłoka szyfrująca użyje ukierunkowanej metody przetwarzania tego fragmentu kodu, aby poprawić bezpieczeństwo konkretnego segmentu kodu. Tego rodzaju znaczniki to naturalnie kod asemblera zdefiniowany parą!
W trybie łatwym możemy łatwo wywołać kod asemblera za pomocą polecenia insert code (). Specyficznie dla powłoki szyfrującej używającej tego elementu, stosujemy następującą metodę.
Otwórz SDK, które jest dołączone do powłoki szyfrującej, i znajdź plik nagłówka językowego SDK, który możesz przeczytać. Na przykład plik nagłówka LCC poniżej.
Poniżej znajduje się kod programu:
1 #elif zdefiniowany(__LCC__)
2 /* Dostarczone przez Rubem Pechansky, 26 lutego 2003 */
3 #define SECUREBEGIN _asm(".byte 0xEB,0x03,0xD6,0xD6,0x00");
4 #define SECUREEND _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
5 #define SECUREBEGIN_A _asm(".bajt 0xEB,0x03,0xD6,0xD6,0x01");
6 #define SECUREEND_A _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
7 #define SECUREBEGIN_B _asm(".byte 0xEB,0x03,0xD6,0xD6,0x02");
8 #define SECUREEND_B _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
9 #define SECUREBEGIN_C _asm(".byte 0xEB,0x03,0xD6,0xD6,0x03");
10 #define SECUREEND_C _asm(".bajt 0xEB,0x03,0xD6,0xD6,0xFF");
11 #define SECUREBEGIN_D _asm(".byte 0xEB,0x03,0xD6,0xD6,0x04");
12 #define SECUREEND_D _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
13 #define SECUREBEGIN_E _asm(".byte 0xEB,0x03,0xD6,0xD6,0x05");
14 #define SECUREEND_E _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
15 #define SECUREBEGIN_F _asm(".byte 0xEB,0x03,0xD6,0xD6,0x06");
16 #define SECUREEND_F _asm(".bajt 0xEB,0x03,0xD6,0xD6,0xFF");
17 #define SECUREBEGIN_G _asm(".byte 0xEB,0x03,0xD6,0xD6,0x07");
18 #define SECUREEND_G _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
19 #define SECUREBEGIN_H _asm(".byte 0xEB,0x03,0xD6,0xD6,0x08");
20 #define SECUREEND_H _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
21 #define SECUREBEGIN_I _asm(".byte 0xEB,0x03,0xD6,0xD6,0x09");
22 #define SECUREEND_I _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
23 #define SECUREBEGIN_J _asm(".byte 0xEB,0x03,0xD6,0xD6,0x0A");
24 #define SECUREEND_J _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
25 #define SECUREBEGIN_K _asm(".bajt 0xEB,0x03,0xD6,0xD6,0x0B");
26 #define SECUREEND_K _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
27 #define NANOBEGIN _asm(".byte 0xEB,0x03,0xD6,0xD7,0x01");
28 #define NANOEND _asm(".bajt 0xEB,0x03,0xD6,0xD7,0x00");
Aby wyjaśnić w ostatnich dwóch zdaniach, NANOBEGIN i NANOEND to znaczniki kodu CC w języku C, a fragmenty kodu owinięte tymi dwoma znacznikami będą chronione przez powłokę szyfrującą CC. NANOBEGIN jest reprezentowany przez kod asemblera jako 0xEB, 0x03, 0xD6, 0xD7, 0x01, jego zdanie jest reprezentacją szesnastkową C, a instrukcja asemblera jest przedstawiona w dziesiętnym dziesiętnym w E. To znaczy, musimy przetłumaczyć ten kod.
0xEB = 235
0x03 = 3
0xD6 = 214
0xD7 = 215
0x01 = 1
Wtedy NANOBEGIN wyraża się w E jako kod wstawienia ({235, 3, 214, 215, 1}).
|