PowerShell Pro Obfuscator na PowerShell Gallery

Natywny moduł dla PowerShell Pro Obfuscator, opublikowany na PowerShell Gallery, umożliwiający wykorzystanie obfuscatora bezpośrednio w kodzie PowerShell.

https://www.powershellgallery.com/packages/PowerShellProObfuscator/1.0.0

Obfuskacja PowerShell z PowerShell

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

# install once:
# Install-Module -Name PowerShellProObfuscator -Scope CurrentUser

Import-Module PowerShellProObfuscator

#
# source code in PowerShell format
#
$scriptSourceCode = @'
function Get-Greeting {
    param([string]$Name)
    Write-Host "Hello World from $Name!"
}
Get-Greeting "PowerShell Pro Obfuscator"
'@

#
# select obfuscation strategies explicitly (only listed switches are enabled)
#
try
{
    $output = Invoke-PowerShellProObfuscate `
        -Source $scriptSourceCode `
        -ActivationCode 'ABCD-ABCD-ABCD-ABCD' `
        -EnableCompression:$false `
        -SelfDefending `
        -ProtectionLinker `
        -RenameVariables `
        -RenameParameters `
        -RenameFunctions `
        -ShuffleFunctions `
        -ControlFlowFlatten `
        -StateMachine `
        -VmStrategy `
        -EncryptIntegers `
        -SplitStrings `
        -EncryptStrings `
        -IntegersToArrays `
        -FloatsToArrays `
        -InsertDeadCode `
        -ComplexifyBooleans `
        -IntegersToFloating `
        -EncryptFloating `
        -DecoyFunctions `
        -DetectDebugger `
        -FakeDotSourceMarkers `
        -OpaqueBranches `
        -ScriptblockDecoys `
        -LiteralPadding `
        -ReflectInvokeCommands `
        -StringCharArrayVault `
        -TryFinallyNoise `
        -AffineIntegerMask `
        -EventStub `
        -RemoveComments

    Write-Host $output
}
catch
{
    throw "An error occurred while trying to obfuscate the code: $_"
}

PowerShell Pro Obfuscator – Obfuskator i Wirtualizer dla PowerShell

Mój nowy projekt zaawansowanego obfuskatora i wirtualizera dla skryptów PowerShell o nazwie PowerShell Pro Obfuscator. Oferuje ogromną ilość opcji obfuskacyjnych, wirtualizację kodu, transformacje do tzw. finite-state automata, sprawdzenie integralności kodu (czyli self-crc, gdzie klucz weryfikacji jest używany jako klucz odszyfrowania w innych elementach obfuskacji), detekcję debuggowania i masę innych strategii utrudniających odtworzenie oryginalnego skryptu.

Dostępny jako obfuscator online, z osobnym klientem dla Windows i Linux (plus wersja CLI), oraz jako pakiety programistyczne dla Python, C#, JS, Rust, PHP.

Główne okienko obfuscatora

PowerShell Pro Obfuscator & Virtualizer

Opcje obfuskacji skryptów PowerShell

Opcje obfuskacji i wirtualizacji kodu w narzędziu PowerShell Pro Obfuscator.

Kod PowerShell po obfuskacji

Kod skryptu PowerShell po obfuskacji.

Wersja CLI, pozwalająca na szybką automatyzację

Wersja konsolowa obfuskatora dla PowerShell.

Zasada działania obfuskatora PowerShell Pro Obfuscator

Engine bazuje na zaawansowanym parsowaniu i transformowaniu drzewa AST skryptów PowerShell. Nie ma tu żadnych zawodnych RegExów. W dużym skrócie wygląda to tak:

Projekt przeszedł ogromną liczbę testów oraz wykorzystuje znane i mniej znane (jak FSA) metody obfuskacji oraz innowacyjne metody, które utrudniają odbudowę zobfuskowanych skryptów.

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

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.

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.

Dekoder haseł FTP dla Total Commandera

Z okazji rocznicy, okrągłej oczywiście — odkodowania 133541 (tak — stu trzydziestu trzech tysięcy pięciuset czterdziestu jeden) haseł przez mój dekoder online, publikuję kody źródłowe algorytmu dekodowania haseł FTP Total Commandera w formie paczek dla popularnych języków programowania.

Dostępne są paczki dla PHP, Pythona, JS i waszego ukochanego Rust. Kody źródłowe wszystkich paczek są dostępne na moim GitHubie.

https://www.pelock.com/pl/produkty/total-commander-odzyskanie-hasla-ftp/sdk

Więc, jakby ktoś potrzebował szybko wdrożyć dekodowanie w jakichś narzędziach forensic to polecam – za darmo to dobra cena 🙂

from binascii import hexlify

from total_commander_ftp_password import TotalCommanderPasswordDecoder

cipher_hex = "00112233445566778899aabbccddeeff"

decoder = TotalCommanderPasswordDecoder()
plain = decoder.decrypt_password(cipher_hex)

if plain is None:
    raise RuntimeError("Invalid ciphertext (bad hex, odd length, or too short).")

print(plain)
print(hexlify(plain).decode("ascii"))

Wszystkie pakiety mają dodatkowo wbudowane proste narzędzie CLI.

PS. Wspierajmy twórców oprogramowania