Anti-debugging, anti-VM, anti-sanbox i anti-CPU emulator

Wydałem kilka dni temu ulepszoną wersję mojego obufscatora dla języka autoit, czyli AutoIt Obfuscator. Dodane zostało wstrzykiwanie kodu do detekcji wielu narzędzi służących do reversingu i analizy zabezpieczonych skryptów.

Wykrywaj debuggery, wirtualne maszyny, piaskownice (tzw. sandbox) i emulatory CPU w skryptach AutoIt.

Wstrzykiwany kod jest automatycznie wykonywany zaraz na początku działania skryptów i w razie pozytywnej detekcji jakiegokolwiek narzędzia – cicho kończy działanie skryptu, bez żadnego komunikatu o błędzie.

Dodane detekcje to m.in.

Antydebugging

  • Wykrywanie debuggerów dołączonych do do procesu aplikacji

Wykrywanie wirtualnych maszyn (anty-VM)

  • VMware (procesy, pliki, sterowniki, WMI, BIOS, GFX)
  • Oracle Virtual Box (procesy, pliki, sterowniki, BIOS, GFX)
  • Parallels Virtual Machine (procesy, pliki)
  • KVM (sterowniki)

Wykrywanie piaskownic tzw. sandboxów

  • Sprawdzaj podejrzanie małą liczbę rdzeni procesora (wyjdź jeśli jest ich mniej niż 3)
  • Sandboxie (biblioteki DLL)
  • Joe Sandbox (procesy)

Wykrywanie emulatorów CPU

  • WINE (niekonsystencje w funkcjach API, biblioteki DLL, specjalne funkcje API)
  • Bochs (WMI BIOS)
  • QEMU (procesy, WMI BIOS)
  • XEN (procesy)

Trochę mi zajęło skompletowanie tych metod, dlatego są one dostępne jedynie w płatnej wersji obfuscatora, ale wiem, że was na to stać i możecie sobie to przetestować online na

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

PS. Pozdrawiam Fabka za podsunięcie metod detekcji i w sumie naprowadzenie mnie na możliwość dołączenia tej funkcjonalności do mojego obfuscatora.

PS2. Jeśli znacie jakieś fajne metody detekcji, dopiszcie do komentarzy kod albo linki, ograniczeniem AutoIt jest w teorii brak dostępu do PEB czy TEB legitnymi metodami, więc interesują mnie jedynie rozwiązania oparte o legitne sposoby przez WinAPI i pokrewne funkcje.

JObfuscator – wielopoziomowa obfuskacja liczb

Aktywne prace nad moim obfuskatorem dla Javy, czyli JObfuscatorem doprowadziły do poprawienia drobnych błędów i rozszerzenia funkcjonalności.

Historia silnika

v1.03 – 31.07.2021

  • Niektóre wartości typu integer nie były poprawnie ekstrahowane dla strategii obfuskacyjnej polegającej na przenoszeniu wartości liczbowych do tablic
  • Wielopoziomowa obfuskacja wyekstrahowanych wartości liczbowych do tablic (do losowej liczby tablic, o typach double i integer)

Jak prezentują się wprowadzone zmiany do silnika obfuskatora?

Spójrzcie sami (sprawdźcie kompilację i działanie na portalu https://ideone.com/4rSD6H):

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

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

class Ideone {

    public static double func_748(double[] numArray) {
        double[] BCRDUROMOY_MNAXYNOXOG = { 1.8344549046243548, 5.062054289224274, 7.695212304538046, 3.606439894394656, 4.265849473042911, 9.96684814353308, 8.362462143997828, 6.336325894460848, 0.7265577365920909, 2.9266295367407764 };
        int[] dIixxpmMmowl = { 6, 9, 0, 4, 8, 7, 2, 5, 3, 1 };
        int[] XQKGIAFO_OQZSLJER = { 5, 9, 1, 8, 4, 7, 6, 0, 3, 2 };
        double[] tagYigawnpkqDhxlb = { 3.263948550416058, 9.506111981988184, 8.799502940234945, 7.700252686617247, 1.3465800623355373, 2.131837713068907, 5.6526718473487705, 0.06485003367562314, 6.782236296833905, 4.00779348146718 };
        int[] _oGLZW_uXim6WBCsx_7fGFm = { 3, 7, 2, 0, 8, 1, 4, 6, 5, 9 };
        int[] g_pDmfgavnzNonebuo = { 0, 7, 2, 5, 4, 3, 8, 6, 1, 9 };
        double[] k1j_sHi_k_suVW_nn51lh = { 6.850663063985456, 1.0223415697622065, 4.425450723540837, 3.305111840357848, 0.8509365697301294, 2.6691116655865232, 7.392181980579024, 5.250660143996177, 8.733419893526216, 9.12956312338991 };
        double[] _Ya_3b5B3nyUHEGf_LIb_ = { 4.669312410136314, 9.905904441183344, 1.41717038302091, 7.982376427084375, 0.25865577282531504, 3.4462119989265823, 6.8207154875949305, 8.907167365920236, 2.3288730590373348, 5.774660880160418 };
        double[] var_2348 = { 6.327896179462817E8, 3.007227578022376E8, 8.524628358549372E8, 2.4199821681698745, 0.6530250709618525, 1.7483600058531854E9, 5.2067350213003665E7, 1.4587142855345135E9, 1.400521274936009E8, 2.0650663616872746E8 };
        int var_1784 = (int) (var_2348[(int) (_Ya_3b5B3nyUHEGf_LIb_[(int) (k1j_sHi_k_suVW_nn51lh[g_pDmfgavnzNonebuo[_oGLZW_uXim6WBCsx_7fGFm[(int) (tagYigawnpkqDhxlb[XQKGIAFO_OQZSLJER[dIixxpmMmowl[(int) (BCRDUROMOY_MNAXYNOXOG[6])]]])]]])])]);
        double YSXNIZHFC_VFLLKH = 0, LNQABHOCUL_PRYEJ_VCWSMUEIF = 0;
        double KZQIQLKZAU = 0;
        int g_tagCfclaowvq = (int) (var_2348[(int) (_Ya_3b5B3nyUHEGf_LIb_[(int) (k1j_sHi_k_suVW_nn51lh[g_pDmfgavnzNonebuo[_oGLZW_uXim6WBCsx_7fGFm[(int) (tagYigawnpkqDhxlb[XQKGIAFO_OQZSLJER[dIixxpmMmowl[(int) (BCRDUROMOY_MNAXYNOXOG[6])]]])]]])])]);
        var_1784 = (int) (var_2348[(int) (_Ya_3b5B3nyUHEGf_LIb_[(int) (k1j_sHi_k_suVW_nn51lh[g_pDmfgavnzNonebuo[_oGLZW_uXim6WBCsx_7fGFm[(int) (tagYigawnpkqDhxlb[XQKGIAFO_OQZSLJER[dIixxpmMmowl[(int) (BCRDUROMOY_MNAXYNOXOG[7])]]])]]])])]);
        while (var_1784 != (int) (var_2348[(int) (_Ya_3b5B3nyUHEGf_LIb_[(int) (k1j_sHi_k_suVW_nn51lh[g_pDmfgavnzNonebuo[_oGLZW_uXim6WBCsx_7fGFm[(int) (tagYigawnpkqDhxlb[XQKGIAFO_OQZSLJER[dIixxpmMmowl[(int) (BCRDUROMOY_MNAXYNOXOG[5])]]])]]])])])) {
            switch(var_1784) {
                case 1748360005:
                    LNQABHOCUL_PRYEJ_VCWSMUEIF = 0.0;
                    var_1784 += (int) (var_2348[(int) (_Ya_3b5B3nyUHEGf_LIb_[(int) (k1j_sHi_k_suVW_nn51lh[g_pDmfgavnzNonebuo[_oGLZW_uXim6WBCsx_7fGFm[(int) (tagYigawnpkqDhxlb[XQKGIAFO_OQZSLJER[dIixxpmMmowl[(int) (BCRDUROMOY_MNAXYNOXOG[2])]]])]]])])]);
                    break;
                case 1856283626:
                    KZQIQLKZAU = YSXNIZHFC_VFLLKH / g_tagCfclaowvq;
                    var_1784 += -(int) (var_2348[(int) (_Ya_3b5B3nyUHEGf_LIb_[(int) (k1j_sHi_k_suVW_nn51lh[g_pDmfgavnzNonebuo[_oGLZW_uXim6WBCsx_7fGFm[(int) (tagYigawnpkqDhxlb[XQKGIAFO_OQZSLJER[dIixxpmMmowl[(int) (BCRDUROMOY_MNAXYNOXOG[0])]]])]]])])]);
                    break;
                case 397569341:
                    for (double var_3315 : numArray) {
                        LNQABHOCUL_PRYEJ_VCWSMUEIF += Math.pow(var_3315 - KZQIQLKZAU, (int) (var_2348[(int) (_Ya_3b5B3nyUHEGf_LIb_[(int) (k1j_sHi_k_suVW_nn51lh[g_pDmfgavnzNonebuo[_oGLZW_uXim6WBCsx_7fGFm[(int) (tagYigawnpkqDhxlb[XQKGIAFO_OQZSLJER[dIixxpmMmowl[(int) (BCRDUROMOY_MNAXYNOXOG[8])]]])]]])])]));
                    }
                    var_1784 ^= (int) (var_2348[(int) (_Ya_3b5B3nyUHEGf_LIb_[(int) (k1j_sHi_k_suVW_nn51lh[g_pDmfgavnzNonebuo[_oGLZW_uXim6WBCsx_7fGFm[(int) (tagYigawnpkqDhxlb[XQKGIAFO_OQZSLJER[dIixxpmMmowl[(int) (BCRDUROMOY_MNAXYNOXOG[1])]]])]]])])]);
                    break;
                case 346558763:
                    var_1784 -= (int) (var_2348[(int) (_Ya_3b5B3nyUHEGf_LIb_[(int) (k1j_sHi_k_suVW_nn51lh[g_pDmfgavnzNonebuo[_oGLZW_uXim6WBCsx_7fGFm[(int) (tagYigawnpkqDhxlb[XQKGIAFO_OQZSLJER[dIixxpmMmowl[(int) (BCRDUROMOY_MNAXYNOXOG[3])]]])]]])])]);
                    break;
                case 2049082762:
                    g_tagCfclaowvq = numArray.length;
                    var_1784 ^= (int) (var_2348[(int) (_Ya_3b5B3nyUHEGf_LIb_[(int) (k1j_sHi_k_suVW_nn51lh[g_pDmfgavnzNonebuo[_oGLZW_uXim6WBCsx_7fGFm[(int) (tagYigawnpkqDhxlb[XQKGIAFO_OQZSLJER[dIixxpmMmowl[(int) (BCRDUROMOY_MNAXYNOXOG[4])]]])]]])])]);
                    break;
                case 1223494009:
                    for (double Znwm6_8u9jX_xR5pTD_d_do : numArray) {
                        YSXNIZHFC_VFLLKH += Znwm6_8u9jX_xR5pTD_d_do;
                    }
                    var_1784 -= -(int) (var_2348[(int) (_Ya_3b5B3nyUHEGf_LIb_[(int) (k1j_sHi_k_suVW_nn51lh[g_pDmfgavnzNonebuo[_oGLZW_uXim6WBCsx_7fGFm[(int) (tagYigawnpkqDhxlb[XQKGIAFO_OQZSLJER[dIixxpmMmowl[(int) (BCRDUROMOY_MNAXYNOXOG[9])]]])]]])])]);
                    break;
            }
        }
        return Math.sqrt(LNQABHOCUL_PRYEJ_VCWSMUEIF / g_tagCfclaowvq);
    }

    public static void main(String[] args) {
        int[] IOGSLYG = { 6, 9, 8, 1, 4, 7, 3, 5, 2, 0 };
        double[] g_hWqxrgZtfdcUtwbkrws = { 9.893982473846211, 8.837770674688722, 4.067157256008418, 2.3115297856816746, 3.8716062493716654, 5.507190514670451, 7.818988112023534, 1.7250220192323442, 0.8523908886140618, 6.747058567002978 };
        double[] L_iKHhgT_aPp_5B9Ozwt = { 7.849531919066571, 8.756056001455965, 5.581372756652905, 2.6854431574696265, 9.54031957784418, 4.751783077753141, 0.6519077871165615, 3.4725415203664936, 1.1796436510537949, 6.529240205849044 };
        double[] var_1843 = { 3.5830414679999727, 7.765002064574897, 5.747420361437176, 9.03918146781341, 2.1694631753099203, 4.461227633821848, 0.5928498544188721, 6.733060110767956, 8.972045828379096, 1.2936970621901658 };
        int[] var_270 = { 3, 4, 8, 5, 2, 0, 7, 9, 6, 1 };
        double[] FGDZKSMUBL_BSADUFHN = { 2.709181395472024, 1.4138229626532237, 8.452781324621286, 4.07039292629872, 0.5563463088620194, 3.190693548607314, 9.40094856498094, 7.255549494320699, 5.936277596640855, 6.592431990297909 };
        double[] zYT7J_NZE_cvq1ru_kpu_ = { 7.3909715123201245, 1.5001898092106307, 3.9693951519131065, 8.18801670301216, 9.82689109546222, 0.6781820978264445, 4.300516190313363, 6.311729342757382, 2.786311440143259, 5.545528271312568 };
        int[] nJcdtqsqmUkqrltquhJavwrm = { 5, 3, 1, 7, 0, 2, 4, 6, 9, 8 };
        double[] var_1804 = { 6.792311684420676, 8.201772053960008, 3.479304446030777, 4.052087473990268, 1.6341533643498025, 7.802566748925835, 2.157374245574941, 5.55583987079309, 9.623213031935967, 0.19074568575208029 };
        int[] CGHFE_BQOXOKPBRE_CIHGIXCFM = { 1, 25, 15, 0, 65535, 1629319923, 798969606, 265582820, 312187509, 1095933137 };
        int EBDMEMH_JEVGN_LPJCQCVGCG = CGHFE_BQOXOKPBRE_CIHGIXCFM[(int) (var_1804[nJcdtqsqmUkqrltquhJavwrm[(int) (zYT7J_NZE_cvq1ru_kpu_[(int) (FGDZKSMUBL_BSADUFHN[var_270[(int) (var_1843[(int) (L_iKHhgT_aPp_5B9Ozwt[(int) (g_hWqxrgZtfdcUtwbkrws[IOGSLYG[5]])])])]])])]])];
        double v0sksO_xvISrww64_my_W_Z = 0;
        double[] bWnmupvqmjUyxevxldr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        EBDMEMH_JEVGN_LPJCQCVGCG = CGHFE_BQOXOKPBRE_CIHGIXCFM[(int) (var_1804[nJcdtqsqmUkqrltquhJavwrm[(int) (zYT7J_NZE_cvq1ru_kpu_[(int) (FGDZKSMUBL_BSADUFHN[var_270[(int) (var_1843[(int) (L_iKHhgT_aPp_5B9Ozwt[(int) (g_hWqxrgZtfdcUtwbkrws[IOGSLYG[6]])])])]])])]])];
        while (EBDMEMH_JEVGN_LPJCQCVGCG != CGHFE_BQOXOKPBRE_CIHGIXCFM[(int) (var_1804[nJcdtqsqmUkqrltquhJavwrm[(int) (zYT7J_NZE_cvq1ru_kpu_[(int) (FGDZKSMUBL_BSADUFHN[var_270[(int) (var_1843[(int) (L_iKHhgT_aPp_5B9Ozwt[(int) (g_hWqxrgZtfdcUtwbkrws[IOGSLYG[7]])])])]])])]])]) {
            switch(EBDMEMH_JEVGN_LPJCQCVGCG) {
                case 798969606:
                    v0sksO_xvISrww64_my_W_Z = func_748(bWnmupvqmjUyxevxldr);
                    EBDMEMH_JEVGN_LPJCQCVGCG += CGHFE_BQOXOKPBRE_CIHGIXCFM[(int) (var_1804[nJcdtqsqmUkqrltquhJavwrm[(int) (zYT7J_NZE_cvq1ru_kpu_[(int) (FGDZKSMUBL_BSADUFHN[var_270[(int) (var_1843[(int) (L_iKHhgT_aPp_5B9Ozwt[(int) (g_hWqxrgZtfdcUtwbkrws[IOGSLYG[9]])])])]])])]])];
                    break;
                case 1894902743:
                    String f_WtDQJM_q_eckhu9 = "";
                    int[] var_972 = { 0x00A8, 0x00EA, 0x00C4, 0x00DE, 0x00CA, 0x00C4, 0x00E6, 0x00CA, 0x0042, 0x008A, 0x00CC, 0x00EE, 0x00D4, 0x00C4, 0x00EA, 0x00D4, 0x00E0, 0x00DE, 0x0042, 0x007C, 0x0042, 0x004C, 0x005E, 0x006E, 0x00CE };
                    for (int var_3152 = CGHFE_BQOXOKPBRE_CIHGIXCFM[(int) (var_1804[nJcdtqsqmUkqrltquhJavwrm[(int) (zYT7J_NZE_cvq1ru_kpu_[(int) (FGDZKSMUBL_BSADUFHN[var_270[(int) (var_1843[(int) (L_iKHhgT_aPp_5B9Ozwt[(int) (g_hWqxrgZtfdcUtwbkrws[IOGSLYG[5]])])])]])])]])], var_3085 = CGHFE_BQOXOKPBRE_CIHGIXCFM[(int) (var_1804[nJcdtqsqmUkqrltquhJavwrm[(int) (zYT7J_NZE_cvq1ru_kpu_[(int) (FGDZKSMUBL_BSADUFHN[var_270[(int) (var_1843[(int) (L_iKHhgT_aPp_5B9Ozwt[(int) (g_hWqxrgZtfdcUtwbkrws[IOGSLYG[5]])])])]])])]])]; var_3152 < CGHFE_BQOXOKPBRE_CIHGIXCFM[(int) (var_1804[nJcdtqsqmUkqrltquhJavwrm[(int) (zYT7J_NZE_cvq1ru_kpu_[(int) (FGDZKSMUBL_BSADUFHN[var_270[(int) (var_1843[(int) (L_iKHhgT_aPp_5B9Ozwt[(int) (g_hWqxrgZtfdcUtwbkrws[IOGSLYG[2]])])])]])])]])]; var_3152++) {
                        var_3085 = var_972[var_3152];
                        var_3085 = (((var_3085 & CGHFE_BQOXOKPBRE_CIHGIXCFM[(int) (var_1804[nJcdtqsqmUkqrltquhJavwrm[(int) (zYT7J_NZE_cvq1ru_kpu_[(int) (FGDZKSMUBL_BSADUFHN[var_270[(int) (var_1843[(int) (L_iKHhgT_aPp_5B9Ozwt[(int) (g_hWqxrgZtfdcUtwbkrws[IOGSLYG[0]])])])]])])]])]) >> CGHFE_BQOXOKPBRE_CIHGIXCFM[(int) (var_1804[nJcdtqsqmUkqrltquhJavwrm[(int) (zYT7J_NZE_cvq1ru_kpu_[(int) (FGDZKSMUBL_BSADUFHN[var_270[(int) (var_1843[(int) (L_iKHhgT_aPp_5B9Ozwt[(int) (g_hWqxrgZtfdcUtwbkrws[IOGSLYG[1]])])])]])])]])]) | (var_3085 << CGHFE_BQOXOKPBRE_CIHGIXCFM[(int) (var_1804[nJcdtqsqmUkqrltquhJavwrm[(int) (zYT7J_NZE_cvq1ru_kpu_[(int) (FGDZKSMUBL_BSADUFHN[var_270[(int) (var_1843[(int) (L_iKHhgT_aPp_5B9Ozwt[(int) (g_hWqxrgZtfdcUtwbkrws[IOGSLYG[8]])])])]])])]])])) & CGHFE_BQOXOKPBRE_CIHGIXCFM[(int) (var_1804[nJcdtqsqmUkqrltquhJavwrm[(int) (zYT7J_NZE_cvq1ru_kpu_[(int) (FGDZKSMUBL_BSADUFHN[var_270[(int) (var_1843[(int) (L_iKHhgT_aPp_5B9Ozwt[(int) (g_hWqxrgZtfdcUtwbkrws[IOGSLYG[0]])])])]])])]])];
                        var_3085--;
                        f_WtDQJM_q_eckhu9 += (char) (var_3085 & CGHFE_BQOXOKPBRE_CIHGIXCFM[(int) (var_1804[nJcdtqsqmUkqrltquhJavwrm[(int) (zYT7J_NZE_cvq1ru_kpu_[(int) (FGDZKSMUBL_BSADUFHN[var_270[(int) (var_1843[(int) (L_iKHhgT_aPp_5B9Ozwt[(int) (g_hWqxrgZtfdcUtwbkrws[IOGSLYG[0]])])])]])])]])]);
                    }
                    System.out.format(f_WtDQJM_q_eckhu9, v0sksO_xvISrww64_my_W_Z);
                    EBDMEMH_JEVGN_LPJCQCVGCG += -CGHFE_BQOXOKPBRE_CIHGIXCFM[(int) (var_1804[nJcdtqsqmUkqrltquhJavwrm[(int) (zYT7J_NZE_cvq1ru_kpu_[(int) (FGDZKSMUBL_BSADUFHN[var_270[(int) (var_1843[(int) (L_iKHhgT_aPp_5B9Ozwt[(int) (g_hWqxrgZtfdcUtwbkrws[IOGSLYG[4]])])])]])])]])];
                    break;
                case 312187509:
                    double[] JSAWI_MIESGAXF_LTYZRZ = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
                    EBDMEMH_JEVGN_LPJCQCVGCG = CGHFE_BQOXOKPBRE_CIHGIXCFM[(int) (var_1804[nJcdtqsqmUkqrltquhJavwrm[(int) (zYT7J_NZE_cvq1ru_kpu_[(int) (FGDZKSMUBL_BSADUFHN[var_270[(int) (var_1843[(int) (L_iKHhgT_aPp_5B9Ozwt[(int) (g_hWqxrgZtfdcUtwbkrws[IOGSLYG[3]])])])]])])]])];
                    break;
            }
        }
    }
}

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 AutoIt

AutoIt Obfuscator doczekał się małych, acz ważnych aktualizacji:

  • Obsługa enumeracji bez określenia zakresu Local lub Global np. Enum $eIncr0, $eIncr2, $eIncr4
  • Obsługa enumeracji bez określenia zakresu Local lub Global wraz z własnym krokiem Step np. Enum Step * 4 $eIncr0, $eIncr2, $eIncr4
  • Poprawiono losowe przemianowanie nazw zmiennych
  • Przyśpieszono funkcję przemianowania nazw zmiennych

Najważniejszą zmianą jest nowa metoda analizy zmiennych, która została znacząco przyśpieszona oraz wyklucza wartości niezadeklarowane w skrypcie z zaciemniania polegającego na ich losowej zmianie nazw.

Dzięki temu, stałe wartości zadeklarowane w zewnętrznych plikach dołączonych przez include nie są zmieniane.

Cały proces zaciemniania kodu można zautomatyzować poprzez wykorzystanie odrębnego klienta konsolowego lub poprzez pakiety SDK dla PHP i Pythona.

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

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

AutoIt Obfuscator – Wersja konsolowa dla Windows i Linux

Męczarnie przy deobfuskacji

Ile czasu potrzebne jest, aby wykonać deobfuskację kodu assemblera zabezpieczonego moim Obfuscatorem?

Obfuskator

Autorowi Binary NinjaJoshowi Watsonowi zajęło to 11 streamingowych epizodów i 26 godzin roboczych, żeby zdeobfuskować 5 linijek kodu assemblera zabezpieczonych Obfuscatorem (pracował nad przykładem dostępnym tutaj).

W 7 epizodzie sam przyznał, że oszukiwał i pisał kod pomiędzy nagrywaniem streamów, z innych ciekawych cytatów można wymienić:

I’m tired dealing with it

Josh Watson

Frustrating

Josh Watson

Wszystkie epizody:

https://www.twitch.tv/videos/366032780 0:49 – 1:48
https://www.twitch.tv/videos/366240933 1:55
https://www.twitch.tv/videos/366736858 2:51
https://www.twitch.tv/videos/366738393 2:47
https://www.twitch.tv/videos/375816563 3:12
https://www.twitch.tv/videos/373060356 3:07
https://www.twitch.tv/videos/375806158 1:47
https://www.twitch.tv/videos/385612137 3:03
https://www.twitch.tv/videos/385613601 2:51
https://www.twitch.tv/videos/385615821 2:55
https://www.twitch.tv/videos/387072436 1:12

Kawał solidne roboty, jednak dokładnie taki jest cel obfuskacji kodu, ponieważ uzmysławia jak wiele czasu potrzeba do analizy nawet 5 linijek kodu poddanych zabezpieczeniu.

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