From bdb6ac5f940008bcd836e3c5f0a708f4b8f04865 Mon Sep 17 00:00:00 2001 From: boris Date: Sat, 29 Dec 2018 20:59:57 +1300 Subject: protection shit --- csgo-loader/csgo-client/Security/Encryption.cpp | 174 +++++++++++++++--------- 1 file changed, 111 insertions(+), 63 deletions(-) (limited to 'csgo-loader/csgo-client/Security/Encryption.cpp') diff --git a/csgo-loader/csgo-client/Security/Encryption.cpp b/csgo-loader/csgo-client/Security/Encryption.cpp index 4d42ee7..460bda9 100644 --- a/csgo-loader/csgo-client/Security/Encryption.cpp +++ b/csgo-loader/csgo-client/Security/Encryption.cpp @@ -1,4 +1,6 @@ #include +#include +#include #define FE(x) (((x) << 1) ^ ((((x)>>7) & 1) * 0x1b)) #define FD(x) (((x) >> 1) ^ (((x) & 1) ? 0x8d : 0)) @@ -98,17 +100,25 @@ namespace Wrapper { } +#pragma optimize("", off) + ByteArray::size_type Aes256::encrypt(const ByteArray& key, const ByteArray& plain, ByteArray& encrypted) { Aes256 aes(key); + WRAP_IF_RELEASE(VM_FISH_BLACK_START); + aes.encrypt_start(plain.size(), encrypted); aes.encrypt_continue(plain, encrypted); aes.encrypt_end(encrypted); + WRAP_IF_RELEASE(VM_FISH_BLACK_END); + return encrypted.size(); } +#pragma optimize("", on) + ByteArray::size_type Aes256::encrypt(const ByteArray& key, const unsigned char* plain, const ByteArray::size_type plain_length, ByteArray& encrypted) { Aes256 aes(key); @@ -120,17 +130,25 @@ namespace Wrapper return encrypted.size(); } +#pragma optimize("", off) + ByteArray::size_type Aes256::decrypt(const ByteArray& key, const ByteArray& encrypted, ByteArray& plain) { Aes256 aes(key); + WRAP_IF_RELEASE(VM_FISH_BLACK_START); + aes.decrypt_start(encrypted.size()); aes.decrypt_continue(encrypted, plain); aes.decrypt_end(plain); + WRAP_IF_RELEASE(VM_FISH_BLACK_END); + return plain.size(); } +#pragma optimize("", on) + ByteArray::size_type Aes256::decrypt(const ByteArray& key, const unsigned char* encrypted, const ByteArray::size_type encrypted_length, ByteArray& plain) { Aes256 aes(key); @@ -236,10 +254,14 @@ namespace Wrapper return encrypted.size(); } +#pragma optimize("", off) + void Aes256::encrypt(unsigned char* buffer) { unsigned char i, rcon; + WRAP_IF_RELEASE(VM_SHARK_BLACK_START); + copy_key(); add_round_key(buffer, 0); for(i = 1, rcon = 1; i < NUM_ROUNDS; ++i) @@ -255,8 +277,12 @@ namespace Wrapper shift_rows(buffer); expand_enc_key(&rcon); add_round_key(buffer, i); + + WRAP_IF_RELEASE(VM_SHARK_BLACK_END); } +#pragma optimize("", on) + ByteArray::size_type Aes256::decrypt_start(const ByteArray::size_type encrypted_length) { unsigned char j; @@ -344,10 +370,14 @@ namespace Wrapper return plain.size(); } +#pragma optimize("", off) + void Aes256::decrypt(unsigned char* buffer) { unsigned char i, rcon = 1; + WRAP_IF_RELEASE(VM_SHARK_BLACK_START); + copy_key(); for(i = NUM_ROUNDS / 2; i > 0; --i) expand_enc_key(&rcon); @@ -366,12 +396,19 @@ namespace Wrapper sub_bytes_inv(buffer); } add_round_key(buffer, i); + + WRAP_IF_RELEASE(VM_SHARK_BLACK_END); } +#pragma optimize("", on) + +#pragma optimize("", off) void Aes256::expand_enc_key(unsigned char* rc) { unsigned char i; + WRAP_IF_RELEASE(MUTATE_START); + m_rkey[0] = m_rkey[0] ^ sbox[m_rkey[29]] ^ (*rc); m_rkey[1] = m_rkey[1] ^ sbox[m_rkey[30]]; m_rkey[2] = m_rkey[2] ^ sbox[m_rkey[31]]; @@ -380,7 +417,7 @@ namespace Wrapper for(i = 4; i < 16; i += 4) { - m_rkey[i] = m_rkey[i] ^ m_rkey[i - 4]; + m_rkey[i] = m_rkey[i] ^ m_rkey[i - 4]; m_rkey[i + 1] = m_rkey[i + 1] ^ m_rkey[i - 3]; m_rkey[i + 2] = m_rkey[i + 2] ^ m_rkey[i - 2]; m_rkey[i + 3] = m_rkey[i + 3] ^ m_rkey[i - 1]; @@ -397,12 +434,20 @@ namespace Wrapper m_rkey[i + 2] = m_rkey[i + 2] ^ m_rkey[i - 2]; m_rkey[i + 3] = m_rkey[i + 3] ^ m_rkey[i - 1]; } + + WRAP_IF_RELEASE(MUTATE_END); } +#pragma optimize("", on) + +#pragma optimize("", off) + void Aes256::expand_dec_key(unsigned char* rc) { unsigned char i; + WRAP_IF_RELEASE(MUTATE_START); + for(i = 28; i > 16; i -= 4) { m_rkey[i + 0] = m_rkey[i + 0] ^ m_rkey[i - 4]; @@ -429,8 +474,12 @@ namespace Wrapper m_rkey[1] = m_rkey[1] ^ sbox[m_rkey[30]]; m_rkey[2] = m_rkey[2] ^ sbox[m_rkey[31]]; m_rkey[3] = m_rkey[3] ^ sbox[m_rkey[28]]; + + WRAP_IF_RELEASE(MUTATE_END); } +#pragma optimize("", on) + void Aes256::sub_bytes(unsigned char* buffer) { unsigned char i = KEY_SIZE / 2; @@ -465,60 +514,80 @@ namespace Wrapper buffer[i] ^= m_rkey[(round & 1) ? i + 16 : i]; } +#pragma optimize("", off) + void Aes256::shift_rows(unsigned char* buffer) { unsigned char i, j, k, l; /* to make it potentially parallelable :) */ - i = buffer[1]; - buffer[1] = buffer[5]; - buffer[5] = buffer[9]; - buffer[9] = buffer[13]; + WRAP_IF_RELEASE(MUTATE_START); + + i = buffer[1]; + buffer[1] = buffer[5]; + buffer[5] = buffer[9]; + buffer[9] = buffer[13]; buffer[13] = i; - j = buffer[10]; + j = buffer[10]; buffer[10] = buffer[2]; - buffer[2] = j; + buffer[2] = j; - k = buffer[3]; - buffer[3] = buffer[15]; + k = buffer[3]; + buffer[3] = buffer[15]; buffer[15] = buffer[11]; buffer[11] = buffer[7]; - buffer[7] = k; + buffer[7] = k; - l = buffer[14]; + l = buffer[14]; buffer[14] = buffer[6]; - buffer[6] = l; + buffer[6] = l; + + WRAP_IF_RELEASE(MUTATE_END); } +#pragma optimize("", on) + +#pragma optimize("", off) + void Aes256::shift_rows_inv(unsigned char* buffer) { unsigned char i, j, k, l; /* same as above :) */ - i = buffer[1]; - buffer[1] = buffer[13]; + WRAP_IF_RELEASE(MUTATE_START); + + i = buffer[1]; + buffer[1] = buffer[13]; buffer[13] = buffer[9]; - buffer[9] = buffer[5]; - buffer[5] = i; + buffer[9] = buffer[5]; + buffer[5] = i; - j = buffer[2]; - buffer[2] = buffer[10]; + j = buffer[2]; + buffer[2] = buffer[10]; buffer[10] = j; - k = buffer[3]; - buffer[3] = buffer[7]; - buffer[7] = buffer[11]; + k = buffer[3]; + buffer[3] = buffer[7]; + buffer[7] = buffer[11]; buffer[11] = buffer[15]; buffer[15] = k; - l = buffer[6]; - buffer[6] = buffer[14]; + l = buffer[6]; + buffer[6] = buffer[14]; buffer[14] = l; + + WRAP_IF_RELEASE(MUTATE_END); } +#pragma optimize("", on) + +#pragma optimize("", off) + void Aes256::mix_columns(unsigned char* buffer) { unsigned char i, a, b, c, d, e; + WRAP_IF_RELEASE(VM_FISH_BLACK_START); + for(i = 0; i < 16; i += 4) { a = buffer[i]; @@ -533,12 +602,21 @@ namespace Wrapper buffer[i + 2] ^= e ^ rj_xtime(c^d); buffer[i + 3] ^= e ^ rj_xtime(d^a); } + + WRAP_IF_RELEASE(VM_FISH_BLACK_END); } +#pragma optimize("", on) + + +#pragma optimize("", off) + void Aes256::mix_columns_inv(unsigned char* buffer) { unsigned char i, a, b, c, d, e, x, y, z; + WRAP_IF_RELEASE(VM_FISH_BLACK_START); + for(i = 0; i < 16; i += 4) { a = buffer[i]; @@ -555,58 +633,28 @@ namespace Wrapper buffer[i + 2] ^= x ^ rj_xtime(c^d); buffer[i + 3] ^= y ^ rj_xtime(d^a); } + + WRAP_IF_RELEASE(VM_FISH_BLACK_END); } +#pragma optimize("", on) + inline unsigned char rj_xtime(unsigned char x) { return (x & 0x80) ? ((x << 1) ^ 0x1b) : (x << 1); } // Wrapper for the AES256 encryption algorithm. - void Encryption::Start() - { - // Create cryptographic context. - if(!CryptAcquireContextA(&m_CryptProvider, nullptr, nullptr, PROV_RSA_AES, 0)) - { - if(!CryptAcquireContextA(&m_CryptProvider, nullptr, nullptr, PROV_RSA_AES, CRYPT_NEWKEYSET)) - { - printf("Failed to initialise encryption provider.\n"); - return; - } - } - - uint8_t RandomBytes[32]; - uint32_t RandomBytesCount = sizeof RandomBytes; - - // Generate random bytes to use as encryption key. - if(CryptGenRandom(m_CryptProvider, RandomBytesCount, RandomBytes)) - { - m_EncryptionKey.reserve(RandomBytesCount); - m_EncryptionKey.insert( - m_EncryptionKey.begin(), - RandomBytes, - RandomBytes + RandomBytesCount - ); - } - - // Release context. - if(m_CryptProvider) - CryptReleaseContext(m_CryptProvider, 0); - } + void Encryption::Start() { ERROR_ASSERT("[000F:00001A00] Failed to initialize. Please contact an administrator."); } void Encryption::Start(ByteArray &EncryptionKey) { - // If an encryption key is provided, initialise the wrapper with - // the passed parameter. - if(!EncryptionKey.empty()) - { - m_EncryptionKey.reserve(EncryptionKey.size()); - std::copy(EncryptionKey.begin(), EncryptionKey.end(), m_EncryptionKey.begin()); - } - else - { + // The client can only be initialized with an existing key. + if(EncryptionKey.empty()) Start(); - } + + m_EncryptionKey.reserve(EncryptionKey.size()); + std::copy(EncryptionKey.begin(), EncryptionKey.end(), m_EncryptionKey.begin()); } ByteArray Encryption::Encrypt(ByteArray &Data) -- cgit v1.2.3