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 🙂

Upadek StackOverflow

Już dawno się przekonałem, że StackOverflow to miejsce, gdzie jedynie zaglądam jak już naprawdę nigdzie, nigdzie indziej nie znajduję rozwiązania programistycznych problemów.

Jednak przestałem już lata temu cokolwiek samemu tam pisać z prostej przyczyny. Miejsce to stało się moderacyjnym piekłem, gdzie moderatorzy poprawiają każdą możliwą odpowiedź. Dodadzą przecinki, zmienią skróty, zmienią nawet techniczne zwroty i kod.

Tak – zmieniają kod w moich i zapewne twoich odpowiedziach, sprawdź sam jeśli kiedykolwiek tam pisałeś, możesz się zdziwić. To główna przyczyna, dla której przestałem tam się udzielać.

Dla rozrywki przywracałem stan jednej z moich oryginalnych odpowiedzi, żeby pokazać co tam się odjaniepawla:

Ponad 17 razy przywracałem moją oryginalną odpowiedź, która latami była pierwszą odpowiedzią, a moderatorzy non stop mi ją modyfikowali.

W końcu dostałem bana… Można się tego było spodziewać, ale warto nad tym pomyśleć następnym razem gdy zechcesz cokolwiek tam odpowiedzieć – czy warto rozbudowywać miejsce, gdzie chcą twoich odpowiedzi, ale nie do końca takich jakie je piszesz. Absurd.

Złote gacie dla moderatora roku

Miejsce, które miało być przystanią dla programistów – zostało piekiełkiem dla moderatorów wyjętych żywcem z Wikipedii (przy okazji przypominam dlaczego nie warto wspierać finansowo Wikipedii).

Joel Spolsky i Jeff Atwood sprzedali w 2021 StackOverflow za 1.8 miliarda dolarów (przy okazji obrazili się na Elona Muska i oboje przestali pisać na Twitterze i przenieśli się na Mastodona) i mają wyjebane jajca, a moderatorzy i boty skutecznie przeczesują każdą odpowiedź i nabijają sobie punkty na edycjach żeby potem kandydować na moderatora roku…

Stare odpowiedzi, a nowe technologie

Od jakiegoś czasu zauważyłem, że na StackOverflow i satelickich stronach z tego uniwersum coraz częściej można dostrzec brak zaktualizowanych odpowiedzi na zmieniające się technologie programistyczne.

Nowe frameworki i wersje języków programowania oferują nowe rozwiązania starych problemów, a ich opisów brak, przykładem może być składnia Python 2 vs 3 czy np. używany przeze mnie framework PHP Yii2. Myślę, że to nie przypadek, że ludzie przestali pisać odpowiedzi i nie widzę, żeby się to zmieniło na plus w przyszłości – wręcz odwrotnie.

A jakie wy macie doświadczenia ze StackOverflow?

Najlepsza muzyka do programowania

Moje 10 typów najlepszej muzyki do programowania, reversowania i długich, nocnych podróży w nieznane. Znasz fajne kawałki? Dorzuć do komentarzy linka!

10. She Keeps Bees

Długo się zastanawiałem czy to dawać na miejscu 10, bo nie każdemu to może przypaść do gustu, ale oryginalne wykonanie i meloda chwytają mnie za serce każdym razem.

9. DJ Shadow

Polecam płytę Endtroducing, jest to jedna z płyt, do których ciągle wracam mimo upływu lat, wydana w 1996, ale ma w sobie coś co sprawia, że ciągle po nią sięgam.

8. Hooverphonic

Muzyka z moich lat młodzieńczych i poprzedniego życia, która od razu budzi we wnie wszystkie dobre i złe wspomnienia, ale polecam każdemu.

7. Gavin Evans

Nie wiem czy to jednorazowy strzał fotografa Gavina Evansa, ale to dla mnie jeden z ponadczasowych utworów ze świetnym teledyskiem.

6. Bang Gang

Nasłuchałem się tego tyle, że trochę obecnie spadło w moim rankingu, ale to tak doskonale skomponowana i bogata muzyka, że warto się chociaż z tym zaznajomić.

5. Dan The Automator, Handsome Boy Modeling School, Got a Girl, Lovage

Dan to producent współpracujący z wieloma artystami tworzący unikalne połączenie wielu rodzajów muzyki i stylów, dzięki któremu odkryłem kilka perełek jak np. Jack Johnson, którego plakat wisi dumnie u mnie na ścianie.

Na jego albumach wystąpiły takie gwiazdy jak m.in. Roisin Murphy znana z Moloko, Cat Power czy Pharell Williams.

Dan the Automator zrobił kolaborację z Mary Elizabeth Winstead (żoną Obi Wan Kenobiego) o nazwie Got A Girl i grali także jego starsze kawałki razem:

Ze starszych płyt bardzo ciekawą propozycję stanowi Lovage

6. Husky Rescue

Uwielbiam tą muzykę do auta, idealna jeśli lubicie jeździć nocą bez lub tylko w jednym celu 🙂

5. KIYO CATO

Ciekawa historia zawarta w tekście i doskonałe wykonanie, wracałem do tego numeru setki razy i znam go na pamięć.

4. Yelawolf

Yelawolf czyli country w rapowym wykonaniu i chodząca reklama marki Chevrolette. Jeszcze rok temu numer 1 na mojej playliście – wszędzie! Odkrycie, które nie spodziewałem się, że tak dobrze mi siądzie, zaraziłem jego kawałkami wielu znajomych. Bardzo niedoceniany artysta z unikalnym warsztatem i oryginalnymi piosenkami – SLUMERICAN na 100%. Wrzucam najwięcej jego kawałków bo przerobiłem jego dyskografię na lewo i prawo po 1000 razy 😀

3. Still Corners

Kawałek Midnight Drive jest tym co mnie uspokaja na długich nocnych trasach, jedno z moich ulubionych muzycznych odkryć zeszłego roku.

2. Alexander Ebert

Alexander Ebert to główny wykonawca Edward Sharpe & The Magnetic Zeros, którego przynajmniej jeden kawałek na 100% znacie:

Jednak jego solowy numer Truth zmiata z planszy, tak doskonale współgra z moją duszą, że wracam do niego nadzwyczaj często.

1. ZHU

Ostatnio moje serce skradł ZHU, jakiś czas temu słuchałem tego na snowboardowych tripach, ale teraz znowu do tego wróciłem i jak to mówią u nas w Stanach „I used to be a fan now I’m an air conditioner” 🙂

Cała płyta Generation WHY to majstersztyk:

Twoje typy?

I jak, podoba się, nie podoba, wolisz inny rodzaj muzyki? To najlepsza okazja, żeby pokazać czego słuchasz do programowania i nie tylko, czekam na komentarze.

Forum programistyczne DevStart

Zapraszam wszystkich malkontentów programistycznych C++, starych wyjadaczy Haskella, młodych adeptów Rusta do spamowania na moim forum programistycznym DevStart.

PS. Masz bloga, nowego, starego i chcesz zarobić 250 PLN w BTC, ETH lub XMR? Podlinkuj forum DevStart (w sidebarze) z dokładnie takim kodem HTML i skontaktuj się ze mną po wypłatę. Easy money.

<a href="https://devstart.pl" title="Forum programistyczne DevStart">Forum programistyczne DevStart</a>

Nie chcesz zarobić? To nie zawracaj mi dupy 🙂

Konferencja na 25-lecie Studenckiego Koła Naukowego Informatyków „KOD”

Informatyka to Twoja pasja lub wiążesz z nią swoją przyszłość? Intresują Cię nowoczesne technologie? A może zwyczajnie masz chwilę, i chciałbyś się dowiedzieć czegoś nowego w tym temacie?

Świetnie się składa, bo Studenckie Koło Naukowe Informatyków „KOD” właśnie organizuje konferencję na 25 – lecie swojej działalności!

https://kod.prz.edu.pl/konferencja

Przewodniczyć jej będą specjaliści z wieloletnim doświadczeniem w IT, którzy przedstawią prelekcje na temat pracy w branży. Zaprezentują się również studenci Politechniki Rzeszowskiej, którzy pokażą wiele różnorodnych, innowacyjnych projektów wykonanych podczas pracy w kole (m.in. prezentacja systemu operacyjnego MicrOS oraz gry Roguelike).

Podczas wydarzenia przewidziane są także wyjątkowe konkursy z nagrodami.

Konferencja odbędzie się 6 kwietnia 2022r. i rozpocznie się o godzinie 10:00 w Auli Politechniki Rzeszowskiej (budynek V).

Istnieje również możliwość wzięcia udziału w formie zdalnej – na YT, Facebooku i stronie internetowej wydarzenia www.skni25.pl

Serdecznie zapraszamy studentów, pasjonatów i pracowników IT oraz wszystkich zainteresowanych. 🙂

WSTĘP CAŁKOWICIE DARMOWY, JEDNAK ILOŚĆ MIEJSC NA WYDARZENIE STACJONARNE OGRANICZONA! 🙂

Czekamy właśnie na Ciebie!

Szyfrowanie w Pythonie

Opublikowałem właśnie pomocniczy moduł usługi szyfrującej StringEncrypt dla Pythona 3.

Moduł znajdziecie w Pythonowym repozytorium PyPI:

https://pypi.org/project/stringencrypt/

Jego kody źródłowe opublikowałem również na GitHubie:

https://github.com/PELock/StringEncrypt-Python

Instalacja dla Pythona z wykorzystaniem menedżera paczek pip:

pip install stringencrypt

Jak to działa i co to właściwie robi?

W skrócie bierze dowolny string lub zawartość binarnego pliku, szyfruje to silnik polimorficzny i generuje kod w wybranym języku programowania (w tym wypadku w Pythonie) z kodem zawierającym zaszyfrowany string oraz kodem samego dekryptora: