前言
RC4和DES算法一樣,都是對稱加密算法,密鑰可以同時加密和解密數據。
不同的是DES將數據分組后加解密,而RC4則是以字節流的方式對數據每一個字節進行加解密。
RC4是惡意代碼常用算法,因為它體積小易於實現,並且沒有明顯加密常量,很難使用插件進行識別。
原理
通過密鑰(Key 1-256字節),計算得到一個256字節的數組(S盒),然后將S盒中的數據與明文或密文進行異或,以此進行加解密操作。
注意:加解密過程中S盒中的數據會發生改變,所以加密或解密之前需要使用密鑰對S盒數據進行重新初始化。
加密過程
1、S盒初始化
2、S盒亂序
3、計算密鑰流
4、異或加解密
示例代碼
1 #include "stdafx.h" 2 #include "stdio.h" 3 #include <windows.h> 4 5 //初始化 6 void rc4_init(unsigned char *s, unsigned char *key, unsigned long Len) 7 { 8 int i = 0, j = 0; 9 char t[256] = { 0 }; 10 unsigned char tmp = 0; 11 12 //填充S盒 13 for (i = 0; i < 256; i++) 14 { 15 s[i] = i; //填充S盒 16 t[i] = key[i%Len]; //臨時變量 17 } 18 19 //S盒亂序 20 for (i = 0; i < 256; i++) 21 { 22 j = (j + s[i] + t[i]) % 256; 23 tmp = s[i]; 24 s[i] = s[j]; 25 s[j] = tmp; 26 } 27 } 28 29 //加解密 30 void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len) 31 { 32 int i = 0, j = 0, t = 0; 33 unsigned long k = 0; 34 unsigned char tmp; 35 36 for (k = 0; k < Len; k++) 37 { 38 //計算密鑰流 39 i = (i + 1) % 256; 40 j = (j + s[i]) % 256; 41 42 tmp = s[i]; 43 s[i] = s[j]; 44 s[j] = tmp; 45 46 t = (s[i] + s[j]) % 256; 47 48 // 異或加解密 49 Data[k] ^= s[t]; 50 } 51 } 52 53 //Main 54 int _tmain(int argc, _TCHAR* argv[]) 55 { 56 char key[256] = { "123456789" }; //密鑰 57 char pData[512] = "AAAAAAAAA"; //明文 58 unsigned char s1[256] = { 0 }, s2[256] = { 0 }; //S盒 59 unsigned long len = strlen(pData); 60 61 printf("明文:%s\n", pData); 62 63 //初始化 64 rc4_init(s1, (unsigned char*)key, strlen(key)); 65 //加密 66 rc4_crypt(s1, (unsigned char*)pData, len); 67 printf("加密:%s\n", pData); 68 69 //加密、解密過程中S盒中的數據會發生改變,所以需要2次初始化 70 71 //初始化 72 rc4_init(s2, (unsigned char*)key, strlen(key)); 73 //解密 74 rc4_crypt(s2, (unsigned char*)pData, len); 75 printf("解密:%s\n", pData); 76 77 return 0; 78 }
逆向分析
識別重點:
2個長度為256的For循環
S盒亂序時的數據交換
以及最后的異或加解密
使用示例代碼生成Demo文件,逆向分析其加密過程。
進入401000初始化函數,查看第一個For循環
循環256次,分別對S盒與T盒(臨時變量)進行填充
識別重點是:s盒與t盒的數據填充過程
S盒填充0-255
T盒填充密鑰Key,如果密鑰為256字節,則直接填充,否則循環填充
進入401000初始化函數,查看第二個For循環
循環256次,對s盒進行亂序(單純互換數據位置,數值本身並沒有改變)
識別重點是:s盒的數據交換過程
進入4010F0解密/解密函數,查看第三個For循環
循環n次,對數據進行加密或解密,其中n為數據長度
識別重點是:For循環結尾,s盒數據與Data數據的異或操作
總結
RC4算法本身實現並不復雜,只要熟悉其加密/解密流程,逆向分析過程中一般都能很好的進行識別。
分析其它標准加密算法基本也是同樣的流程,對於自定義的一些加密算法就需要耐心的跟蹤分析了。
另外對於標准加密算法,也可以借助PEID的“Krypto ANALyzer”插件,或者IDA的“FindCrypt2”插件進行識別,使用這些插件能夠更好地提高工作效率。