#include <string>
#include <zlib.h>
#include <iostream>
#include <fstream>
#include <sstream>
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
void bdecrypt(uint8_t *buffer, int len, uint64_t k)
{
uint32_t const key[4] = {(uint32_t)(k >> 32), (uint32_t)(k & 0xFFFFFFFF), 0xDEADDEAD, 0xB00BEEEF};
uint32_t y, z, sum;
uint32_t *v = (uint32_t *) buffer;
unsigned p, rounds, e;
int n = (len - len % 4) / 4;
if (n < 2) {
return;
}
rounds = 6 + 52 / n;
sum = rounds * DELTA;
y = v[0];
do {
e = (sum >> 2) & 3;
for (p = n - 1; p > 0; p--) {
z = v[p - 1];
y = v[p] -= MX;
}
z = v[n - 1];
y = v[0] -= MX;
sum -= DELTA;
} while (--rounds);
}
int m_customEncryption = 0;
bool decryptBuffer(std::string &buffer)
{
if (buffer.size() < 5) {
return true;
}
if (buffer.substr(0, 4).compare("ENC3") != 0) {
return false;
}
uint64_t key = *(uint64_t * ) & buffer[4];
uint32_t compressed_size = *(uint32_t * ) & buffer[12];
uint32_t size = *(uint32_t * ) & buffer[16];
uint32_t adler = *(uint32_t * ) & buffer[20];
if (compressed_size < buffer.size() - 24) {
return false;
}
bdecrypt((uint8_t * ) & buffer[24], compressed_size, key);
std::string new_buffer;
new_buffer.resize(size);
unsigned long new_buffer_size = new_buffer.size();
if (uncompress((uint8_t *) new_buffer.data(), &new_buffer_size, (uint8_t * ) & buffer[24], compressed_size)
!= Z_OK) {
return false;
}
buffer = new_buffer;
return true;
}
int main()
{
std::string data("");
std::ifstream t("/bin/init.lua");
std::stringstream buffer;
buffer << t.rdbuf();
data = buffer.str();
if (decryptBuffer(data)) {
std::cout << "WORKED" << std::endl;
std::cout << data << std::endl;
} else {
std::cout << "FAILED" << std::endl;
}
return 0;
}