Add encrypt and decrypt functions

This commit is contained in:
yuanyuanxiang
2025-07-10 04:29:40 +08:00
parent 522e083d97
commit e4a1692a39
3 changed files with 148 additions and 16 deletions

131
common/encfuncs.h Normal file
View File

@@ -0,0 +1,131 @@
#pragma once
// <20><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD>
inline void encrypt_v1(unsigned char* data, size_t length, unsigned char key) {
for (size_t i = 0; i < length; i++) {
if (i % 2 == 0) {
data[i] = data[i] + key; // ż<><C5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> key
}
else {
data[i] = data[i] - key; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> key
}
}
}
// <20><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD>
inline void decrypt_v1(unsigned char* data, size_t length, unsigned char key) {
for (size_t i = 0; i < length; i++) {
if (i % 2 == 0) {
data[i] = data[i] - key; // ż<><C5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> key <20><>ԭ
}
else {
data[i] = data[i] + key; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> key <20><>ԭ
}
}
}
// <20><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD> - ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ת
inline void encrypt_v2(unsigned char* data, size_t length, unsigned char key) {
for (size_t i = 0; i < length; i++) {
// ż<><C5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>key<65><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>λ1λ
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>key<65><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>λ1λ
data[i] ^= key;
if (i % 2 == 0) {
data[i] = (data[i] << 1) | (data[i] >> 7); // <20><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>λ
}
else {
data[i] = (data[i] >> 1) | (data[i] << 7); // <20><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>λ
}
}
}
// <20><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD>
inline void decrypt_v2(unsigned char* data, size_t length, unsigned char key) {
for (size_t i = 0; i < length; i++) {
// <20><><EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (i % 2 == 0) {
data[i] = (data[i] >> 1) | (data[i] << 7); // <20><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ԭ
}
else {
data[i] = (data[i] << 1) | (data[i] >> 7); // <20><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ԭ
}
data[i] ^= key; // <20>ٴ<EFBFBD><D9B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ
}
}
// <20><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD> V3 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>key<65>Ķ<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>
inline void encrypt_v3(unsigned char* data, size_t length, unsigned char key) {
for (size_t i = 0; i < length; i++) {
unsigned char dynamic_key = key + (i % 8); // <20><>̬<EFBFBD><EFBFBD><E4BBAF>key<65><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (i % 3 == 0) {
data[i] = (data[i] + dynamic_key) ^ dynamic_key; // <20>ӷ<EFBFBD> + <20><><EFBFBD><EFBFBD>
}
else if (i % 3 == 1) {
data[i] = (data[i] ^ dynamic_key) - dynamic_key; // <20><><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD>
}
else {
data[i] = ~(data[i] + dynamic_key); // ȡ<><C8A1> + <20>ӷ<EFBFBD>
}
}
}
// <20><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD> V3
inline void decrypt_v3(unsigned char* data, size_t length, unsigned char key) {
for (size_t i = 0; i < length; i++) {
unsigned char dynamic_key = key + (i % 8);
if (i % 3 == 0) {
data[i] = (data[i] ^ dynamic_key) - dynamic_key; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ټ<EFBFBD>
}
else if (i % 3 == 1) {
data[i] = (data[i] + dynamic_key) ^ dynamic_key; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else {
data[i] = ~data[i] - dynamic_key; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ټ<EFBFBD>
}
}
}
// <20><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD> V4 - <20><><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline void encrypt_v4(unsigned char* data, size_t length, unsigned char key) {
unsigned char rand = key;
for (size_t i = 0; i < length; i++) {
rand = (rand * 13 + 17) % 256; // α<><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>LCG<43><47>
data[i] ^= rand; // <20><>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
// <20><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD> V4<56><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7>ԣ<EFBFBD>
inline void decrypt_v4(unsigned char* data, size_t length, unsigned char key) {
encrypt_v4(data, length, key); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵĽ<DCB5><C4BD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>һ<EFBFBD><D2BB>
}
// <20><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD> V5 - V5 <20><EFBFBD><E6B1BE><EFBFBD><EFBFBD>̬<EFBFBD><CCAC>Կ<EFBFBD><D4BF><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>
inline void encrypt_v5(unsigned char* data, size_t length, unsigned char key) {
for (size_t i = 0; i < length; i++) {
unsigned char dynamic_key = (key + i) ^ 0x55; // <20><>̬<EFBFBD><CCAC>Կ<EFBFBD><D4BF><EFBFBD><EFBFBD>
data[i] = ((data[i] + dynamic_key) ^ (dynamic_key << 3)) + (i % 7);
}
}
// <20><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD> V5
inline void decrypt_v5(unsigned char* data, size_t length, unsigned char key) {
for (size_t i = 0; i < length; i++) {
unsigned char dynamic_key = (key + i) ^ 0x55;
data[i] = (((data[i] - (i % 7)) ^ (dynamic_key << 3)) - dynamic_key);
}
}
// <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD> V6<56><36><EFBFBD>Է<EFBFBD><D4B7>ԣ<EFBFBD> - V6 <20><EFBFBD><E6B1BE>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20>Է<EFBFBD><D4B7>Խ<EFBFBD><D4BD>ܣ<EFBFBD>
inline void encrypt_v6(unsigned char* data, size_t length, unsigned char key) {
unsigned char rand = key;
for (size_t i = 0; i < length; i++) {
rand = (rand * 31 + 17) % 256; // <20><><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
data[i] ^= rand + i; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ̬
}
}
// <20><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD> V6<56><36>ֱ<EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD> encrypt_v6 <20><><EFBFBD>ɣ<EFBFBD>
inline void decrypt_v6(unsigned char* data, size_t length, unsigned char key) {
encrypt_v6(data, length, key); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
}

View File

@@ -2,20 +2,28 @@
// This file implements a serial of data header encoding methods.
#include <cstring>
#include <common/skCrypter.h>
#include "common/encfuncs.h"
#define MSG_HEADER "HELL"
enum HeaderEncType {
HeaderEncUnknown = -1,
HeaderEncNone,
HeaderEncV0,
HeaderEncV1,
HeaderEncV2,
HeaderEncV3,
HeaderEncV4,
HeaderEncV5,
HeaderEncV6,
HeaderEncNum,
};
// <20><><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6> + <20><><EFBFBD><EFBFBD><EFBFBD>󳤶<EFBFBD>(4<>ֽ<EFBFBD>) + <20><><EFBFBD><EFBFBD><EFBFBD>󳤶<EFBFBD>(4<>ֽ<EFBFBD>)
const int FLAG_COMPLEN = 4;
const int FLAG_LENGTH = 8;
const int HDR_LENGTH = FLAG_LENGTH + 2 * sizeof(unsigned int);
const int MIN_COMLEN = 8;
const int MIN_COMLEN = 12;
typedef void (*EncFun)(unsigned char* data, size_t length, unsigned char key);
typedef void (*DecFun)(unsigned char* data, size_t length, unsigned char key);
@@ -74,15 +82,8 @@ inline void decrypt(unsigned char* data, size_t length, unsigned char key) {
}
inline EncFun GetHeaderEncoder(HeaderEncType type) {
switch (type)
{
case HeaderEncNone:
return default_encrypt;
case HeaderEncV1:
return encrypt;
default:
return NULL;
}
static const DecFun methods[] = { default_encrypt, encrypt, encrypt_v1, encrypt_v2, encrypt_v3, encrypt_v4, encrypt_v5, encrypt_v6 };
return methods[type];
}
typedef struct HeaderFlag {
@@ -142,7 +143,7 @@ inline FlagType CheckHead(const char* flag, DecFun dec) {
else if (compare(flag, skCrypt("Shine"), 5, dec, 0) == 0) {
type = FLAG_SHINE;
}
else if (compare(flag, skCrypt("<<FUCK>>"), 8, dec, 0) == 0) {
else if (compare(flag, skCrypt("<<FUCK>>"), 8, dec, flag[9]) == 0) {
type = FLAG_FUCK;
}
else if (compare(flag, skCrypt("Hello?"), 6, dec, flag[6]) == 0) {
@@ -156,14 +157,14 @@ inline FlagType CheckHead(const char* flag, DecFun dec) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Զ<EFBFBD><D4B6>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD>ϰ汾ͨѶЭ<D1B6><D0AD>
inline FlagType CheckHead(char* flag, HeaderEncType& funcHit) {
static const DecFun methods[] = { default_decrypt, decrypt };
static const DecFun methods[] = { default_decrypt, decrypt, decrypt_v1, decrypt_v2, decrypt_v3, decrypt_v4, decrypt_v5, decrypt_v6 };
static const int methodNum = sizeof(methods) / sizeof(DecFun);
char buffer[FLAG_LENGTH + 1] = {};
char buffer[MIN_COMLEN + 4] = {};
for (int i = 0; i < methodNum; ++i) {
memcpy(buffer, flag, FLAG_LENGTH);
memcpy(buffer, flag, MIN_COMLEN);
FlagType type = CheckHead(buffer, methods[i]);
if (type != FLAG_UNKNOWN) {
memcpy(flag, buffer, FLAG_LENGTH);
memcpy(flag, buffer, MIN_COMLEN);
funcHit = HeaderEncType(i);
return type;
}

View File

@@ -146,7 +146,7 @@ void CBuildDlg::OnBnClickedOk()
return;
}
//////////<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ//////////////////////
CONNECT_ADDRESS g_ConnectAddress = { FLAG_FINDEN, "127.0.0.1", "", typ, false, DLL_VERSION, 0, startup, HeaderEncV1 };
CONNECT_ADDRESS g_ConnectAddress = { FLAG_FINDEN, "127.0.0.1", "", typ, false, DLL_VERSION, 0, startup, HeaderEncV0 };
g_ConnectAddress.SetServer(m_strIP, atoi(m_strPort));
g_ConnectAddress.runningType = m_ComboRunType.GetCurSel();
g_ConnectAddress.protoType = m_ComboProto.GetCurSel();