【逆向】RC4編碼解碼及逆向識別


前言

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”插件進行識別,使用這些插件能夠更好地提高工作效率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM