1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include"stdint.h" #include<Windows.h> typedef unsigned longULONG;
void rc4_init(unsigned char*s, unsigned char*key, unsigned long Len) { int i = 0, j = 0; char k[256] = { 0 }; unsigned char tmp = 0; for (i = 0; i<256; i++) { s[i] = i; k[i] = key[i%Len]; } for (i = 0; i<256; i++) { j = (j + s[i] + k[i]) % 256; tmp = s[i]; s[i] = s[j]; s[j] = tmp; } }
void rc4_crypt(unsigned char*s, unsigned char*Data, unsigned long Len) { int i = 0, j = 0, t = 0; unsigned long k = 0; unsigned char tmp; unsigned char h; for (k = 0; k<Len; k++) { i = (i + 1) % 256; j = (j + s[i]) % 256; tmp = s[i]; s[i] = s[j]; s[j] = tmp; t = (s[i] + s[j]) % 256; h = s[t] ^ 0x33; Data[k] -= h; } }
void decipher(unsigned int v[]) { unsigned int key[4]={ 0x6e982837,0x44332211,0x11223344,0x3728986e }; unsigned int v0=v[0], v1=v[1], delta=0x9E3779B8, sum=0xcb9e3951; for (int i=0; i <= 32; i++) { v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]); sum -= delta; v0 -= (((v1 << 5) ^ (v1 >> 6)) + v1) ^ (sum + key[sum & 3]); } v[0]=v0; v[1]=v1; } int main() { unsigned char new_data[44]; unsigned char s[256] = { 0 }, s2[256] = { 0 }; char key[256] = { "th0s_i0_ke9" }; unsigned char v[]={ 0x50, 0xD4, 0xC8, 0xC4, 0x8F, 0x84, 0x40, 0xEB, 0x32, 0x81, 0x8F, 0x85, 0x6C, 0xB2, 0x2B, 0x06, 0xBF, 0x05, 0x35, 0x5D, 0x2E, 0xE3, 0x7D, 0x46, 0x8D, 0x35, 0x01, 0x70, 0x3A, 0x80, 0x81, 0xC5, 0xE6, 0x71, 0xD3, 0xD6, 0x50, 0x69, 0x6F, 0xE2, 0x6E, 0x78, 0x14, 0xD8 }; for (int i = 36; i >=0; --i) { (decipher)((unsigned int*) & v[i]);
} for (int i=0;i<=strlen(v);i++){ printf("0x%x,",v[i]); } unsigned long len = strlen(v); rc4_init(s, (unsigned char*)key, strlen(key)); int i; for (i = 0; i<256; i++) { s2[i] = s[i]; } rc4_crypt(s, (unsigned char*)v, len); puts("\n\n"); puts(v); return 0; }
|