Obufuskacja wartości liczbowych w Javie

Mój JObfuscator zyskał nową funkcjonalność, aby ochronić się przed wbudowanym deobfuscatorem w popularnym narzędziu do dekompilacji Javy – JEB.

https://www.pelock.com/pl/jobfuscator/

Wprowadzona zmiana do silnika w wersji v1.02:

  • Strategia obfuskacyjna polegajaca na przenoszeniu wartości liczbowych do tablic, zamiast zapisywanych tam wartości integer, zapisuje je jako typ double, aby zapobiec deobfuskacji przez popularne dekompilatory Javy np. double[] var_2597 = new double[]{13.898355719807563D, 65535.73657403742D, ... };.

A wyniki poniżej:

////////////////////////////////////////////////////////////////////////////////
//
// An output from JObfuscator v1.02 - Bartosz Wójcik
//
// Website   : https://www.pelock.com/products/jobfuscator
// Version   : v1.02
// Params    : /MixCodeFlow /RenMethods /RenVars /ShuffleMethods /CryptStr /IntsToArray
// New lines : Windows (CRLF - \r\n)
// Date      : 30.07.2021
//
////////////////////////////////////////////////////////////////////////////////

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone {

    public static void main(String[] args) {
        double[] jD4b___uBcBLnT4DPDc = { 7.604463844941735E8, 0.4824279911499976, 46681.74401412342, 6.34113063370141E8, 65535.63496958159, 5.852873783059233E8, 25.66917563526717, 1.2261583709266335E7, 1.8878934664606395E9 };
        int fIpmgdCymnfvihwPzvzzuq = (int) (jD4b___uBcBLnT4DPDc[1]);
        double g_tagCadjjq = 0;
        double[] g_pUotremgjarSxlrilxsp = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        fIpmgdCymnfvihwPzvzzuq = (int) (jD4b___uBcBLnT4DPDc[8]);
        while (fIpmgdCymnfvihwPzvzzuq != (int) (jD4b___uBcBLnT4DPDc[0])) {
            switch(fIpmgdCymnfvihwPzvzzuq) {
                case 1382297864:
                    g_tagCadjjq = func_3903(g_pUotremgjarSxlrilxsp);
                    fIpmgdCymnfvihwPzvzzuq += (int) (jD4b___uBcBLnT4DPDc[7]);
                    break;
                case 1887893466:
                    double[] XGYUK_LACYDYTIW_EMMQXIKKLZ = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
                    fIpmgdCymnfvihwPzvzzuq ^= (int) (jD4b___uBcBLnT4DPDc[5]);
                    break;
                case 1394559447:
                    String PUWZTYOXS_HDNJMV_IERUS = "";
                    int[] FJUVLQWHW = { 0x49FA, 0x4A1B, 0x4A08, 0x4A15, 0x4A0B, 0x4A08, 0x4A19, 0x4A0B, 0x49C7, 0x49EB, 0x4A0C, 0x4A1D, 0x4A10, 0x4A08, 0x4A1B, 0x4A10, 0x4A16, 0x4A15, 0x49C7, 0x49E4, 0x49C7, 0x49CC, 0x49D5, 0x49DD, 0x4A0D };
                    for (int UVANKYPS = 0, MIKHXBMRDG_MUBVDJQGWP_EBPCHEYDCI = 0; UVANKYPS < (int) (jD4b___uBcBLnT4DPDc[6]); UVANKYPS++) {
                        MIKHXBMRDG_MUBVDJQGWP_EBPCHEYDCI = FJUVLQWHW[UVANKYPS];
                        MIKHXBMRDG_MUBVDJQGWP_EBPCHEYDCI += (int) (jD4b___uBcBLnT4DPDc[2]);
                        PUWZTYOXS_HDNJMV_IERUS += (char) (MIKHXBMRDG_MUBVDJQGWP_EBPCHEYDCI & (int) (jD4b___uBcBLnT4DPDc[4]));
                    }
                    System.out.format(PUWZTYOXS_HDNJMV_IERUS, g_tagCadjjq);
                    fIpmgdCymnfvihwPzvzzuq -= (int) (jD4b___uBcBLnT4DPDc[3]);
                    break;
            }
        }
    }

    public static double func_3903(double[] numArray) {
        double[] GSfEZBJsdhjRI___ = { 2.421334501204269, 4.2393759827450454E8, 0.06646005259426904, 2.9763455637251534E7, 1.1946054156556988E9, 1.4664297363385243E9, 1.7585613120558941E9, 9.148263841375413E8, 1.501540404215826E8 };
        int gnLj0_X9TMHrL_7Sg_K7 = (int) (GSfEZBJsdhjRI___[2]);
        double pPmqsyfrtFwamsgfysyWkekjdfl = 0;
        double var_921 = 0, BEFYYQAD = 0;
        int dIblmttjWoinogu = 0;
        gnLj0_X9TMHrL_7Sg_K7 = (int) (GSfEZBJsdhjRI___[7]);
        while (gnLj0_X9TMHrL_7Sg_K7 != 1466429736) {
            switch(gnLj0_X9TMHrL_7Sg_K7) {
                case 684346482:
                    for (double HGSQSTL_IVVSZST_YJJUENDDQE : numArray) {
                        BEFYYQAD += Math.pow(HGSQSTL_IVVSZST_YJJUENDDQE - pPmqsyfrtFwamsgfysyWkekjdfl, (int) (GSfEZBJsdhjRI___[0]));
                    }
                    gnLj0_X9TMHrL_7Sg_K7 ^= (int) (GSfEZBJsdhjRI___[1]);
                    break;
                case 1878951897:
                    pPmqsyfrtFwamsgfysyWkekjdfl = var_921 / dIblmttjWoinogu;
                    gnLj0_X9TMHrL_7Sg_K7 += -(int) (GSfEZBJsdhjRI___[4]);
                    break;
                case 1728797857:
                    for (double LDUUTP_VAPNT_LNFBFX : numArray) {
                        var_921 += LDUUTP_VAPNT_LNFBFX;
                    }
                    gnLj0_X9TMHrL_7Sg_K7 += (int) (GSfEZBJsdhjRI___[8]);
                    break;
                case 914826384:
                    BEFYYQAD = 0.0;
                    gnLj0_X9TMHrL_7Sg_K7 = (int) (GSfEZBJsdhjRI___[6]);
                    break;
                case 831425100:
                    gnLj0_X9TMHrL_7Sg_K7 = (int) (GSfEZBJsdhjRI___[5]);
                    break;
                case 1758561312:
                    dIblmttjWoinogu = numArray.length;
                    gnLj0_X9TMHrL_7Sg_K7 -= (int) (GSfEZBJsdhjRI___[3]);
                    break;
            }
        }
        return Math.sqrt(BEFYYQAD / dIblmttjWoinogu);
    }
}

Zaciemnianie kodu źródłowego Javy

Realizując stopniową rozbudowę mojego obfuskatora dla Javy – JObfuscatora, dodałem nową strategię do zaciemniania kodu.

Polega ona na tym, że dla każdej metody pobierane są wszystkie możliwe wartości liczbowe (o ile nie kłóci się to ze składnią języka Java), które następnie przenoszone są do tablic.

https://www.pelock.com/pl/jobfuscator/

To sprawia, że analiza jest trudniejsza, ponieważ wymaga wyszukiwania po indeksach w tabeli każdej wartości numerycznej. Jeśli kiedykolwiek analizowałeś skompilowany kod, wiesz, że wartości zapisane w tablicach i odczytywane po indeksach sprawiają trudności w zrozumieniu, jaka wartość kryje się faktycznie w tablicy.

Razem z tą nową funkcjonalnością, zostały zaktualizowane pakiety SDK obfuskatora (dla PHP i Pythona) oraz pakiety dla Windows i Linuxa.

https://www.pelock.com/pl/produkty/jobfuscator/api

https://www.pelock.com/pl/produkty/jobfuscator/pobierz

Przykładowy kod Javy po zaciemnianiu czy też obfuskacji:

////////////////////////////////////////////////////////////////////////////////
//
// An output from JObfuscator v1.01 - Bartosz Wójcik
//
// Website   : https://www.pelock.com/products/jobfuscator
// Version   : v1.01
// Params    : /MixCodeFlow /RenMethods /RenVars /ShuffleMethods /CryptStr /IntsToArray
// New lines : Windows (CRLF - \r\n)
// Date      : 29.07.2021
//
////////////////////////////////////////////////////////////////////////////////

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone {

    public static void main(String[] args) {
        int[] _a4joq_o8b_tUOPFS_YaaYlTU = { 25, 781851063, 0, 186043733, 308536662, 2099166591, 65535 };
        int sSlkJY4h_2s0_1o_z_PAe = _a4joq_o8b_tUOPFS_YaaYlTU[2];
        double pA6la_BMPq7e_41T_ = 0;
        double[] mXJrn_ywhskgJT0__c = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        sSlkJY4h_2s0_1o_z_PAe = _a4joq_o8b_tUOPFS_YaaYlTU[4];
        while (sSlkJY4h_2s0_1o_z_PAe != 2099166591) {
            switch(sSlkJY4h_2s0_1o_z_PAe) {
                case 904343992:
                    String var_798 = "";
                    int[] __HoJ2lBVb_XLauhwa = { 0x0053, 0x0075, 0x0063, 0x0071, 0x0068, 0x0066, 0x0078, 0x006B, 0x0028, 0x004D, 0x006F, 0x0081, 0x0075, 0x006E, 0x0082, 0x0078, 0x007F, 0x007F, 0x0032, 0x0050, 0x0034, 0x003A, 0x0044, 0x004D, 0x007E };
                    for (int DQYVAM = 0, g_pIlsvecdqKrqqcjTotyogafe = 0; DQYVAM < _a4joq_o8b_tUOPFS_YaaYlTU[0]; DQYVAM++) {
                        g_pIlsvecdqKrqqcjTotyogafe = __HoJ2lBVb_XLauhwa[DQYVAM];
                        g_pIlsvecdqKrqqcjTotyogafe -= DQYVAM;
                        var_798 += (char) (g_pIlsvecdqKrqqcjTotyogafe & _a4joq_o8b_tUOPFS_YaaYlTU[6]);
                    }
                    System.out.format(var_798, pA6la_BMPq7e_41T_);
                    sSlkJY4h_2s0_1o_z_PAe = _a4joq_o8b_tUOPFS_YaaYlTU[5];
                    break;
                case 1090387725:
                    pA6la_BMPq7e_41T_ = PknrplwspWzftaZejcnrx(mXJrn_ywhskgJT0__c);
                    sSlkJY4h_2s0_1o_z_PAe -= _a4joq_o8b_tUOPFS_YaaYlTU[3];
                    break;
                case 308536662:
                    double[] var_3179 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
                    sSlkJY4h_2s0_1o_z_PAe -= -_a4joq_o8b_tUOPFS_YaaYlTU[1];
                    break;
            }
        }
    }

    public static double PknrplwspWzftaZejcnrx(double[] numArray) {
        int[] yqAA2v4_8wxeB__XX0 = { 239790208, 0, 2003280558, 1806986744, 1639573144, 144062149, 2, 1567196536, 220961938, 834696410 };
        int pVtkndrLgwazueYclthlx = yqAA2v4_8wxeB__XX0[1];
        double var_2075 = 0;
        int var_2673 = 0;
        double GOSLX = 0, BWSIM_HPGKSCO = 0;
        pVtkndrLgwazueYclthlx = yqAA2v4_8wxeB__XX0[2];
        while (pVtkndrLgwazueYclthlx != yqAA2v4_8wxeB__XX0[3]) {
            switch(pVtkndrLgwazueYclthlx) {
                case 1639573144:
                    var_2075 = GOSLX / var_2673;
                    pVtkndrLgwazueYclthlx += -yqAA2v4_8wxeB__XX0[8];
                    break;
                case 961954335:
                    for (double SQZGBDCX_NPDPSRK_NMYXHDJC : numArray) {
                        GOSLX += SQZGBDCX_NPDPSRK_NMYXHDJC;
                    }
                    pVtkndrLgwazueYclthlx = yqAA2v4_8wxeB__XX0[4];
                    break;
                case 1567196536:
                    pVtkndrLgwazueYclthlx -= -yqAA2v4_8wxeB__XX0[0];
                    break;
                case 1418611206:
                    for (double ZWGMm8X_5d_8buIiNh_x_h : numArray) {
                        BWSIM_HPGKSCO += Math.pow(ZWGMm8X_5d_8buIiNh_x_h - var_2075, yqAA2v4_8wxeB__XX0[6]);
                    }
                    pVtkndrLgwazueYclthlx = yqAA2v4_8wxeB__XX0[7];
                    break;
                case 144062149:
                    var_2673 = numArray.length;
                    pVtkndrLgwazueYclthlx ^= yqAA2v4_8wxeB__XX0[9];
                    break;
                case 2003280558:
                    BWSIM_HPGKSCO = 0.0;
                    pVtkndrLgwazueYclthlx = yqAA2v4_8wxeB__XX0[5];
                    break;
            }
        }
        return Math.sqrt(BWSIM_HPGKSCO / var_2673);
    }
}

Jeśli macie jakieś ciekawe pomysły na inne obfuskacje w kodzie źródłowym – dajcie znać, czekają na was darmowe kody aktywacyjne.

JObfuscator – Obfuskator dla Javy

JObfuscator to mój nowy obfuskator dla kodów źródłowych języka Java.

Pozwala zabezpieczyć kody źródłowe oraz algorytmy w Java przez hakingiem, crackingiem, inżynierią wsteczną, dekompilacją i kradzieżą technologii.

Więcej informacji na stronie:

https://www.pelock.com/pl/produkty/jobfuscator

Interfejs online obfuskatora:

https://www.pelock.com/pl/jobfuscator/

Wersja dla Windows oraz Linuxa (GUI oraz wersja konsolowa):

https://www.pelock.com/pl/produkty/jobfuscator/pobierz

Automatyzacja obfuskacji z SDKs dla PHP i Pythona (plus ich kody źródłowe na GitHubie):

https://www.pelock.com/pl/produkty/jobfuscator/api

Zrzuty ekranu:

Komercyjny spyware Thief

Dzisiaj tak grzebałem po dysku i odkryłem sporo ciekawych programów, które były całkiem dobrze rozwinięte, jednak nie zostały nigdy wydane.

Jednym z nich jest projekt „Thief”, czyli narzędzie dzięki któremu można było wstrzyknąć do dowolnej aplikacji kod wykradający dowolne pliki z maszyny ofiary z obsługą wgrywania wykradzionych plików na FTP lub wskazany email.

thief

Projekt, mimo, że w pełni funkcjonalny, nigdy nie został wydany, nie pamiętam dokładnie dlaczego, dzisiaj można by go było sklasyfikować jako komercyjny „hacking tool”.

Jestem ciekaw co o tym sądzicie i czy tego typu oprogramowanie znalazłoby klientów?

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