不会去花就很难受,看了好久才手动还原出来C语言代码
加密和解密都在这里了
#include <stdio.h>
#include <string.h>
//
unsigned int ExchangeBit(unsigned int data){
unsigned int ret = 0;
ret |= (data & 0xff) << 24;
ret |= ((data >> 8) & 0xff) << 16;
ret |= ((data >> 16) & 0xff) << 8;
ret |= ((data >> 24) & 0xff) << 0;
return ret;
}
unsigned int Ror(unsigned int data, unsigned int count){
__asm{
mov eax, [data]
mov cl, byte ptr[count]
ror eax, cl
}
}
unsigned int Rol(unsigned int data, unsigned int count){
__asm{
mov eax, [data]
mov cl, byte ptr[count]
rol eax, cl
}
}
unsigned char _0_7[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
unsigned char _8_F[] = { 8, 9, 10, 11, 12, 13, 14, 15 };
unsigned int data[256] = { 0 };
//在keyfunc1中调用了这个函数
unsigned int * MakeArr(){
unsigned long long a = *(unsigned long long*)_0_7;
unsigned long long b = 0xF0E0D0C0B0A0908;
unsigned long long _0x28 = 0x67452301EFCDAB89;
unsigned int _0xc = 0x98BADCFE;
data[0] = ExchangeBit(a >> 32);
data[1] = ExchangeBit(a & 0xffffffff);
data[2] = ExchangeBit(b >> 32);
data[3] = ExchangeBit(b & 0xffffffff);
for (int i = 4;i<=0x2b;i++)
{
unsigned int edx;
unsigned int a = Ror(data[i - 1],3);
edx = (_0x28 & 1) ^ (_0xc);
edx ^= data[i - 4];
edx ^= Ror(data[i - 1], 3);
edx ^= data[i - 3];
edx ^= Ror(data[i - 1], 4);
edx ^= Ror(data[i - 3], 1);
data[i] = edx;
_0x28 >>= 1;
//unsigned int b = Ror(data[i - 4],)
}
return data;
}
unsigned long long KeyFunc1(unsigned char*pQword){
unsigned int*pAddr = MakeArr();
unsigned long long qword = *(unsigned long long*)pQword;
unsigned int Hidword = ExchangeBit(qword >> 32);
unsigned int Lodword = ExchangeBit(qword);
for (int i = 0; i <= 0x2b; i++){
unsigned int temp = Lodword;
unsigned int ebx = 0;
ebx = Rol(Lodword, 1);
ebx &= Rol(Lodword, 8);
ebx ^= Rol(Lodword, 2);
ebx ^= Hidword;
ebx ^= pAddr[i];
Lodword = ebx;
Hidword = temp;
}
return (((unsigned long long)Lodword) << 32) | Hidword;
}
unsigned long long deKeyFunc1(unsigned char*pQword){
unsigned int*pAddr = MakeArr();
unsigned long long qword = *(unsigned long long*)pQword;
unsigned int Lodword = qword >> 32;
unsigned int Hidword = qword;
for (int i = 0x2b; i >= 0; i--){
unsigned int old_lodword = Hidword;
unsigned int ebx = 0;
ebx = Rol(old_lodword, 1);
ebx &= Rol(old_lodword, 8);
ebx ^= Rol(old_lodword, 2);
ebx ^= pAddr[i];
Hidword = Lodword ^ ebx;
Lodword = old_lodword;
}
Lodword = ExchangeBit(Lodword);
Hidword = ExchangeBit(Hidword);
return ((((unsigned long long)Hidword)<<32) | (Lodword));
}
void KeyFunc2(int count,unsigned int*p){
unsigned int*pArr = (unsigned int*)_0_7;
unsigned int lodword = p[0];
unsigned int hidword = p[1];
unsigned int val = 0x10325476;
unsigned int A = 0;
for (int i = 0; i < count; i++)
{
lodword += ((((hidword << 4) ^ (hidword >> 5)) + hidword) ^ (A + (pArr)[A & 3]));
A += val;
hidword += (((((lodword << 4) ^ (lodword >> 5))) + lodword) ^ (A + (pArr)[((A >> 0xB) & 3)]));
}
p[0] = lodword;
p[1] = hidword;
}
void deKeyFunc2(int count, unsigned int *p){
unsigned int*pArr = (unsigned int*)_0_7;
unsigned int lodword = p[0];
unsigned int hidword = p[1];
unsigned int val = 0x10325476;
unsigned int A = 0;
for (int i = 0; i < count; i++){
A += val;
}
for (int i = 0; i < count; i++){
hidword -= (((((lodword << 4) ^ (lodword >> 5))) + lodword) ^ (A + (pArr)[((A >> 0xB) & 3)]));
A -= val;
lodword -= ((((hidword << 4) ^ (hidword >> 5)) + hidword) ^ (A + (pArr)[A & 3]));
}
p[0] = lodword;
p[1] = hidword;
}
char flag[128] = { 0 };
unsigned char EncryptData[32] = { 0 };
unsigned char TargetData[] =
{
0x66, 0xC2, 0xF5, 0xFD, 0x86, 0x82, 0x32, 0x7A, 0x04, 0x40,
0x94, 0xCE, 0xDC, 0x8A, 0xE0, 0x5D, 0x0A, 0xBD, 0xE4, 0xA6,
0xDC, 0xAD, 0xCA, 0x16, 0x0C, 0x6F, 0xCD, 0x13, 0x36, 0xD9,
0x75, 0x1A
};
void encrypt(char*flag){
for (int i = 0; i < 4; i++){
//step1
unsigned long long data = KeyFunc1((unsigned char*)flag + i * 8);
//step2
KeyFunc2(1 << (i + 1),(unsigned int*)&data);
//step3
memcpy(EncryptData + i * 8, &data, sizeof(data));
}
}
void decrypt(){
for (int i = 0; i < 4; i++){
deKeyFunc2(1 << (i + 1), (unsigned int*)(TargetData + i * 8));
unsigned long long data = deKeyFunc1((TargetData + i * 8));
*(unsigned long long*)(&flag[i * 8]) = data;
}
}
int main(){
decrypt();
puts(flag);
return 0;
}