java代码只用到了一个checkFlag在native层导出so文件IDA分析前面两个是标准的RC4sub_10D4是一个自定义加密逻辑第一个循环是一套置换和异或需要用到这些逻辑优化 v6 enc[i 2]; v7 enc[i 1]; v8 enc[i] ^ v6; v5[0] v8; v5[2] v6 ^ v7; v5[1] v7 ^ v8; 计算v7、v6、v8 v7 v5[1] ^ v5[0]; v6 v5[2] ^ v7; v8 v5[0] ^ v6; 恢复result result[i] v8; result[i1] v7; result[i2] v6;第二个循环是循环密钥异或(a4 ~(a4 31)) ! k j k a2a4 31用于取符号位正数为0负数为1结果是0xFFFFFFFF(算术右移时用符号位填充空位)a4 ~取反并与运算正数取反为0xFFFFFFFF负数取反为0所以a4为正数时还是a4为负数时是0! kk是len(k)8也就是循环8次j k a2外循环 内循环(已循环次数) 字符长度防止下标越界其实最后这段代码就执行了for (int i 0; i 8; i)的效果只是做了很多异常处理EXP将这些逻辑逆向处理一下enc [0xa3, 0x1a, 0xe3, 0x69, 0x2f, 0xbb, 0x1a, 0x84, 0x65, 0xc2, 0xad, 0xad, 0x9e, 0x96, 0x5, 0x2, 0x1f, 0x8e, 0x36, 0x4f, 0xe1, 0xeb, 0xaf, 0xf0, 0xea, 0xc4, 0xa8, 0x2d, 0x42, 0xc7, 0x6e, 0x3f, 0xb0, 0xd3, 0xcc, 0x78, 0xf9, 0x98, 0x3f] key b12345678 result [0] * 39 for i in range(len(enc)): enc[i] ^ key[i % 8] for i in range(0,len(enc),3): v7 enc[i1] ^ enc[i] v6 enc[i2] ^ v7 v8 enc[i] ^ v6 result[i] v8 result[i1] v7 result[i2] v6 S list(range(256)) j 0 for i in range(256): j (j S[i] key[i % len(key)]) % 256 S[i], S[j] S[j], S[i] i j 0 for char in result: i (i 1) % 256 j (j S[i]) % 256 S[i], S[j] S[j], S[i] k S[(S[i] S[j]) % 256] print(chr(char ^ k), end)CISCN{6654d84617f627c88846c172e0f4d46c}总结逆向分析so文件中的RC4与自定义逻辑