StringEncrypt – polimorficzne szyfrowanie

Zachęcony pozytywnymi komentarzami dotyczącymi mojego projektu StringEncrypt, postanowiłem zaktualizować wszystko, co się dało i spełnić marzenia fanów tego niezwykłego rozwiązania.

Co to jest StringEncrypt?

To aplikacja do szyfrowania stringów i plików, generująca polimorficzny kod dekryptora. Ze stroną, WebAPI, dedykowanym rozszerzeniem do VSCode (ponad 4k instalacji) i aplikacją okienkową. Coś dla prawdziwych hakerów!

Silnik projektu jest wykorzystany w moich pozostałych narzędziach do masowego, polimorficznego szyfrowania stringów (w AutoIt Obfuscator i JObfuscator).

Szyfrować i generować kod można w następujących językach programowania:

Nowa wersja przynosi ogrom zmian, w tym najważniejsze – wsparcie dla wielu nowych języków programowania, tony bugfixów i najważniejsze – zagnieżdżone pętle polimorficzne.

Zagnieżdżone pętle polimorficzne

Jednym z zarzutów i wektorów ataku na StringEncrypt (w przypadku generatorów np. C/C++) było wykorzystanie narzędzi do ekstrakcji stringów, takich jak flare-floss. Narzędzie to potrafi przeskanować gotowy plik EXE, przeanalizować kod i wyciągnąć nawet zaszyfrowane stringi.

Zgłębiłem temat i cała filozofia tego rozwiązania bazuje na detekcji tzw. tight-loops, czyli ciasnych pętli. flare-floss potrafi rozpoznać krótkie pętle deszyfrujące i poprzez ich emulację wyciągnąć zaszyfrowane stringi, jeśli takie pętle zostały wykorzystane do ich odszyfrowania.

Rozwiązaniem tego problemu było wygenerowanie wielopoziomowo zagnieżdżonych pętli z polimorficznym kodem deszyfrującym co nie wpisuje się już w detekcję prostych pętli.

Przykładowy kod C

// encrypted with https://www.stringencrypt.com (v1.5.0) [C/C++]
// nie_do_wyciagniecia = "Nie tak prosto kolego!"
wchar_t nie_do_wyciagniecia[23] = { 0x0052, 0x71A4, 0x0690, 0x0900, 0x6830, 0x25B1, 0xF185, 0x0009,
                                    0x0074, 0x01D8, 0x82B4, 0x1FC7, 0x5830, 0xFD51, 0x4002, 0xD71F,
                                    0x0073, 0x01C0, 0x0690, 0x18C3, 0xA2D0, 0xD4DE, 0x4000 };

for (volatile unsigned int UCSag = 0, JkERu = 0; UCSag < 23; UCSag++)
{
	JkERu = nie_do_wyciagniecia[UCSag];
	for (unsigned int XptZj = 0; XptZj < 2; XptZj++)
	{
		JkERu = (((JkERu & 0xFFFF) >> (UCSag % 16)) | ((JkERu & 0xFFFF) << (16 - (UCSag % 16)))) & 0xFFFF;
		for (unsigned int HBXqW = 0; HBXqW < 2; HBXqW++)
		{
			JkERu = (((JkERu & 0xFFFF) >> 8) | ((JkERu & 0xFFFF) << 8)) & 0xFFFF;
			JkERu = ((JkERu ^ 0xFFFF) & 0xFFFF);
		}
	}
	for (unsigned int WAUOq = 0; WAUOq < 4; WAUOq++)
	{
		JkERu = ((JkERu & 0xFFFF) - 1) & 0xFFFF;
	}
	for (unsigned int HIbTj = 0; HIbTj < 2; HIbTj++)
	{
		JkERu = (((JkERu & 0xFFFF) << 8) | ((JkERu & 0xFFFF) >> 8)) & 0xFFFF;
		for (unsigned int Dswmt = 0; Dswmt < 2; Dswmt++)
		{
			JkERu = ((JkERu & 0xFFFF) + UCSag) & 0xFFFF;
			JkERu = (JkERu ^ (((JkERu & 0xFFFF) << 9) & 0xFFFF)) & 0xFFFF;
			JkERu = (JkERu ^ UCSag) & 0xFFFF;
		}
	}
	nie_do_wyciagniecia[UCSag] = JkERu;
}

I efekt pracy flare-floss, czyli brak znalezionych stringów metodą skanowania tight-loops:

Poprawki błędów

  • Poprawiłem formatowanie kodu Pythona, żeby było zgodne z regułami PEP.
  • Naprawiłem generator Ruby i sposób zapisywania zaszyfrowanych znaków.
  • Poprawki dotknęły też generatora AutoIt.

6 nowych instrukcji szyfrujących VM:

  • neg — klasyczna negacja (nie not)
  • swap — zamiana bitów w szyfrowanych 8 bitowych bajtach oraz 16 bitowych wartościach dla unicode
  • c_rol / c_ror — rotacje bitowe z użyciem klucza, którym jest licznik pętli
  • xor_shr / xor_shl — szyfrowanie z miksowaniem XOR, tak jak w algorytmach MurmurHash i SplitMix

Kompletna liczba instrukcji VM wykorzystanych do szyfrowania obecnie wynosi 17 (z 11), co jeszcze bardziej urozmaica wygenerowany kod wyjściowy.

Nowe podświetlanie składni

Strona zyskała nowe podświetlanie składni wygenerowanego kodu, porzucony został stary highlighter Syntax Highlighter na rzecz biblioteki Prism.

Pakiety SDK

Przykłady automatyzacji z poziomu Pythona

#!/usr/bin/env python

###############################################################################
#
# String Encrypt WebApi interface usage example.
#
# In this example we will encrypt sample string with default options.
#
# Version        : v1.0.1
# Language       : Python
# Author         : Bartosz Wójcik
# Project page   : https://www.stringencrypt.com
# Web page       : https://www.pelock.com
#
###############################################################################

#
# include StringEncrypt module
#
from stringencrypt import StringEncrypt

#
# if you don't want to use Python module, you can import it directly from the file
#
#from stringencrypt.stringencrypt import StringEncrypt

#
# create StringEncrypt class instance (we are using our activation code)
#
myStringEncrypt = StringEncrypt("YOUR-API-KEY-HERE") # leave empty for demo mode

#
# encrypt a string using all the default options
#
result = myStringEncrypt.encrypt_string("Hello, world!", "label_encrypted")

#
# result[] array holds the encryption results as well as other information
#
# result["error"] (int) - error code
# result["source"] (string) - decryptor source code
# result["expired"] (boolean) - expiration flag
# result["credits_left"] (int) - number of credits left
# result["credits_total"] (int) - initial number of credits

if result and "error" in result:

    # display source code of the decryption code
    if result["error"] == StringEncrypt.ErrorCodes.ERROR_SUCCESS:
        print(result["source"])
    else:
        print(f'An error occurred, error code: {result["error"]} ({result["error_string"]})')

else:
    print("Something unexpected happen while trying to encrypt the string.")

Pełna wersja

Klucz można zakupić za śmieszne pieniądze lub za darmo go zdobyć, pisząc o tym rozwiązaniu na social mediach, artykułach, na forach czy gdziekolwiek się da z linkiem do strony projektu i krótkim opisem oraz screenshotem. Niewiele, prawda?

Na koniec chciałbym jeszcze raz podziękować wszystkim fanom, którzy w dobie AI zmotywowali mnie do tak dużych aktualizacji – bez waszych słów wsparcia by mi się nie chciało aż tak 🙂

Sztuczna inteligencja w dekompilatorach

AI wciska się wszędzie, dzisiaj trafiłem na aktualizację starego lecz ciągle udoskonalanego dekompilatora VB Decompiler, który że nie dość obsługuje stare aplikacji VB skompilowane do tzw. p-code, to obecnie potrafi dekompilować aplikacje .NET.

Nowością jest dodany moduł AI bazujący na modelu Ollama, który zdekompilowany kod poddaje analizie AI w celu jego modyfikacji, aby dało się go jeszcze lepiej zrozumieć.

Kod po zwykłej dekompilacji:

Kod po transformacji AI:

Ciekawych czasów dożyliśmy, o których można było tylko marzyć 20 lat temu 🙂

Zemsta Smart-Odkurzacza

Artykuł podesłany przez Fabka (thnx). Przykład jak urządzenia smart i firmy za nimi stojące nie są zainteresowane działaniem sprzętu, a jedynie zbieraniem informacji i co potrafią zrobić jeśli im się tego zabroni.

Smart odkurzacz

Rzadko czytam artykuły od A do Z, ale tym razem było bardzo ciekawie, polecam każdemu:

https://codetiger.github.io/blog/the-day-my-smart-vacuum-turned-against-me

Deobfuskacja kompilatora ScatterBrain

Bardzo ciekawy i techniczny artykuł prezentujący możliwości kompilatora z funkcją obfuskacji, wykorzystywanego w zabezpieczaniu oprogramowania szpiegowskiego z Chin.

Dużo typowych metod obfuskacji kodu x64, bardzo podobnych do popularnych technik stosowanych przy obfuskacji kodu x86, takich jak np. mieszanie codeflow, zaśmiecające skoki warunkowe, ale też kilka niespecyficznych metod jak ochrona każdej funkcji w skompilowanym pliku, ochrona wywołań funkcji WinAPI i pare innych:

Wygląda to bardziej jak customowy kompilator z obfuskacja i dodatkowo warstwa exe-protectora, ponieważ jeszcze całość jest zapakowana ze stubem typowo z exe-pakerów.

W każdym razie łakomy kąsek dla miłośników obfuskacji, czyli dla mnie i pozostałych 0.1% czytelników (siebie nie wliczaj) 🙂

https://cloud.google.com/blog/topics/threat-intelligence/scatterbrain-unmasking-poisonplug-obfuscator

Kod do radia Dodge RAM

Pogoda nie sprzyja aktywności na zewnątrz i wykorzystałem chwilę, żeby rozbudować swoje generatory do odblokowania radia o moduł dla Chrysler Dodge RAM.

To standardowe zabezpieczenie antykradzieżowe, które aktywuje się po wyciągnięciu akumulatora (lub jego wyładowaniu) i wymusza ponowną aktywację odtwarzacza Chrysler Dodge Ram Uconnect Harman Kardon VP2 (długa nazwa).

Zabezpieczenie antykradzieżowe w radiu Chrysler Dodge Ram Uconnect Harman Kardon VP2.

Do odblokowania będziesz potrzebował numer seryjny z tyłu radia, który zaczyna się od znaków TVPQN. Upewnij się także, że to model oznaczony VP2.

Numer seryjny radia Chrysler Dodge RAM Uconnect Harman Kardon VP2.

Jak już będziesz miał ten numer, wrzuć go do kalkulatora kodu radiowego Dodge RAM i po drobnej opłacie otrzymasz od razu kod odblokowujący radio.

Dla sprzedawców i programistów

Jednocześnie algorytm został dodany do mojego Kalkulatora Kodów Do Radia, więc jeśli chcesz masowo generować kody bez limitów i sprzedawać je np. na Allegro możesz skorzystać z fajnego i prostego interfejsu online do generowania kodów radia dla wielu modeli samochodów i radioodtwarzaczy.