Przez ostatni miesiąc pracowałem nad projektem obfuscatora dla języka skryptowego AutoIt i z przyjemnością prezentuję pierwsze wydanie AutoIt Obfuscatora.
Co to jest AutoIt?
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.
Dekompilacja AutoIt
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.
Obfuskacja kodu AutoIt
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
Wersja online, okienkowa, konsolowa i Web API
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:
po co upubliczniać takie narzędzia?
żeby script kiddies miały łatwiej?
@michal: my otwieramy oczy niedowiarkom. Patrzcie – mówimy – to nasze, przez nas wykonane i to nie jest nasze ostatnie słowo i nikt nie ma prawa się przyczepić! 😛
dopasowywanie ikonków do strategii musiało być nietrywialnym zadaniem
@yeb: zajęło to najwięcej czasu z całego projektu 🙂