Darmowy kod aktywacyjny dla AutoIt Obfuscatora z nabitym 1000 użyć
828E-4B0C-6D1E-5D8D
Strona domowa projektu https://www.pelock.com/pl/autoit-obfuscator/
Darmowy kod aktywacyjny dla AutoIt Obfuscatora z nabitym 1000 użyć
828E-4B0C-6D1E-5D8D
Strona domowa projektu https://www.pelock.com/pl/autoit-obfuscator/
AutoIt Obfuscator został zaktualizowany do wersji 1.1, gdzie cały kod parsera AST został przepisany, w efekcie czego wszystko działa w końcu tak jak powinno, czyli szybko.
https://www.pelock.com/obfuscator/
Przyznaję, poprzednia wersja miała problemy wydajnościowe już przy większych skryptach, jednak dzięki migracji na PHP7 i wykorzystaniu nowych elementów języka udało się uzyskać bardzo dobre rezultaty.
Zachęcam do testów, a jeśli macie jakieś sugestie co do strategii obfuskacyjnych to przyślijcie je z przykładowymi kodami źródłowymi, jeśli zostaną wykorzystane otrzymacie darmowe kody aktywacyjne.
Przez ostatni miesiąc pracowałem nad projektem obfuscatora dla języka skryptowego AutoIt i z przyjemnością prezentuję pierwsze wydanie AutoIt Obfuscatora.
AutoIt to język skryptowy pomocny przy automatyzacji zadań związanych z interfejsem użytkownika w systemie Windows, jest on często wykorzystywany przy tworzeniu skryptów dedykowanych dla Windows, czy całych aplikacji konsolowych lub okienkowych np. botów do gier. Żeby oddać sprawiedliwość, muszę powiedzieć, że jego łatwość użycia i bogactwo oferowanych funkcji również przyczyniła się niestety do tego, że tworzone jest w nim malware, chociaż można tutaj argumentować, że również inne języki programowania są do tego wykorzystywane.
Wadą AutoIt jest to, że po kompilacji skryptu do formatu EXE, kod skryptu jest zapisany w zasobach pliku EXE w zaszyfrowanej formie, ale dzięki wykorzystaniu odpowiednich narzędzi, możliwe jest jego odtworzenie do pierwotnej formy kodu źródłowego.
AutoIt Obfuscator stosuje zaawansowaną analizę kodu źródłowego AutoIt (AST) i wykorzystując szereg zaawansowanych technik zaciemniania kodu źródłowego potrafi tak zabezpieczyć zmienne, funkcje, stringi, że zrozumienie działania tak zaszyfrowanych elementów w kodzie źródłowym będzie po prostu bardzo trudne.
Przykład przed zastosowaniem obfuscatora:
ConsoleWrite("Hello World!")
Kod po zastosowaniu AutoIt Obfuscatora:
Global $var_382 = 225 Global $VWUKTOPAG = 10 #OnAutoItStartRegister "func_1675" Global $FBWUYAT_OSPPKEBV = Asc("l") Global $WnCx4HPC0ea312__qu_T_3[2][16] = [[1540386418, 74, 52187, 23787, 15150, 224, 789929744, 10864, 46, 57292, 240, 36153703, _ 225, 225, 71, 201], _ [1182170127, 61672, 15345, 37, 43206, 93, 67, 60, 56413, 133, 48731, 50442, 85, 40037, _ 15258, 13131]] Global $var_2697 = Asc("C") Global $var_502[15] = [776861442, 50520, 914414646, 60003, 153, 152, 57581, 41, 252554063, 1178542709, 1790, _ 1503905662, 10736, 118, 43596] #OnAutoItStartRegister "IdybyqbmmzEwhkdbwcylFunc" Global $dQtfnuoLbawdebyaWhfqizr = Lekpwpih Global $dMokwkydCxvjc = BitAND Global $nWhzikjjrw = NabjqvtehhFunc Global $_TJYsFyGFpg_A_2oUnB = uBG_WvHge_KoF_kUIKRuBDkE_ Global $var_3477 = RryazhTnrreatVrstjczn Global $3_JqevgUiOsgQ6AIN3YX_F7X_ = StringReverse Global $mIdavvqh = BitXOR Global $tQcjmm = ConsoleWrite Global $var_1580 = func_3695 Global $var_3104 = _ArrayToString Global $8PV9OzZiO__Uv_5i = func_182 Global $var_2267 = BitNOT Global $var_1232 = AprrvxelFdkqnecwUytafbsij Global $IYHEMOSVL_NIVAI = ChrW Global $var_1660 = StringTrimRight Global $ZJLLAEEQ = JwctaHcLcuhgwH_lpM_Siu_ #include <Array.au3> $tQcjmm($3_JqevgUiOsgQ6AIN3YX_F7X_($var_1580(($_wAv_m9f__FXOFTwxBqwX79 < $WRFGDNBJCT_XUFOVVGTR ? 151 : $var_3477()), $var_502[8], _ ($var_2697 >= $WnCx4HPC0ea312__qu_T_3[1][2] ? $var_382 : 107), $FBWUYAT_OSPPKEBV)) & $var_1660($_TJYsFyGFpg_A_2oUnB(($VWUKTOPAG >= $var_3477() ? $FBWUYAT_OSPPKEBV : 216), $var_382), _ $var_2267(-($FBWUYAT_OSPPKEBV < $8PV9OzZiO__Uv_5i() ? 7 : $WRFGDNBJCT_XUFOVVGTR))) & $3_JqevgUiOsgQ6AIN3YX_F7X_($var_1232($dQtfnuoLbawdebyaWhfqizr(), $_wAv_m9f__FXOFTwxBqwX79, 1798366573)) & $var_1660($ZJLLAEEQ($dQtfnuoLbawdebyaWhfqizr(), $WRFGDNBJCT_XUFOVVGTR, ($WnCx4HPC0ea312__qu_T_3[1][6] > $var_502[7] ? 198565640 : $var_3477())), _ $mIdavvqh(968160980, $WRFGDNBJCT_XUFOVVGTR))) Func AprrvxelFdkqnecwUytafbsij($PYLAO_EDFNQKEVTT_GBNZEGWVBB, $IAHTBPINLF_LZPPI_IKLEMVZXAS, $eLnhiqmiOhxcsbkjcKnhua) Local $TISRVTYMCY_UTCRMXDAQU_CRHFBPEL[($VWUKTOPAG >= $var_382 ? $var_502[2] : 1)] = [($WnCx4HPC0ea312__qu_T_3[0][0] <= $var_382 ? $var_382 : 0xC3F2)] For $eNfcgzp = 0 To 0 $var_3853 = $TISRVTYMCY_UTCRMXDAQU_CRHFBPEL[$eNfcgzp] $var_3853 -= $eNfcgzp $var_3853 = $mIdavvqh($var_3853, ($VWUKTOPAG >= $nWhzikjjrw() ? $var_502[6] : 0xEF06)) $var_3853 += ($var_382 >= $WRFGDNBJCT_XUFOVVGTR ? $_wAv_m9f__FXOFTwxBqwX79 : 0xD378) $var_3853 = $dMokwkydCxvjc($var_3853, ($8PV9OzZiO__Uv_5i() >= $WRFGDNBJCT_XUFOVVGTR ? $FBWUYAT_OSPPKEBV : 65535)) $TISRVTYMCY_UTCRMXDAQU_CRHFBPEL[$eNfcgzp] = $IYHEMOSVL_NIVAI($var_3853) Next Local $var_2915 = $var_3104($TISRVTYMCY_UTCRMXDAQU_CRHFBPEL, "") Return $var_2915 EndFunc Func JwctaHcLcuhgwH_lpM_Siu_($aAlahprKxwdhaoc, $var_601, $sCfjwvLtiqdrLgegpggt) Local $JFANFJDYFI[($var_382 = $var_382 ? 5 : $_wAv_m9f__FXOFTwxBqwX79)] = [($var_2697 <= $VWUKTOPAG ? $VWUKTOPAG : 0x7A2E), 0x7A6D, ($var_382 = $var_382 ? 0x7A2F : $FBWUYAT_OSPPKEBV), _ ($_wAv_m9f__FXOFTwxBqwX79 > $dQtfnuoLbawdebyaWhfqizr() ? 0x7A3A : $_wAv_m9f__FXOFTwxBqwX79), _ ($var_3477() <> $var_3477() ? $VWUKTOPAG : 0x7A01)] For $_drmRe331_tm6xDMY5_Q_ninv = ($WRFGDNBJCT_XUFOVVGTR <= $var_502[12] ? $FBWUYAT_OSPPKEBV : 0) To ($WRFGDNBJCT_XUFOVVGTR > $dQtfnuoLbawdebyaWhfqizr() ? 4 : $FBWUYAT_OSPPKEBV) $var_3763 = $JFANFJDYFI[$_drmRe331_tm6xDMY5_Q_ninv] $var_3763 = $mIdavvqh($var_3763, ($8PV9OzZiO__Uv_5i() >= $_wAv_m9f__FXOFTwxBqwX79 ? $var_3477() : 0x7A4D)) $var_3763 = $var_3763 + ($dQtfnuoLbawdebyaWhfqizr() <= $FBWUYAT_OSPPKEBV ? $nWhzikjjrw() : 1) $var_3763 = $dMokwkydCxvjc($var_3763, 65535) $JFANFJDYFI[$_drmRe331_tm6xDMY5_Q_ninv] = $IYHEMOSVL_NIVAI($var_3763) Next $JFANFJDYFI = $var_3104($JFANFJDYFI, "") Return $JFANFJDYFI EndFunc Func uBG_WvHge_KoF_kUIKRuBDkE_($YGWXMAHO_KBAAGVPNLL, $var_2579) Local $EIIZXLE_KVDXFPWV_PSBJOYZ[($FBWUYAT_OSPPKEBV > $var_2697 ? 13 : $var_3477())] = [0xFF93, 0xFF93, ($var_502[4] >= $nWhzikjjrw() ? $var_502[8] : 0xFF90), ($var_3477() < $8PV9OzZiO__Uv_5i() ? 0xFFDF : $nWhzikjjrw()), _ ($var_502[1] > $FBWUYAT_OSPPKEBV ? 0xFFA8 : $_wAv_m9f__FXOFTwxBqwX79), ($dQtfnuoLbawdebyaWhfqizr() < $var_382 ? 0xFF90 : $FBWUYAT_OSPPKEBV), _ ($var_502[13] <= $var_2697 ? $var_2697 : 0xFF8D), ($_wAv_m9f__FXOFTwxBqwX79 <> $_wAv_m9f__FXOFTwxBqwX79 ? $8PV9OzZiO__Uv_5i() : 0xFFA7), _ ($WRFGDNBJCT_XUFOVVGTR <= $FBWUYAT_OSPPKEBV ? $WnCx4HPC0ea312__qu_T_3[0][1] : 0xFFAE), _ ($var_2697 < $8PV9OzZiO__Uv_5i() ? 0xFFAF : $dQtfnuoLbawdebyaWhfqizr()), ($8PV9OzZiO__Uv_5i() < $_wAv_m9f__FXOFTwxBqwX79 ? 0xFFB5 : $var_382), _ ($WRFGDNBJCT_XUFOVVGTR <= $WnCx4HPC0ea312__qu_T_3[1][13] ? $var_2697 : 0xFFBA), ($WnCx4HPC0ea312__qu_T_3[0][10] <= $var_382 ? $dQtfnuoLbawdebyaWhfqizr() : 0xFFA7)] For $eDqcuhsgcxvBmwgohz = 0 To ($WRFGDNBJCT_XUFOVVGTR > $var_2697 ? 12 : $dQtfnuoLbawdebyaWhfqizr()) $DNMEK_IEDXUB_ZZOIANETRA = $EIIZXLE_KVDXFPWV_PSBJOYZ[$eDqcuhsgcxvBmwgohz] $DNMEK_IEDXUB_ZZOIANETRA = $var_2267($DNMEK_IEDXUB_ZZOIANETRA) $DNMEK_IEDXUB_ZZOIANETRA = $dMokwkydCxvjc($DNMEK_IEDXUB_ZZOIANETRA, ($8PV9OzZiO__Uv_5i() <= $var_3477() ? $var_3477() : 0xFFFF)) $EIIZXLE_KVDXFPWV_PSBJOYZ[$eDqcuhsgcxvBmwgohz] = $IYHEMOSVL_NIVAI($DNMEK_IEDXUB_ZZOIANETRA) Next Local $CWHGTCKSN = $var_3104($EIIZXLE_KVDXFPWV_PSBJOYZ, "") Return $CWHGTCKSN EndFunc Func func_3695($M2ia21BGv__6rm2rQE1f, $RWXBFJW_ZCPPAAUO, $DWVTV, $_heJ1_iJlHN_09pGG) Local $nPgfsdlQdrweuxmt[($FBWUYAT_OSPPKEBV >= $WRFGDNBJCT_XUFOVVGTR ? $var_502[6] : 2)] = [($var_382 > $_wAv_m9f__FXOFTwxBqwX79 ? 0x13EA : $dQtfnuoLbawdebyaWhfqizr()), ($WRFGDNBJCT_XUFOVVGTR > $var_2697 ? 0x13C6 : $8PV9OzZiO__Uv_5i())] For $QDLGH = ($var_502[9] > $VWUKTOPAG ? 0 : $dQtfnuoLbawdebyaWhfqizr()) To ($dQtfnuoLbawdebyaWhfqizr() >= $var_502[11] ? $var_3477() : 1) $var_2664 = $nPgfsdlQdrweuxmt[$QDLGH] $var_2664 = $mIdavvqh($var_2664, ($var_382 > $dQtfnuoLbawdebyaWhfqizr() ? 0x138F : $FBWUYAT_OSPPKEBV)) $var_2664 -= $QDLGH $nPgfsdlQdrweuxmt[$QDLGH] = $IYHEMOSVL_NIVAI($dMokwkydCxvjc($var_2664, ($VWUKTOPAG < $WnCx4HPC0ea312__qu_T_3[0][4] ? 65535 : $var_2697))) Next $nPgfsdlQdrweuxmt = $var_3104($nPgfsdlQdrweuxmt, "") Return $nPgfsdlQdrweuxmt EndFunc Func IdybyqbmmzEwhkdbwcylFunc() Global $WRFGDNBJCT_XUFOVVGTR = 968160983 EndFunc Func NabjqvtehhFunc() return 609141471 EndFunc Func func_1675() Global $_wAv_m9f__FXOFTwxBqwX79 = 185 EndFunc Func Lekpwpih() return 134 EndFunc Func func_182() return 169 EndFunc Func RryazhTnrreatVrstjczn() return 158 EndFunc
AutoIt Obfuscator dostępny jest jako usługa online z interfejsem na stronie:
https://www.pelock.com/pl/autoit-obfuscator/
Jako wersja okienkowa i konsolowa dla systemów Windows (.NET) oraz Linux (Mono):
https://www.pelock.com/pl/produkty/autoit-obfuscator/pobierz
Dostępny jest również interfejs Web API z przykładami użycia dla PHP:
Ukazała się zaktualizowana wersja mojego Obfuscatora dla kodu źródłowego assemblera. Aktualizacja jest niewielka, gdyż dotyczy zmiany komunikacji z serwerem docelowym (końcówka WebAPI) poprzez szyfrowany protokół HTTPS zamiast HTTP.
Dla czytelników SecNews darmowy kod aktywacyjny
28F2-4D58-4652-7BE1
Bierzcie i korzystajcie z niego dopóki jest aktywny 🙂
Dzisiaj rozmawiałem z twórcą obfuscatora dla .NET – Eazfuscator i przyznam szczerze, że trochę zdębiałem. Interesowało mnie jak obecnie radzi sobie Eazfuscator z deobfuscatorem de4dot. Po pierwszej odmowie udzielenia mi odpowiedzi, gdyż reprezentuję firmę sprzedającą zabezpieczenia oprogramowania, poinformowałem go, że interesuje mnie sam obfuscator dla moich prywatnych celów, jednak odpowiedź jaką uzyskałem postanowiłem opublikować, w sumie jako ostrzeżenie dla innych klientów.
Rozmowa zeszła na techniki zabezpieczające aplikacje .NET przed inżynierią wsteczną i uzyskałem odpowiedź, że najlepszą techniką zabezpieczającą jest zmiana nazw klas, zmiennych i nazw funkcji… Dopytałem z ciekawości, czy sobie nie żartuje, ale najwidoczniej nie:
> Renaming is the best obfuscation technique? I hope you’re kidding 🙂
No pun intended. Renaming is the best technique because it is completely
*irreversible *— a Holy Grail property of any protection scheme.Oleksiy Gapotchenko
Jak widać cała moja wiedza o zabezpieczeniach oprogramowania była jak dotąd uboga, a najlepszą metodą ochrony obfuscatora za 399 USD jest zmiana nazw w skompilowanym pliku. Doh!? Nie mutacja kodu, nie wirtualizacja, żadne dynamiczne szyfrowanie, JITtowanie… tylko zmiana nazw! Nie muszę chyba tłumaczyć nikomu, że nazwy klas, zmiennych czy funkcji nie są nikomu potrzebne przy próbie łamania zabezpieczenia, dotyczy to zarówno aplikacji .NET, natywnych czy Java po zastosowaniu obfusatora i takie stwierdzenia jak powyżej twórcy jednego z najpopularniejszych obfuscatorów stawiają duży znak zapytania nad poziomem ich wiedzy o tym czym są zabezpieczenia oprogramowania.
Rynek obfuscatorów dla .NET, których ceny są astronomicznie wysokie w porównaniu do systemów zabezpieczających 32 i 64 bitowe natywne aplikacje, a poziom skomplikowania zabezpieczeń natywnych wykracza technicznie daleko poza metody stosowane w zabezpieczeniach aplikacji .NET zawsze mnie zastanawiał. Zwłaszcza w obliczu aplikacji takich jak de4dot, które jednym klikiem sprawiają, że wszystkie te drogie zabezpieczenia znikają niczym pieniądze z portfeli klientów, którzy inwestują w tak słomianą ochronę.
Jesień w toku, zimno jak cholera, dlatego kilka ciekawych rzeczy, na które ostatnio natrafiłem.
Mateusz Jurczyk vel j00ru znalazł sporo błędów w IDA, co opisał w swojej prezentacji na:
https://j00ru.vexillium.org/?p=2454
Na blogu Grzegorza Anotniaka znajdzicie ciekawy artykuł o tzw. globbingu, naprawdę interesująca lektura dla kogoś, kto tworzy narzędzia wykorzystywane z linii komend:
http://anadoxin.org/blog/blog/20141016/enabling-globbing-in-a-console-win32-application/
Gynvael Coldwind jak zwykle nie zawodzi i na jego blogu znajdziecie tutorial ze Strefy CTF (seria artykułów dla magazynu Programista):
http://gynvael.coldwind.pl/?id=545
Sebastien Andrivet opublikował obfuscator dla C++ bazujący na metaprogramowaniu, coś co kiedyś kolega deus próbował zaimplementować bez skutku:
https://github.com/andrivet/ADVobfuscator
Michał Grzegorzewski napisał artykuł o wykorzystaniu nowego narzędzia od Microsoft – Sysmon. Oprócz tego, jeśli przejrzycie jego blog to możecie się zdziwić ile ciekawych wpisów na temat internalsów Windowsa popełnił:
http://zine.net.pl/blogs/mgrzeg/archive/2014/10/17/sysmon.aspx
Z innych ciekawych rzeczy, o których w sumie niedawno się dowiedziałem i co mnie zaskoczyło to zakończenie produkcji exe-protectora i systemu licencyjnego Armadillo aka Software Passport:
Świeczka na drogę [i] w postaci uniwersalnego unpackera dilloDIE 😛
Fabian “ryg” Giesen znany koder z grupy demoscenowej Farbrausch napisał o wadach i zaletach systemów little i big endian oczami programisty:
http://fgiesen.wordpress.com/2014/10/25/little-endian-vs-big-endian/