fix: No need to restart client to update wallet address
This commit is contained in:
139
common/obfs.h
139
common/obfs.h
@@ -5,89 +5,98 @@
|
||||
#include <stddef.h>
|
||||
#pragma once
|
||||
|
||||
class ObfsBase {
|
||||
class ObfsBase
|
||||
{
|
||||
public:
|
||||
bool m_bGenCArray;
|
||||
ObfsBase(bool genCArray = true) : m_bGenCArray(genCArray) { }
|
||||
virtual ~ObfsBase() { }
|
||||
bool m_bGenCArray;
|
||||
ObfsBase(bool genCArray = true) : m_bGenCArray(genCArray) { }
|
||||
virtual ~ObfsBase() { }
|
||||
|
||||
// <20>Գƻ<D4B3><C6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC>ܺͽ<DCBA><CDBD><EFBFBD>
|
||||
virtual void ObfuscateBuffer(uint8_t* buf, size_t len, uint32_t seed) {}
|
||||
// <20>Գƻ<D4B3><C6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC>ܺͽ<DCBA><CDBD><EFBFBD>
|
||||
virtual void ObfuscateBuffer(uint8_t* buf, size_t len, uint32_t seed) {}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>෴
|
||||
virtual void DeobfuscateBuffer(uint8_t* buf, size_t len, uint32_t seed) {}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>෴
|
||||
virtual void DeobfuscateBuffer(uint8_t* buf, size_t len, uint32_t seed) {}
|
||||
|
||||
virtual bool WriteFile(const char* filename, uint8_t* data, size_t length, const char* arrayName) {
|
||||
return m_bGenCArray ? WriteBinaryAsCArray(filename, data, length, arrayName) : WriteBinaryFile(filename, data, length);
|
||||
}
|
||||
virtual bool WriteFile(const char* filename, uint8_t* data, size_t length, const char* arrayName)
|
||||
{
|
||||
return m_bGenCArray ? WriteBinaryAsCArray(filename, data, length, arrayName) : WriteBinaryFile(filename, data, length);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> C <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽд<CABD><D0B4><EFBFBD>ļ<EFBFBD>
|
||||
virtual bool WriteBinaryAsCArray(const char* filename, uint8_t* data, size_t length, const char* arrayName) {
|
||||
FILE* file = fopen(filename, "w");
|
||||
if (!file) return false;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> C <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽд<CABD><D0B4><EFBFBD>ļ<EFBFBD>
|
||||
virtual bool WriteBinaryAsCArray(const char* filename, uint8_t* data, size_t length, const char* arrayName)
|
||||
{
|
||||
FILE* file = fopen(filename, "w");
|
||||
if (!file) return false;
|
||||
|
||||
fprintf(file, "unsigned char %s[] = {\n", arrayName);
|
||||
for (size_t i = 0; i < length; ++i) {
|
||||
if (i % 24 == 0) fprintf(file, " ");
|
||||
fprintf(file, "0x%02X", data[i]);
|
||||
if (i != length - 1) fprintf(file, ",");
|
||||
if ((i + 1) % 24 == 0 || i == length - 1) fprintf(file, "\n");
|
||||
else fprintf(file, " ");
|
||||
}
|
||||
fprintf(file, "};\n");
|
||||
fprintf(file, "unsigned int %s_len = %zu;\n", arrayName, length);
|
||||
fprintf(file, "unsigned char %s[] = {\n", arrayName);
|
||||
for (size_t i = 0; i < length; ++i) {
|
||||
if (i % 24 == 0) fprintf(file, " ");
|
||||
fprintf(file, "0x%02X", data[i]);
|
||||
if (i != length - 1) fprintf(file, ",");
|
||||
if ((i + 1) % 24 == 0 || i == length - 1) fprintf(file, "\n");
|
||||
else fprintf(file, " ");
|
||||
}
|
||||
fprintf(file, "};\n");
|
||||
fprintf(file, "unsigned int %s_len = %zu;\n", arrayName, length);
|
||||
|
||||
fclose(file);
|
||||
return true;
|
||||
}
|
||||
fclose(file);
|
||||
return true;
|
||||
}
|
||||
|
||||
// ʹ<><CAB9> "wb" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ģʽ
|
||||
virtual bool WriteBinaryFile(const char* filename, const uint8_t* data, size_t length) {
|
||||
FILE* file = fopen(filename, "wb");
|
||||
if (!file) return false;
|
||||
// ʹ<><CAB9> "wb" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ģʽ
|
||||
virtual bool WriteBinaryFile(const char* filename, const uint8_t* data, size_t length)
|
||||
{
|
||||
FILE* file = fopen(filename, "wb");
|
||||
if (!file) return false;
|
||||
|
||||
size_t written = fwrite(data, 1, length, file);
|
||||
fclose(file);
|
||||
size_t written = fwrite(data, 1, length, file);
|
||||
fclose(file);
|
||||
|
||||
return written == length;
|
||||
}
|
||||
return written == length;
|
||||
}
|
||||
};
|
||||
|
||||
class Obfs : public ObfsBase {
|
||||
class Obfs : public ObfsBase
|
||||
{
|
||||
private:
|
||||
// <20><><EFBFBD><EFBFBD>8λ<38><CEBB><EFBFBD><EFBFBD>
|
||||
static inline uint8_t rol8(uint8_t val, int shift) {
|
||||
return (val << shift) | (val >> (8 - shift));
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD>8λ<38><CEBB><EFBFBD><EFBFBD>
|
||||
static inline uint8_t rol8(uint8_t val, int shift)
|
||||
{
|
||||
return (val << shift) | (val >> (8 - shift));
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>8λ<38><CEBB><EFBFBD><EFBFBD>
|
||||
static inline uint8_t ror8(uint8_t val, int shift) {
|
||||
return (val >> shift) | (val << (8 - shift));
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD>8λ<38><CEBB><EFBFBD><EFBFBD>
|
||||
static inline uint8_t ror8(uint8_t val, int shift)
|
||||
{
|
||||
return (val >> shift) | (val << (8 - shift));
|
||||
}
|
||||
|
||||
public:
|
||||
Obfs(bool genCArray = true) : ObfsBase(genCArray) { }
|
||||
Obfs(bool genCArray = true) : ObfsBase(genCArray) { }
|
||||
|
||||
// <20>Գƻ<D4B3><C6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC>ܺͽ<DCBA><CDBD><EFBFBD>
|
||||
virtual void ObfuscateBuffer(uint8_t* buf, size_t len, uint32_t seed) {
|
||||
uint32_t state = seed;
|
||||
// <20>Գƻ<D4B3><C6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC>ܺͽ<DCBA><CDBD><EFBFBD>
|
||||
virtual void ObfuscateBuffer(uint8_t* buf, size_t len, uint32_t seed)
|
||||
{
|
||||
uint32_t state = seed;
|
||||
|
||||
for (size_t i = 0; i < len; ++i) {
|
||||
uint8_t mask = (uint8_t)((state >> 16) & 0xFF);
|
||||
buf[i] = rol8(buf[i] ^ mask, 3); // <20><><EFBFBD><EFBFBD>+<2B><>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
state = state * 2654435761u + buf[i]; // LCG + <20><><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD>
|
||||
}
|
||||
}
|
||||
for (size_t i = 0; i < len; ++i) {
|
||||
uint8_t mask = (uint8_t)((state >> 16) & 0xFF);
|
||||
buf[i] = rol8(buf[i] ^ mask, 3); // <20><><EFBFBD><EFBFBD>+<2B><>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
state = state * 2654435761u + buf[i]; // LCG + <20><><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD>
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>෴
|
||||
virtual void DeobfuscateBuffer(uint8_t* buf, size_t len, uint32_t seed) {
|
||||
uint32_t state = seed;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>෴
|
||||
virtual void DeobfuscateBuffer(uint8_t* buf, size_t len, uint32_t seed)
|
||||
{
|
||||
uint32_t state = seed;
|
||||
|
||||
for (size_t i = 0; i < len; ++i) {
|
||||
uint8_t mask = (uint8_t)((state >> 16) & 0xFF);
|
||||
uint8_t orig = buf[i];
|
||||
buf[i] = ror8(buf[i], 3) ^ mask;
|
||||
state = state * 2654435761u + orig; // <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ǰ<EFBFBD><C7B0>ԭ<EFBFBD>ֽڸ<D6BD><DAB8><EFBFBD> state
|
||||
}
|
||||
}
|
||||
for (size_t i = 0; i < len; ++i) {
|
||||
uint8_t mask = (uint8_t)((state >> 16) & 0xFF);
|
||||
uint8_t orig = buf[i];
|
||||
buf[i] = ror8(buf[i], 3) ^ mask;
|
||||
state = state * 2654435761u + orig; // <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ǰ<EFBFBD><C7B0>ԭ<EFBFBD>ֽڸ<D6BD><DAB8><EFBFBD> state
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user