AutoIt Obfuscator – Obfuskacja Skryptów AutoIt

Przez ostatni miesiąc pracowałem nad projektem obfuscatora dla języka skryptowego AutoIt i z przyjemnością prezentuję pierwsze wydanie AutoIt Obfuscatora.

AutoIt Obfuscator v1.0

Co to jest AutoIt?

AutoIt to język skryptowy pomocny przy automatyzacji zadań związanych z interfejsem użytkownika w systemie Windows, jest on często wykorzystywany przy tworzeniu skryptów dedykowanych dla Windows, czy całych aplikacji konsolowych lub okienkowych np. botów do gier. Żeby oddać sprawiedliwość, muszę powiedzieć, że jego łatwość użycia i bogactwo oferowanych funkcji również przyczyniła się niestety do tego, że tworzone jest w nim malware, chociaż można tutaj argumentować, że również inne języki programowania są do tego wykorzystywane.

Dekompilacja AutoIt

Wadą AutoIt jest to, że po kompilacji skryptu do formatu EXE, kod skryptu jest zapisany w zasobach pliku EXE w zaszyfrowanej formie, ale dzięki wykorzystaniu odpowiednich narzędzi, możliwe jest jego odtworzenie do pierwotnej formy kodu źródłowego.

Ukryty skrypt AutoIt w zasobach EXE

Obfuskacja kodu AutoIt

AutoIt Obfuscator stosuje zaawansowaną analizę kodu źródłowego AutoIt (AST) i wykorzystując szereg zaawansowanych technik zaciemniania kodu źródłowego potrafi tak zabezpieczyć zmienne, funkcje, stringi, że zrozumienie działania tak zaszyfrowanych elementów w kodzie źródłowym będzie po prostu bardzo trudne.

Przykład przed zastosowaniem obfuscatora:

ConsoleWrite("Hello World!")

Kod po zastosowaniu AutoIt Obfuscatora:

Global $var_382 = 225
Global $VWUKTOPAG = 10
#OnAutoItStartRegister "func_1675"
Global $FBWUYAT_OSPPKEBV = Asc("l")
Global $WnCx4HPC0ea312__qu_T_3[2][16] = [[1540386418, 74, 52187, 23787, 15150, 224, 789929744, 10864, 46, 57292, 240, 36153703,  _
225, 225, 71, 201],  _
[1182170127, 61672, 15345, 37, 43206, 93, 67, 60, 56413, 133, 48731, 50442, 85, 40037,  _
15258, 13131]]
Global $var_2697 = Asc("C")
Global $var_502[15] = [776861442, 50520, 914414646, 60003, 153, 152, 57581, 41, 252554063, 1178542709, 1790,  _
1503905662, 10736, 118, 43596]
#OnAutoItStartRegister "IdybyqbmmzEwhkdbwcylFunc"
Global $dQtfnuoLbawdebyaWhfqizr = Lekpwpih
Global $dMokwkydCxvjc = BitAND
Global $nWhzikjjrw = NabjqvtehhFunc
Global $_TJYsFyGFpg_A_2oUnB = uBG_WvHge_KoF_kUIKRuBDkE_
Global $var_3477 = RryazhTnrreatVrstjczn
Global $3_JqevgUiOsgQ6AIN3YX_F7X_ = StringReverse
Global $mIdavvqh = BitXOR
Global $tQcjmm = ConsoleWrite
Global $var_1580 = func_3695
Global $var_3104 = _ArrayToString
Global $8PV9OzZiO__Uv_5i = func_182
Global $var_2267 = BitNOT
Global $var_1232 = AprrvxelFdkqnecwUytafbsij
Global $IYHEMOSVL_NIVAI = ChrW
Global $var_1660 = StringTrimRight
Global $ZJLLAEEQ = JwctaHcLcuhgwH_lpM_Siu_
#include <Array.au3>
$tQcjmm($3_JqevgUiOsgQ6AIN3YX_F7X_($var_1580(($_wAv_m9f__FXOFTwxBqwX79 < $WRFGDNBJCT_XUFOVVGTR ? 151 : $var_3477()), $var_502[8],  _
($var_2697 >= $WnCx4HPC0ea312__qu_T_3[1][2] ? $var_382 : 107), $FBWUYAT_OSPPKEBV)) & $var_1660($_TJYsFyGFpg_A_2oUnB(($VWUKTOPAG >= $var_3477() ? $FBWUYAT_OSPPKEBV : 216), $var_382),  _
$var_2267(-($FBWUYAT_OSPPKEBV < $8PV9OzZiO__Uv_5i() ? 7 : $WRFGDNBJCT_XUFOVVGTR))) & $3_JqevgUiOsgQ6AIN3YX_F7X_($var_1232($dQtfnuoLbawdebyaWhfqizr(), $_wAv_m9f__FXOFTwxBqwX79, 1798366573)) & $var_1660($ZJLLAEEQ($dQtfnuoLbawdebyaWhfqizr(), $WRFGDNBJCT_XUFOVVGTR, ($WnCx4HPC0ea312__qu_T_3[1][6] > $var_502[7] ? 198565640 : $var_3477())),  _
$mIdavvqh(968160980, $WRFGDNBJCT_XUFOVVGTR)))
Func AprrvxelFdkqnecwUytafbsij($PYLAO_EDFNQKEVTT_GBNZEGWVBB, $IAHTBPINLF_LZPPI_IKLEMVZXAS, $eLnhiqmiOhxcsbkjcKnhua)
    Local $TISRVTYMCY_UTCRMXDAQU_CRHFBPEL[($VWUKTOPAG >= $var_382 ? $var_502[2] : 1)] = [($WnCx4HPC0ea312__qu_T_3[0][0] <= $var_382 ? $var_382 : 0xC3F2)]
    For $eNfcgzp = 0 To 0
        $var_3853 = $TISRVTYMCY_UTCRMXDAQU_CRHFBPEL[$eNfcgzp]
        $var_3853 -= $eNfcgzp
        $var_3853 = $mIdavvqh($var_3853, ($VWUKTOPAG >= $nWhzikjjrw() ? $var_502[6] : 0xEF06))
        $var_3853 += ($var_382 >= $WRFGDNBJCT_XUFOVVGTR ? $_wAv_m9f__FXOFTwxBqwX79 : 0xD378)
        $var_3853 = $dMokwkydCxvjc($var_3853, ($8PV9OzZiO__Uv_5i() >= $WRFGDNBJCT_XUFOVVGTR ? $FBWUYAT_OSPPKEBV : 65535))
        $TISRVTYMCY_UTCRMXDAQU_CRHFBPEL[$eNfcgzp] = $IYHEMOSVL_NIVAI($var_3853)
    Next
    Local $var_2915 = $var_3104($TISRVTYMCY_UTCRMXDAQU_CRHFBPEL, "")
    Return $var_2915
EndFunc
Func JwctaHcLcuhgwH_lpM_Siu_($aAlahprKxwdhaoc, $var_601, $sCfjwvLtiqdrLgegpggt)
    Local $JFANFJDYFI[($var_382 = $var_382 ? 5 : $_wAv_m9f__FXOFTwxBqwX79)] = [($var_2697 <= $VWUKTOPAG ? $VWUKTOPAG : 0x7A2E), 0x7A6D, ($var_382 = $var_382 ? 0x7A2F : $FBWUYAT_OSPPKEBV),  _
($_wAv_m9f__FXOFTwxBqwX79 > $dQtfnuoLbawdebyaWhfqizr() ? 0x7A3A : $_wAv_m9f__FXOFTwxBqwX79),  _
($var_3477() <> $var_3477() ? $VWUKTOPAG : 0x7A01)]
    For $_drmRe331_tm6xDMY5_Q_ninv = ($WRFGDNBJCT_XUFOVVGTR <= $var_502[12] ? $FBWUYAT_OSPPKEBV : 0) To ($WRFGDNBJCT_XUFOVVGTR > $dQtfnuoLbawdebyaWhfqizr() ? 4 : $FBWUYAT_OSPPKEBV)
        $var_3763 = $JFANFJDYFI[$_drmRe331_tm6xDMY5_Q_ninv]
        $var_3763 = $mIdavvqh($var_3763, ($8PV9OzZiO__Uv_5i() >= $_wAv_m9f__FXOFTwxBqwX79 ? $var_3477() : 0x7A4D))
        $var_3763 = $var_3763 + ($dQtfnuoLbawdebyaWhfqizr() <= $FBWUYAT_OSPPKEBV ? $nWhzikjjrw() : 1)
        $var_3763 = $dMokwkydCxvjc($var_3763, 65535)
        $JFANFJDYFI[$_drmRe331_tm6xDMY5_Q_ninv] = $IYHEMOSVL_NIVAI($var_3763)
    Next
    $JFANFJDYFI = $var_3104($JFANFJDYFI, "")
    Return $JFANFJDYFI
EndFunc
Func uBG_WvHge_KoF_kUIKRuBDkE_($YGWXMAHO_KBAAGVPNLL, $var_2579)
    Local $EIIZXLE_KVDXFPWV_PSBJOYZ[($FBWUYAT_OSPPKEBV > $var_2697 ? 13 : $var_3477())] = [0xFF93, 0xFF93, ($var_502[4] >= $nWhzikjjrw() ? $var_502[8] : 0xFF90), ($var_3477() < $8PV9OzZiO__Uv_5i() ? 0xFFDF : $nWhzikjjrw()),  _
($var_502[1] > $FBWUYAT_OSPPKEBV ? 0xFFA8 : $_wAv_m9f__FXOFTwxBqwX79), ($dQtfnuoLbawdebyaWhfqizr() < $var_382 ? 0xFF90 : $FBWUYAT_OSPPKEBV),  _
($var_502[13] <= $var_2697 ? $var_2697 : 0xFF8D), ($_wAv_m9f__FXOFTwxBqwX79 <> $_wAv_m9f__FXOFTwxBqwX79 ? $8PV9OzZiO__Uv_5i() : 0xFFA7),  _
($WRFGDNBJCT_XUFOVVGTR <= $FBWUYAT_OSPPKEBV ? $WnCx4HPC0ea312__qu_T_3[0][1] : 0xFFAE),  _
($var_2697 < $8PV9OzZiO__Uv_5i() ? 0xFFAF : $dQtfnuoLbawdebyaWhfqizr()), ($8PV9OzZiO__Uv_5i() < $_wAv_m9f__FXOFTwxBqwX79 ? 0xFFB5 : $var_382),  _
($WRFGDNBJCT_XUFOVVGTR <= $WnCx4HPC0ea312__qu_T_3[1][13] ? $var_2697 : 0xFFBA), ($WnCx4HPC0ea312__qu_T_3[0][10] <= $var_382 ? $dQtfnuoLbawdebyaWhfqizr() : 0xFFA7)]
    For $eDqcuhsgcxvBmwgohz = 0 To ($WRFGDNBJCT_XUFOVVGTR > $var_2697 ? 12 : $dQtfnuoLbawdebyaWhfqizr())
        $DNMEK_IEDXUB_ZZOIANETRA = $EIIZXLE_KVDXFPWV_PSBJOYZ[$eDqcuhsgcxvBmwgohz]
        $DNMEK_IEDXUB_ZZOIANETRA = $var_2267($DNMEK_IEDXUB_ZZOIANETRA)
        $DNMEK_IEDXUB_ZZOIANETRA = $dMokwkydCxvjc($DNMEK_IEDXUB_ZZOIANETRA, ($8PV9OzZiO__Uv_5i() <= $var_3477() ? $var_3477() : 0xFFFF))
        $EIIZXLE_KVDXFPWV_PSBJOYZ[$eDqcuhsgcxvBmwgohz] = $IYHEMOSVL_NIVAI($DNMEK_IEDXUB_ZZOIANETRA)
    Next
    Local $CWHGTCKSN = $var_3104($EIIZXLE_KVDXFPWV_PSBJOYZ, "")
    Return $CWHGTCKSN
EndFunc
Func func_3695($M2ia21BGv__6rm2rQE1f, $RWXBFJW_ZCPPAAUO, $DWVTV, $_heJ1_iJlHN_09pGG)
    Local $nPgfsdlQdrweuxmt[($FBWUYAT_OSPPKEBV >= $WRFGDNBJCT_XUFOVVGTR ? $var_502[6] : 2)] = [($var_382 > $_wAv_m9f__FXOFTwxBqwX79 ? 0x13EA : $dQtfnuoLbawdebyaWhfqizr()), ($WRFGDNBJCT_XUFOVVGTR > $var_2697 ? 0x13C6 : $8PV9OzZiO__Uv_5i())]
    For $QDLGH = ($var_502[9] > $VWUKTOPAG ? 0 : $dQtfnuoLbawdebyaWhfqizr()) To ($dQtfnuoLbawdebyaWhfqizr() >= $var_502[11] ? $var_3477() : 1)
        $var_2664 = $nPgfsdlQdrweuxmt[$QDLGH]
        $var_2664 = $mIdavvqh($var_2664, ($var_382 > $dQtfnuoLbawdebyaWhfqizr() ? 0x138F : $FBWUYAT_OSPPKEBV))
        $var_2664 -= $QDLGH
        $nPgfsdlQdrweuxmt[$QDLGH] = $IYHEMOSVL_NIVAI($dMokwkydCxvjc($var_2664, ($VWUKTOPAG < $WnCx4HPC0ea312__qu_T_3[0][4] ? 65535 : $var_2697)))
    Next
    $nPgfsdlQdrweuxmt = $var_3104($nPgfsdlQdrweuxmt, "")
    Return $nPgfsdlQdrweuxmt
EndFunc
Func IdybyqbmmzEwhkdbwcylFunc()
    Global $WRFGDNBJCT_XUFOVVGTR = 968160983
EndFunc
Func NabjqvtehhFunc()
    return 609141471
EndFunc
Func func_1675()
    Global $_wAv_m9f__FXOFTwxBqwX79 = 185
EndFunc
Func Lekpwpih()
    return 134
EndFunc
Func func_182()
    return 169
EndFunc
Func RryazhTnrreatVrstjczn()
    return 158
EndFunc

Wersja online, okienkowa, konsolowa i Web API

AutoIt Obfuscator dostępny jest jako usługa online z interfejsem na stronie:

https://www.pelock.com/pl/autoit-obfuscator/

Jako wersja okienkowa i konsolowa dla systemów Windows (.NET) oraz Linux (Mono):

https://www.pelock.com/pl/produkty/autoit-obfuscator/pobierz

AutoIt Obfuscator wersja konsolowa

Dostępny jest również interfejs Web API z przykładami użycia dla PHP:

https://www.pelock.com/pl/produkty/autoit-obfuscator/api

Licencjonowanie i zabezpieczenie oprogramowania

Upubliczniłem na GitHubie repozytorium z SDK dla swojego systemu ochrony i licencjonowania oprogramowania PELock v2.0.

Zaawansowane ustawienia ochrony aplikacji w PELock v2.0

SDK i setki przykładów użycia są dostępne w wersji dla C/C++, D, Delphi/Pascal, PureBasic, PowerBASIC oraz MASM.

Podgląd okienka z identyfikatorem sprzętowym - blokada na sprzętowy identyfikator w PELock v2.0

Jeśli interesujesz się metodami ochrony oprogramowania przed złamaniem być może znajdziesz także coś dla siebie, ponieważ PELock v2.0 oferuje wiele nowych, niespotykanych metod pozwalających zabezpieczyć oprogramowanie przed crackingiem i reverse engineeringiem.

https://github.com/PELock/PELock-Software-Protection-and-Licensing-SDK

PELock v2.0 – ochrona oprogramowania przed złamaniem

Kilka dni temu wydana została nowa wersja mojego oprogramowania PELock v2.0.

Zabezpieczenie oprogramowania przed złamaniem

PELock to system pozwalający zabezpieczyć dowolne 32 bitowe oprogramowanie dla systemu Windows przed złamaniem (ang. cracking), modyfikacjami oraz ochronić je przed inżynierią wsteczną (ang. reverse engineering).

pelock-opcje-ochrona-aplikacji

System licencyjny

PELock posiada wbudowany system licencyjny, dzięki któremu możesz w prosty sposób dodać klucze licencyjne do swojego oprogramowania. Możliwe jest również ustawienie ograniczeń czasowych (ang. time-trial) np. 30 dniowy okres użytkowania dla zabezpieczonych aplikacji.

Menedżer kluczy licencyjnych

Możesz dodatkowo ściśle zintegrować zabezpieczenia i elementy systemu licencyjnego wykorzystując dedykowane SDK i setki przykładów użycia z pełnymi kodami źródłowymi dla C/C++, Delphi, Lazarus, Freepascal, PureBasic, PowerBASIC, D, Assembler.

PELock posiada wbudowany binder dla dodatkowych bibliotek DLL, dzięki któremu możliwe jest połączenie pliku aplikacji EXE oraz dodatkowych bibliotek DLL do jednego, wyjściowego pliku EXE.

Wirtualne biblioteki DLL

Zabezpieczyć możesz dowolny skompilowany program dla systemu Windows kompatybilny z formatem Portable Executable, niezależnie w jakim języku i środowisku programowania został stworzony.

Wirtualne biblioteki DLL

Jeśli twoja aplikacja wykorzystuje lub wymaga do działania dodatkowych bibliotek DLL możesz je ukryć wewnątrz zabezpieczonej aplikacji, nikt postronny nie będzie w stanie ich podejrzeć, ani żaden inny program nie będzie miał do nich dostępu, bo cały proces ich ładowania jest emulowany w pamięci i nic nie jest zapisywane na dysku, a działanie aplikacji pozostanie takie samo.

Linki

Strona domowa – https://www.pelock.com/pl/produkty/pelock

Zrzuty ekranu – https://www.pelock.com/pl/produkty/pelock/zrzuty

Pobieranie – https://www.pelock.com/pl/produkty/pelock/pobierz

Historia zmian

v2.0

Zabezpieczenia

  • nowy silnik metamorficzny
  • nowy wielowarstwowy silnik polimorficzny
  • nowe wielowątkowe zabezpieczenie
  • ochrona pliku aplikacji przed modyfikacjami
  • emulacja standardowych funkcji WinApi
  • generowanie białego szumu wywołaniami funkcji WinApi
  • wgrywanie obrazu pliku pod losowy adres bazowy
  • ochrona tabeli inicjalizacyjnej dla aplikacji Delphi
  • zapobieganie uruchomieniu dwóch kopii tej samej aplikacji
  • wykrywanie obecności wirtualnych maszyn
  • aktywna ochrona z własną listą niepożądanych narzędzi
  • dodatkowe opcje zapisu hasła chroniącego zaszyfrowany plik do Rejestru Windows
  • możliwość wprowadzenia hasła z linii komend
  • opcja pozwalająca wyłączyć szyfrowanie danych aplikacji wedle hasła
  • ukrywanie klas obiektów COM
  • wykrywanie programów śledzących interfejsy COM
  • wykrywanie snifferów sieciowych
  • ochrona entrypoint’a przed programami śledzącymi
  • dodana wyszukiwarka makr, pozwalająca przeanalizować poprawność umieszczenia markerów SDK
  • nowe makra PELOCK_CHECKPOINT i PELOCK_CPUID
  • funkcje inicjalizujące PELOCK_INIT_CALLBACK
  • makro ochrony pamięci PELOCK_MEMORY_GAP
  • chronione wartości liczbowe PELOCK_DWORD
  • wykrywanie stanu zabezpieczenia przez funkcje IsPELockPresent
  • funkcje szyfrujące dane EncryptData / DecryptData
  • funkcje szyfrujące pamięć procesu EncryptMemory / DecryptMemory
  • możliwość wyłączenia obsługi wybranych makr
  • system znaków wodnych (watermarks)
  • znaki wodne w formie makr PELOCK_WATERMARK
  • opcja uruchamiania aplikacji tylko w wybranych krajach
  • przekazywanie domyślnych parametrów w linii komend
  • zabezpieczanie aplikacji usług systemu Windows (tzw. services)
  • możliwość wyłączenia ochrony DEP dla zabezpieczanych aplikacji
  • opcja do sprawdzania praw administracyjnych
  • możliwość wyłączenia wizualnych tematów do wyświetlania aplikacji
  • dodana kompatybilność z hookami oprogramowania Kaspersky Anti-Virus
  • pełna kompatybilność zabezpieczonych aplikacji z najnowszymi systemami Windows XP SP2 (32 bit), Windows XP (64 bit), Windows Vista (32/64 bit), Windows 7 (32/64 bit), Windows 8 (32/64 bit), Windows 8.1 (32/64 bit) i Windows 10 (32/64 bit)

System licencyjny

  • NOWY SYSTEM LICENCYJNY
  • funkcje API systemu licencyjnego obsługują oprócz ciągów ANSI, ciągi UNICODE
  • zwiększony limit rozmiaru nazwy użytkownika do 8192 znaków (8 kB)
  • możliwość zapisu kluczy licencyjnych w rejestrze Windows (dodatkowy format kluczy)
  • kompresja plików kluczy licencyjnych do formatu ZIP
  • funkcja do sprawdzania statusu klucza licencyjnego
  • nowe opcje pozwalające stworzyć czasowo ograniczoną aplikację
  • usuwanie lokalnych danych rejestracyjnych z Rejestru Windows
  • dodatkowa funkcja API, pozwalająca wczytać klucz licencyjny z bufora pamięci
  • odczytywanie z klucza licencyjnego 16 dowolnie ustawionych wartości liczbowych
  • możliwość ustawienia nazwy użytkownika, poprzez przeciągnięcie pliku zawierającego informację o użytkowniku (dowolne rozszerzenie) na okno projektu
  • usuwanie pustych znaków z końca nazwy użytkownika
  • opcjonalne szyfrowanie wszystkich danych klucza według identyfikatora sprzętowego
  • automatyczne sortowanie nazw użytkowników projektu (alfabetycznie)
  • poprawiona obsługa wgrywania plików/projektów z linii komend
  • opcja wyświetlania obrazków, wyświetlania komunikatów oraz otwierania stron internetowych na początku i na końcu działania zabezpieczonej aplikacji w przypadku braku danych licencyjnych
  • możliwość wczytania listy użytkowników z innego pliku projektu lub zaimportowania z pliku CSV
  • procedura pozwalająca wyłączyć klucz licencyjny
  • możliwość przeładowania klucza licencyjnego z domyślnych lokalizacji
  • możliwość ustawienia własnej procedury identyfikatora sprzętowego
  • możliwość odczytu czasu wykorzystania klucza licencyjnego w bieżącej sesji programu
  • większa kontrola nad makrami i wybranymi funkcjami systemu SDK

Generator kluczy

  • całkowicie nowy generator kluczy
  • generator kluczy cgi-bin dla systemu Linux
  • przykłady w PHP jak generować klucze online

SDK

  • nowe i udoskonalone przykłady dla C, C++, Delphi, Lazarus, PureBasic, PowerBasic, D, MASM
  • obsługa kompilatorów MinGW / GCC dla Windows, Pelles C, PowerBASIC (uaktualnione pliki nagłówkowe)
  • klasa CPELock dla języka C++
  • komponent TPELock dla Delphi
  • klasa PELock dla języka D

Interfejs

  • nowe okno opcji
  • okno z globalnymi opcjami
  • możliwość zmiany rozmiaru okna aplikacji
  • możliwość zmiany języka aplikacji bez potrzeby ponownego uruchamiania programu
  • dodana lista ostatnio używanych plików, wystarczy kliknąć przycisk oznaczony ◀, albo kliknąć prawym klawiszem myszy na belkę z nazwą pliku, aby otworzyć menu z listą ostatnio używanych plików
  • automatyczne wypełnianie pola zawierającego sprzętowy identyfikator, gdy użytkownik zaznaczy tą opcję, a w schowku będzie znajdował się poprawny ciąg znaków identyfikatora, zostanie on automatycznie ustawiony w okienku edycyjnym identyfikatora sprzętowego
  • uaktualniony dział FAQ (m.in. optymalizacja kompilatora i makra DEMO w MS Visual C++ / Borland C++ / Delphi)
  • usunięty problem z wyświetlaniem elementów, przy włączonych dużych fontach w systemie (120 DPI i wzwyż)
  • usunięty problem z błędnie wyświetlanymi dymkami pomocy
  • ikony zamiast przycisków „Edytuj”
  • automatyczne uzupełnianie ścieżek plików, URL i katalogów w wybranych polach edycyjnych
  • dodatkowe parametry linii komend

Kompresja

  • domyślnie używany jest rodzaj kompresji typu solid w celu osiągnięcia lepszych rezultatów kompresji
  • automatyczne testowanie wszystkich algorytmów kompresji w celu wybrania najlepszego
  • możliwość całkowitego wyłączenia kompresji danych aplikacji
  • możliwość wyłączenia kompresji zasobów
  • dodana możliwość wyboru rodzajów zasobów, które mają zostać poddane kompresji lub też nie
  • dodane różne algorytmy kompresji, włączając QuickLZ, UCL, zlib, miniLZO, HLZ, BriefLZ, JCALG1 and Mini-LZ
  • możliwość wykorzystania własnej biblioteki kompresji
  • losowy dobór algorytmu kompresji

Inne

  • generowanie plików wyjściowych przyjaznych oprogramowaniu antywirusowemu
  • tworzenie plików wsadowych pozwalających odtworzyć zabezpieczony plik z kopii zapasowej
  • zapisywanie plików zapasowych do wybranego katalogu
  • cyfrowe podpisywanie zabezpieczonych aplikacji (wsparcie dla podwójnych podpisów)
  • wsparcie dla plików wykorzystujących technolgie anty-exploitacyjne CFGuard oraz SAFESEH
  • w pełni kompatybilna obsługa funkcji TLS Callbacks
  • zachowywanie daty zabezpieczanego pliku
  • zachowywanie atrybutów zabezpieczanego pliku
  • zachowywanie oryginalnego identyfikatora strefy bezpieczeństwa
  • powiadomienia dźwiękowe
  • wykorzystanie zdalnego systemu licencyjnego do poprawnej pracy PELock’a
  • wyświetlanie ekranu powitalnego podczas uruchamiania i zamykania zabezpieczonej aplikacji
  • wykrywanie plików chronionych przez mechanizm Windows File Protection (WFP)
  • opcja używaj mocy tylko jednego procesora
  • ustawianie priorytetu zabezpieczanego procesu oraz samego loadera
  • opcja opóźnij uruchomienie aplikacji
  • zamykanie systemu Windows po zamknięciu zabezpieczonej aplikacji
  • usunięte problemy z wyciekaniem pamięci (z ang. memory leaks)
  • przepisany kod przywracający pliki z kopii zapasowej
  • łączenie pustych sekcji w wynikowym pliku
  • wypełnianie odstępów między sekcjami przypadkowymi bajtami
  • wyrównywanie rozmiaru loadera do wartości file align
  • opcja pozwalająca na usuwanie struktury eksportowanych funkcji
  • statyczne ładowanie bibliotek aplikacji
  • nazwa opcji „Usuwaj dodatkowe dane z końca pliku” zamieniona na „Zachowaj dodatkowe dane z końca pliku”, dodatkowo zawiera nowe opcje, pozwalające określić w jaki sposób mają być obsługiwane nadmiarowe dane (emulacja)
  • możliwość dodania na koniec zabezpieczonej aplikacji własnego pliku
  • możliwość rozszerzenia rozmiaru pliku do dowolnej wielkości
  • obsługa aplikacji ze ścieżkami UNC (mechanizm WebDAV) do bibliotek dynamicznych DLL w tabeli importów
  • obsługa plików konfiguracyjnych i projektów większych niz 64 kB niezależnie od systemu operacyjnego

 

Konwersja liczb zmiennoprzecinkowych na stringi i optymalizacja BASE64

Source codeWojtek Muła jak zwykle w formie, dawno nie zaglądałem na jego bloga, a pojawiło się kilka ciekawych wpisów programistycznych

Konwersja liczb zmiennoprzecinkowych na stringi
http://0x80.pl/notesen/2015-12-29-float-to-string.html

Analiza działania i optymalizacja algorytmu BASE64
http://0x80.pl/notesen/2015-12-27-base64-encoding.html