AutoIt Obfuscator v2.2

Claude Opus v4.8 trochę popracował nad analizą silnika mojego AutoIt Obfuscatora i znalazł masę błędów, a także znacznie przyspieszył jego działanie, zachowując 100% kompatybilność.

Obfuskacja kodu źródłowego AutoIt

Zmiany w v2.2

  • Znaczne przyspieszenie silnika — przepisane bajtowe operacje wejścia/wyjścia leksera, buforowana długość kodu źródłowego, wyszukiwanie symboli oparte na tablicach mieszających oraz lżejsze przechodzenie drzewa AST sprawiają, że obfuskacja jest znacznie szybsza, dając identyczny bajtowo wynik
  • Naprawiono awarię parsera w blokach Switch / Select — instrukcje umieszczone przed pierwszym Case zwracają teraz czysty błąd parsowania zamiast wyjątku krytycznego
  • Naprawiono parsowanie deklaracji z wieloma modyfikatorami np. Local Static Const $var = 1 (wcześniej uwzględniany był tylko pierwszy modyfikator)
  • Naprawiono generowanie nieprawidłowych nazw zmiennych, które mogą zaczynać się od cyfry, np. $9abc, co jest niedozwolone w AutoIt
  • Naprawiono błąd, w którym liczbowe wartości warunków Case / If były emitowane jako błędne zmienne np. $123456789 podczas mieszania przepływu kodu
  • Naprawiono błędne obliczanie poziomu zagnieżdżenia pętli dla ContinueLoop / ExitLoop przy wielu przebiegach mieszania przepływu kodu
  • Naprawiono szyfrowanie ciągów znaków: literał "0" jest teraz poprawnie szyfrowany, a nieudane szyfrowanie nie wstawia już uszkodzonej procedury deszyfrującej
  • Rozpoznawanie funkcji wbudowanych, makr i stałych bez uwzględniania wielkości liter (AutoIt jest niewrażliwy na wielkość liter), aby uniknąć błędnej zmiany nazw i podmiany stałych
  • Poprawiono kilka wartości stałych wbudowanych (flagi atrybutów plików) oraz usunięto zduplikowane / błędne wpisy z tablic wewnętrznych
  • Zwiększono odporność leksera: poprawna obsługa pustych plików, zakończeń linii typu LF oraz wykrywanie niezamkniętych ciągów znaków
  • Wyłączone opcje obfuskacji są teraz ściśle respektowane zamiast powracać do wartości domyślnych
  • Liczne wewnętrzne usprawnienia odporności i poprawki zgodności typów z PHP 8 w silniku obfuskacji

Obfuscator dostępny jest pod adresem:

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

Integracja AutoIt Obfuscatora z SciTE

Dodałem integrację AutoIt Obfuscatora i procesu obfuskacji do domyślnego edytora AutoIt – SciTE.

Wystarczy zainstalować AutoIt Obfuscator korzystając z instalatora, a plik konfiguracyjny edytora, znajdujący się w folderze %USERPROFILE%\SciTEUser.properties zostanie automatycznie zaktualizowany.

Zmiana ta doda nową komendę Obfuscate do menu edytora Tools, dzięki czemu jednym kliknięciem można obfuskować skrypty *.au3.

Integracja AutoIt Obfuscator z domyślnym edytorem AutoIt - SciTE.

Wprowadzone zmiany do pliku konfiguracyjnego:

### AutoItObfuscator Section Start

#
# Menu extension for AutoIt Obfuscator for SciTE editor
#
# 1. Open SciTE editor
# 2. Click menu -> Options -> Open User Options File
# 3. Paste the content of this script into the user options file
# 4. Setup extra obfuscation parameters, activation key, and output file path
# 5. Save file
# 6. You will find a new "Obfuscate" command in Tools menu for *.au3 files
#
# https://www.pelock.com/products/autoit-obfuscator
# https://www.scintilla.org/SciTEDoc.html
#

# Activate the obfuscator menu for *.au3 files only (* for all files)
command.name.11.*.au3=Obfuscate

# Setup your obfuscation parameters, enter your activation key, output path etc.

#
# overwrite existing file (SciTE fill refresh the view, you can always undo it CTRL-Z)
#
command.11.*.au3=C:\Program Files (x86)\AutoIt Obfuscator\AutoItObfuscatorCmd.exe /InputFilePath="$(FilePath)" /OutputFilePath="$(FilePath)"
#command.11.*.au3=C:\Program Files (x86)\AutoIt Obfuscator\AutoItObfuscatorCmd.exe /ActivationCode="ENTER-YOUR-CODE-HERE" /InputFilePath="$(FilePath)" /OutputFilePath="$(FilePath)"

#
# create a new file
#
#command.11.*.au3=C:\Program Files (x86)\AutoIt Obfuscator\AutoItObfuscatorCmd.exe /InputFilePath="$(FilePath)" /OutputFilePath="$(FilePath).obfuscated.au3"


# Save any script before obfuscation (1 - save before obfuscation, 2 - use previously saved file content)
command.save.before.11.*.au3=1

# Specify the subsystem (0 Console, 2 = Windows GUI Executable / Web Link)
command.subsystem.11.*.au3=0

# Obfuscation command shortcut
command.shortcut.11.*.au3=Ctrl+F12

### AutoItObfuscator Section End

Można je edytować w SciTE, klikając w menu Options i Open User Options File, np. zmieniając parametry obfuskacji czy dodając tam swój klucz aktywacyjny.

Jakby kogoś ciekawiło (wątpię), jakie są dostępne opcje konfiguracji — warto zajrzeć do oficjalnej dokumentacji projektu SciTE.

Wtyczka JObfuscator dla Maven

JObfuscator to mój obfuscator kodów źródłowych Javy. Największym minusem tego projektu zawsze było to, że wymagało używania zewnętrznych aplikacji, narzędzia online lub API do zabezpieczania kodów źródłowych. Do dzisiaj.

Obfuskator dla kodów źródłowych Java - JObfuscator.

Nie było to najwygodniejsze rozwiązanie. Przyznaję bez bicia.

Myślałem o tym problemie od dawna i najlepszym rozwiązaniem, jakie mi wpadło do głowy, była wtyczka dla systemu Maven. Maven to standardowe narzędzie do budowy aplikacji bazujących na języku Java.

Automatyczna obfuskacja

I tak powstała wtyczka JObfuscator Maven Plugin.

Wtyczka JObfuscatora działa na zasadzie przedwstępnego kompilatora.

Kod źródłowy przed kompilacją poddawany jest automatycznej obfuskacji i dopiero te pliki wysyłane są do kompilatora javac.

Jak z tego skorzystać? Najpierw musisz mieć projekt kompatybilny z systemem Maven i odpowiednio zmodyfikować plik konfiguracyjny pom.xml, który definiuje wszystkie zależności i ustawienia.

Taka minimalna konfiguracja może wyglądać następująco:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0.0-SNAPSHOT</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.release>11</maven.compiler.release>
    <jobfuscator.apiKey><!-- TWOJ-KLUCZ-API lub pozostaw puste dla WERSJI DEMO --></jobfuscator.apiKey>
    <jobfuscator.version><!-- np. 1.0.3 --></jobfuscator.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>com.pelock</groupId>
      <artifactId>jobfuscator-annotations</artifactId>
      <version>${jobfuscator.version}</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>com.pelock</groupId>
        <artifactId>jobfuscator-maven-plugin</artifactId>
        <version>${jobfuscator.version}</version>
        <executions>
          <execution>
            <goals>
              <goal>obfuscate-sources</goal>
            </goals>
            <phase>generate-sources</phase>
          </execution>
        </executions>
        <configuration>
          <apiKey>${jobfuscator.apiKey}</apiKey>
          <enableCompression>true</enableCompression>
          <mixCodeFlow>true</mixCodeFlow>
          <renameVariables>true</renameVariables>
          <renameMethods>true</renameMethods>
          <shuffleMethods>true</shuffleMethods>
          <intsMathCrypt>true</intsMathCrypt>
          <cryptStrings>true</cryptStrings>
          <stringSplit>true</stringSplit>
          <intsToArrays>true</intsToArrays>
          <dblsToArrays>true</dblsToArrays>
          <dblsMathCrypt>true</dblsMathCrypt>
          <stringCharVault>true</stringCharVault>
          <intsFromDoubleMath>true</intsFromDoubleMath>
          <opaqueMixerChain>true</opaqueMixerChain>
          <complexifyBooleans>true</complexifyBooleans>
          <tryFinallyNoise>true</tryFinallyNoise>
          <selfCheck>true</selfCheck>
          <arrayIntCrypt>true</arrayIntCrypt>
          <arrayCharCrypt>true</arrayCharCrypt>
          <arrayDoubleCrypt>true</arrayDoubleCrypt>
          <arrayStringCrypt>true</arrayStringCrypt>
          <selfCheck>true</selfCheck>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.13.0</version>
        <configuration>
          <release>${maven.compiler.release}</release>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Modyfikacja źródeł

Do poprawnej obfuskacji potrzebne jest oznaczenie (tzw. annotation) na poziomie klasy czy metody, że w ogóle chcemy dokonać obfuskacji, dzięki czemu można dokładnie kontrolować co ma być poddane obfuskacji, z jakimi parametrami, a co ma być pominięte.

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

//
// MUSISZ dodać adnotację @Obfuscate do
// kodu, aby włączyć obfuskację na poziomie
// całej klasy lub pojedynczej metody
//
@Obfuscate
class Ideone
{
    //@Obfuscate
    public static double calculateSD(double numArray[])
    {
        double sum = 0.0, standardDeviation = 0.0;
        int length = numArray.length;

        for(double num : numArray) {
            sum += num;
        }

        double mean = sum/length;

        for(double num: numArray) {
            standardDeviation += Math.pow(num - mean, 2);
        }

        return Math.sqrt(standardDeviation/length);
    }

    //
    // poszczególne strategie obfuskacji
    // mogą być włączane lub wyłączane
    // na poziomie całej klasy lub
    // pojedyncznej metody (domyślnie
    // wszystkie strategie obfuskacyjne
    // są włączone jeśli użyta jest
    // sama adnotacja @Obfuscate bez
    // wyszczególnionych strategii)
    //
    //@Obfuscate(
    //  ints_math_crypt = true,
    //  dbls_math_crypt = true,
    //  string_split = true,
    //  crypt_strings = true,
    //  string_char_vault = true,
    //  rename_methods = false,
    //  rename_variables = true,
    //  shuffle_methods = true,
    //  array_int_crypt = true,
    //  array_double_crypt = true,
    //  array_char_crypt = true,
    //  array_string_crypt = true,
    //  mix_code_flow = true,
    //  ints_from_double_math = true,
    //  opaque_mixer_chain = true,
    //  complexify_booleans = true,
    //  try_finally_noise = true,
    //  ints_to_arrays = true,
    //  dbls_to_arrays = true,
    //  self_check = true
    // )
    public static void main(String[] args) {

        double[] numArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        double SD = calculateSD(numArray);

        System.out.format("Standard Deviation = %.6f", SD);
    }
}

I tyle! Potem normalnie budujesz przez Mavena, a proces obfuskacji jest automatyczny.

Darmowy klucz aktywacyjny do potestowania F4FA-DCDD-58A7-9FE1

PS. A, zapomniałem dodać o nowej strategii obfuskacyjnej bazującej na refleksji w runtime i sprawdzaniu poprawności metod, pól i typów, tak żeby nie za łatwo dało się zdeobfuskować finalny kod.

Flipper One

Autorzy popularnego Flipper Zero kontynuują pracę nad nowym projektem – Flipper One. Nowe urządzenie ma mieć bardziej mobilny i sieciowy charakter w porównaniu do radiowego Flippera Zero.

Flipper One

Wielkie plany, projekt portalu dla developerów, pełna adaptacja Linuxa

https://blog.flipper.net/flipper-one-we-need-your-help

Flipper Zero – szału nie ma

Mówiąc o Flipperze Zero to moje szczere przemyślenia są takie, że w moim przypadku okazał się zupełnie nieprzydatnym urządzeniem.

O ile funkcje takie jak monitorowanie pasm radiowych, nagrywanie i odtwarzanie sygnałów działają tak, jak powinny, to sama funkcjonalność zostaje szybko zrewidowana w zetknięciu z rzeczywistością.

Rzeczywistością w tym przypadku są algorytmy tzw. rolling-key jak np. Kee Loq, używane powszechnie w większości rozwiązań bezpiecznej komunikacji radiowej, np. w przypadku bram wjazdowych.

Algorytmy rolling-key zabezpieczają przed atakami replay (czyli nagraniem sygnału i jego odtworzeniem). Do poprawnego działania wymagane byłoby nagranie poprawnego sygnału, zablokowanie go i późniejsze odtworzenie (tak jak robią to złodzieje samochodów). Alternatywą jest wygenerowanie kolejnej sekwencji poprawnego klucza otwierającego. Do tego wymagana jest znajomość klucza producenta lub brute-forcowanie 64-bitowego klucza drogą radiową, co jak się domyślacie, nie jest realne.

Czasami klucze producentów jakichś systemów gdzieś wyciekają i można spróbować ich użyć do generowania kodów, ale to rzadkość.

U mnie Flipper Zero niestety leży na dnie biurka, ale jeśli znacie jakieś ciekawe zastosowanie – chętnie posłucham co mnie ominęło i nie mówie tutaj o chodzeniu po galeriach handlowych i masowym wyłączaniu ekranów 😉

JObfuscator v1.30 – Obfuskacja Javy

Zaktualizowałem swój obfuskator dla kodów źródłowych Javy, obsługujący język w wersji do 21.

Lista zmian jest ogromna i obejmuje dziesiątki bugfixów oraz mnóstwo nowych strategii obfuskacyjnych, częściowo kierowanych przeciwko LLMom (aby wypalić najwięcej tokenów przy próbach deobfuskacji). Do tego doszły nowe pakiety programistyczne dla PHP, Python, JS, Rust i C#.

Dodatkowo zaktualizowane zostały narzędzia desktopowe i CLI (np. masowe zabezpieczenia wielu plików).

JObfuscator Obfuskator dla kodów źródłowych Javy.

Na stronie znajdują się instrukcje, jak zdobyć darmowy kod aktywacyjny.