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:

Szyfrowanie w Pythonie

Opublikowałem właśnie pomocniczy moduł usługi szyfrującej StringEncrypt dla Pythona 3.

Moduł znajdziecie w Pythonowym repozytorium PyPI:

https://pypi.org/project/stringencrypt/

Jego kody źródłowe opublikowałem również na GitHubie:

https://github.com/PELock/StringEncrypt-Python

Instalacja dla Pythona z wykorzystaniem menedżera paczek pip:

pip install stringencrypt

Jak to działa i co to właściwie robi?

W skrócie bierze dowolny string lub zawartość binarnego pliku, szyfruje to silnik polimorficzny i generuje kod w wybranym języku programowania (w tym wypadku w Pythonie) z kodem zawierającym zaszyfrowany string oraz kodem samego dekryptora:

Moduł Pythona dla AutoIt Obfuscatora

Wydałem właśnie moduł Pythona dla mojego AutoIt Obfuscatora, pozwalający zautomatyzować zabezpieczanie skryptów AutoIt bezpośrednio z poziomu Pythona 3.

https://pypi.org/project/autoitobfuscator/

Jeśli kogoś ciekawi jak zbudowane są moduły Pythona, to jego źródła znajdziecie na:

https://github.com/PELock/AutoIt-Obfuscator-Python

Wszystkie przykłady użycia na:

https://www.pelock.com/products/autoit-obfuscator/api

Prosty przykład wykorzystania domyślnych opcji:

#!/usr/bin/env python

###############################################################################
#
# AutoIt Obfuscator WebApi interface usage example.
#
# In this example we will obfuscate sample source with default options.
#
# Version        : v1.0
# Language       : Python
# Author         : Bartosz Wójcik
# Web page       : https://www.pelock.com
#
###############################################################################

#
# include AutoIt Obfuscator module
#
from autoitobfuscator import AutoItObfuscator

#
# if you don't want to use Python module, you can import directly from the file
#
#from pelock.autoitobfuscator import AutoItObfuscator

#
# create AutoIt Obfuscator class instance (we are using our activation key)
#
myAutoItObfuscator = AutoItObfuscator("ABCD-ABCD-ABCD-ABCD")

#
# source code in AutoIt v3 format
#
scriptSourceCode = 'ConsoleWrite("Hello World")'

#
# by default all options are enabled, both helper random numbers
# generation & obfuscation strategies, so we can just simply call:
#
result = myAutoItObfuscator.obfuscate_script_source(scriptSourceCode)

#
# it's also possible to pass script path instead of a string with the source e.g.
#
# result = myAutoItObfuscator.obfuscate_script_file("/path/to/script/source.au3")

#
# result[] array holds the obfuscation results as well as other information
#
# result["error"]         - error code
# result["output"]        - obfuscated code
# result["demo"]          - was it used in demo mode (invalid or empty activation key was used)
# result["credits_left"]  - usage credits left after this operation
# result["credits_total"] - total number of credits for this activation code
# result["expired"]       - if this was the last usage credit for the activation key it will be set to True
#
if result and "error" in result:

    # display obfuscated code
    if result["error"] == AutoItObfuscator.ERROR_SUCCESS:

        # format output code for HTML display
        print(result["output"])

    else:
        print(f'An error occurred, error code: {result["error"]}')

else:
    print("Something unexpected happen while trying to obfuscate the code.")

AutoIt Obfuscator v1.1 – Aktualizacja Silnika

AutoIt Obfuscator został zaktualizowany do wersji 1.1, gdzie cały kod parsera AST został przepisany, w efekcie czego wszystko działa w końcu tak jak powinno, czyli szybko.

https://www.pelock.com/obfuscator/

Przyznaję, poprzednia wersja miała problemy wydajnościowe już przy większych skryptach, jednak dzięki migracji na PHP7 i wykorzystaniu nowych elementów języka udało się uzyskać bardzo dobre rezultaty.

AutoIt Obfuscator Kod Po Obfuskacji

Zachęcam do testów, a jeśli macie jakieś sugestie co do strategii obfuskacyjnych to przyślijcie je z przykładowymi kodami źródłowymi, jeśli zostaną wykorzystane otrzymacie darmowe kody aktywacyjne.