PELock v2.11 – Zabezpieczenie Oprogramowania

Wypuściłem mały update PELock – czyli jedynego polskiego systemu zabezpieczenia 32-bitowych aplikacji EXE/DLL/OCX wraz z systemem kluczy licencyjnych, bazującym na asymetrycznej kryptografii RSA.

Zmiany

  • Zabezpieczenie z linii komend z parametrem /auto zabezpieczy wszystkie pliki znajdujące się na liście projektu (wcześniej zabezpieczany był tylko pierwszy plik)
  • Dodano język francuski interfejsu użytkownika (dziękuję Terry)
PELock po francusku

Wersja demonstracyjna do pobrania ze strony:

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

Przykłady użycia dla m.in. Delphi/Freepascal, C/C++, PowerBASIC, PureBasic, generowanie licencji, sprzętowych identyfikatorów etc. na GitHubie:

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

Antidebugging w aplikacjach Android

Dzisiaj analizowałem sobie jedną starszą aplikację i natknąłem się na ciekawy kod, sprawdzający kilka rzeczy, których autorzy sobie nie życzą (to nie jest koncert życzeń), marnie zakamuflowanych pod fałszywymi nazwami 😀

Sprawdzane są m.in.

  • Czy urządzenie było zrootowanie i czy dostępne są narzędzia takie jak np. komenda su.
  • Czy podpięty jest debugger
  • Czy zainstalowane są ehem wrogie aplikacje

Kod mówi więcej niż słowa, dlatego spójrzcie sami, może komuś ta wiedza się kiedyś przyda, z zastrzeżeniem, że to starsza aplikacja i kilka rzeczy mogło się już zmienić.

using System;
using System.Collections.Generic;
using System.IO;
using Android.App;
using Android.Content.PM;
using Android.OS;
using Xamarin.Forms;

namespace Abc
{
	// Token: 0x02000010 RID: 16
	public class CalendarService : ICalendarService
	{
		// Token: 0x06000044 RID: 68 RVA: 0x000080A5 File Offset: 0x000062A5
		public bool IsDateCorrect()
		{
			return this.IsDayCorrect() || this.IsProperUtcFormat() || this.IsMonthCorrect() || this.IsCurrentMonth() || this.IsItReallyCurrentYearAlready();
		}

		// Token: 0x06000045 RID: 69 RVA: 0x000080D0 File Offset: 0x000062D0
		public bool IsDayCorrect()
		{
			using (List<string>.Enumerator enumerator = new List<string>
			{
				"/system/app/Superuser.apk",
				"/sbin/su",
				"/system/bin/su",
				"/system/xbin/su",
				"/data/local/xbin/su",
				"/data/local/bin/su",
				"/system/sd/xbin/su",
				"/system/bin/failsafe/su",
				"/data/local/su",
				"/su/bin/su"
			}.GetEnumerator())
			{
				while (enumerator.MoveNext())
				{
					if (File.Exists(enumerator.Current))
					{
						return true;
					}
				}
			}
			string[] array = System.Environment.GetEnvironmentVariable("PATH").Split(':', StringSplitOptions.None);
			for (int i = 0; i < array.Length; i++)
			{
				if (File.Exists(Path.Combine(array[i], "su")))
				{
					return true;
				}
			}
			foreach (ActivityManager.RunningAppProcessInfo runningAppProcessInfo in ActivityManager.FromContext(Forms.Context).RunningAppProcesses)
			{
				if (runningAppProcessInfo.ProcessName.Contains("supersu") || runningAppProcessInfo.ProcessName.Contains("superuser"))
				{
					return true;
				}
			}
			return false;
		}

		// Token: 0x06000046 RID: 70 RVA: 0x00008240 File Offset: 0x00006440
		public bool IsProperUtcFormat()
		{
			return Build.Tags.Contains("test-keys");
		}

		// Token: 0x06000047 RID: 71 RVA: 0x00008251 File Offset: 0x00006451
		public bool IsMonthCorrect()
		{
			return (Forms.Context.ApplicationContext.ApplicationInfo.Flags & ApplicationInfoFlags.Debuggable) > ApplicationInfoFlags.None;
		}

		// Token: 0x06000048 RID: 72 RVA: 0x0000826C File Offset: 0x0000646C
		public bool IsCurrentMonth()
		{
			return Debug.IsDebuggerConnected;
		}

		// Token: 0x06000049 RID: 73 RVA: 0x00008274 File Offset: 0x00006474
		public bool IsItReallyCurrentYearAlready()
		{
			foreach (ApplicationInfo applicationInfo in Forms.Context.PackageManager.GetInstalledApplications(PackageInfoFlags.MetaData))
			{
				string packageName = applicationInfo.PackageName;
				if (packageName == "de.robv.android.xposed.installer" || packageName == "com.saurik.substrate" || packageName == "com.android.vending.billing.InAppBillingService.LUCK" || packageName == "com.android.vending.billing.InAppBillingService.CLON" || packageName == "com.android.vending.billing.InAppBillingService.COIN")
				{
					return true;
				}
			}
			return false;
		}
	}
}

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

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.