专栏首页逆向技术RC4加密原理,代码解析,逆向小技巧.

RC4加密原理,代码解析,逆向小技巧.

RC4加密原理

一丶RC4

1.1 rc4介绍

​ RC4是一种对称加密算法,加密和加密使用同一个函数. 其中关于其历史这里也不多说了.

自己查一下百度百科.

1.2 RC4原理以及代码介绍

RC4是很简单的一种加密算法, 主要就是分为两部分 RC4初始化 RC4加密

其实很简单.

1.2.1rc4初始化介绍

初始化分为以下几个步骤

  • 初始化存储0-255字节的Sbox(其实就是一个数组)
  • 填充key到256个字节数组中称为Tbox(你输入的key不满256个字节则初始化到256个字节)
  • 交换s[i]与s[j] i 从0开始一直到255下标结束. j是 s[i]与T[i]组合得出的下标

代码如下

typedef struct _RC4INFO
{
    unsigned char s_box[256];     //定义一个自己使用的结构体
    unsigned char t_box[256];
}RC4_INFO,*PRC4_INFO;

/*
初始化函数 需要传入key 以及 keylen
主要有几个步骤
1.初始化Sbox
2.将key填充到Tbox中
3.组合sbox[i] 与 tbox[i] 然后进行交换
*/
void rc4_init(PRC4_INFO prc4,unsigned char key[], unsigned int keylen)
{
    int i = 0;
    int j = 0;
    unsigned char tmp;
    if (prc4 == NULL)
    {
        return;
    }
    //初始化sbox与 Tbox
    for (i = 0; i < 256; i++)
    {
        prc4->s_box[i] = i;
        prc4->t_box[i] = key[i % keylen];
    }

    //交换sbox
    for (i = 0; i < 256; i++)
    {
        //得出j下标
        j = (j + prc4->s_box[i] + prc4->t_box[i]) % 256;
        //开始交换
        tmp = prc4->s_box[i];
        prc4->s_box[i] = prc4->s_box[j];
        prc4->s_box[j] = tmp;
    }
}

1.2.2 RC4加密

RC4加密其实就是遍历数据,将数据与sbox进行异或加密,而在此之前还需要交换一次sbox的数据

交换完之后 再把s[i] + s[j]的组合当做下标再去异或.

代码如下.

void rc4_crypt(
    unsigned char data[],       //要加密的数据
    unsigned int datalen,       //要加密的数据长度
    unsigned char key[],        //加密数据所用的Key
    unsigned int keylen)        //加密数据所用的key长度
{
    int dn = 0;  //data[n]的意思
    int i = 0;
    int j = 0;   // i j 分别用于交换sbox[i] 和 sbox[j]
    int t = 0;   //t = s[i] + s[j]
    unsigned char tmp;
    RC4_INFO rc4;
    rc4_init(&rc4, key, keylen);

    for (dn = 0; dn < datalen; dn++)
    {
        i = (i + 1) % 256;
        j = (j + rc4.s_box[i]) % 256;

        //swap
        tmp = rc4.s_box[i];
        rc4.s_box[i] = rc4.s_box[j];
        rc4.s_box[j] = tmp;             //上边这部分就是在交换s[i]与s[j]
        
        
                             
        //下边这部分就是得到T下标用于交换
        t = (rc4.s_box[i] + rc4.s_box[j]) % 256;
        data[dn] ^= rc4.s_box[t];
    }
}

1.2.3完整代码

/* This file was generated by the Hex-Rays decompiler.
   Copyright (c) 2007-2019 Hex-Rays <info@hex-rays.com>

   Detected compiler: Visual C++
*/

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <intrin.h>

typedef struct _RC4INFO
{
    unsigned char s_box[256]; 
    unsigned char t_box[256];
}RC4_INFO,*PRC4_INFO;

void rc4_init(PRC4_INFO prc4,unsigned char key[], unsigned int keylen)
{
    int i = 0;
    int j = 0;
    unsigned char tmp;
    if (prc4 == NULL)
    {
        return;
    }
    //init sbox an KeyBox(Tbox)
    for (i = 0; i < 256; i++)
    {
        prc4->s_box[i] = i;
        prc4->t_box[i] = key[i % keylen];
    }

    //swap sbox
    for (i = 0; i < 256; i++)
    {
        j = (j + prc4->s_box[i] + prc4->t_box[i]) % 256;
        tmp = prc4->s_box[i];
        prc4->s_box[i] = prc4->s_box[j];
        prc4->s_box[j] = tmp;
    }
}
void rc4_crypt(
    unsigned char data[],       //要加密的数据
    unsigned int datalen,       //要加密的数据长度
    unsigned char key[],        //加密数据所用的Key
    unsigned int keylen)        //加密数据所用的key长度
{
    int dn = 0;  //data[n]的意思
    int i = 0;
    int j = 0;   // i j 分别用于交换sbox[i] 和 sbox[j]
    int t = 0;   //t = s[i] + s[j]
    unsigned char tmp;
    RC4_INFO rc4;
    rc4_init(&rc4, key, keylen);

    for (dn = 0; dn < datalen; dn++)
    {
        i = (i + 1) % 256;
        j = (j + rc4.s_box[i]) % 256;

        //swap
        tmp = rc4.s_box[i];
        rc4.s_box[i] = rc4.s_box[j];
        rc4.s_box[j] = tmp;
        //得到T下标用于交换
        t = (rc4.s_box[i] + rc4.s_box[j]) % 256;
        data[dn] ^= rc4.s_box[t];
    }
}
void EntryBuffer(unsigned char data[],unsigned int datalen)
{
    unsigned char key[] = "pjrHeldsadf";
    rc4_crypt(data, datalen, key, sizeof(key) / sizeof(key[0]));
}
int main()
{
    char Hell[] = "Hello你好sdfsdaf";
    EntryBuffer((unsigned char*)Hell,sizeof(Hell)/sizeof(Hell[0])); //加密
    EntryBuffer((unsigned char*)Hell,sizeof(Hell)/sizeof(Hell[0])); //在调用一次就是解密了
    return 0;
}

三丶RC4的逆向小技巧

3.1 逆向特征

  • 首先根据原理我们可以看到会初始化一个256字节的数组
  • 其次会将一个key也填充到数组中
  • 函数的话大概率都是两个参数,一个是key 一个是keylen

遇到上述特征可以认为是rc4

反汇编中有xmm0 下面进行调用了两个函数 sub_401040

观看数据区,看到这种大概率就是字符串,可以按A 或者R来进行转换看.

转换后看到就是我们的加密数据以及rc4的key(pjrheldsadf)

根据上述特征大概率就可以看出是rc4初始化函数. key填充到var_20C中. i填充到var_200中

再往下看就可以明显的看到数据异或了.很简单也可以自己写一个进行逆向.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 记一次Hvv红队样本的简单分析-文末附免杀shellcode加载器

    本文章仅供学习交流使用,文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!

    用户1789928
  • 钓鱼邮件中的Remcos RAT变种分析

    7月份,我们发现了一个伪装成新订单通知的钓鱼邮件,里面带有一个恶意附件,会导致Remcos RAT(被Trend Micro检测为BKDR_SOCMER.SM)...

    FB客服
  • android逆向学习路线

    就我自己从事安卓逆向这几年的经验来说,对没有编程基础的朋友如何学习安卓逆向最好制定以下学习路线:

    悲伤的夏洛特@席玉铎666
  • [系统安全] 二.如何学好逆向分析及吕布传游戏逆向案例

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏...

    Eastmount
  • Chrome 在野零日漏洞

    卡巴斯基安全防护是卡巴斯基产品的一部分,过去已成功检测到许多零日攻击。最近,为 Google的 Chrome 浏览器发现了一个未知的新漏洞。我们会立即将此情况报...

    madneal
  • 面向对象(三十四)-加密与解密

    如图 你是没有办法进行解密的,但是有一些爱好者就利用存储空间,记录这种计算后的结果,导致MD5加密也可以进行破解。目前破解率在70%-80%。...

    孙寅
  • CTF是个啥?扫盲笔记带你一探究竟!

    CTF全称“Capture the FLAG”,俗称夺旗(flag)比赛,起源于1996年举办的DEFCON全球黑客大会,随着安全攻防技术的发展,...

    轩辕小子
  • PHP实现的AES 128位加密算法示例

    本文实例讲述了PHP实现的AES 128位加密算法。分享给大家供大家参考,具体如下:

    砸漏
  • RCTF 2018 Magic题目详解

    此题来自 RCTF 2018 的一道逆向题目 magic. 赛后分析许久, 看了几个 writeup, 但是始终不得要领, 大神们寥寥数语, 扔下一堆代码, 就...

    FB客服
  • 加解密

    对称加密(SymmetricCryptography),以DES,AES,RC4 为代表。

    tinyfisher
  • Android应用测试速查表

    写在前面 最近研究了下Android应用测试,找了一些资料,觉得OWASP这篇写的还是比较系统的,所以翻译出来给大家分享下。文中的翻译尽可能保持原文格式,但一些...

    FB客服
  • CTF从入门到提升

    CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于19...

    牛油果
  • NSA 攻击工具再遭利用,Windows、Linux服务器沦为挖矿工具

    F5研究员发现了一种新型Apache Struts 漏洞利用。这种恶意行动利用NSA EternalBlue 和 EternalSynergy两种漏洞,运行于多...

    企鹅号小编
  • 把 Android App 逆向分为几步?三步

    逆向在很多领域都有应用,比如如今爬虫技术已经遍地走,甚至不用写代码都可以爬取数据,导致前端开发的反爬意识也逐步提升。因此 JS、Android 等领域的逆向,已...

    张凯强
  • APK加固之静态脱壳机编写入门

    1.大家都知道Android中的程序反编译比较简单,辛苦开发出一个APK轻易被人反编译了,所以现在就有很多APK加固的第三方平台,比如爱加密和梆梆加固等。

    我是小三
  • 加密 原

    在日常设计及开发中,为确保数据传输和数据存储的安全,可通过特定的算法,将数据明文加密成复杂的密文。目前主流加密手段大致可分为单向加密和双向加密。

    wuweixiang
  • 把 Android App 逆向分为几步?三步

    逆向在很多领域都有应用,比如如今爬虫技术已经遍地走,甚至不用写代码都可以爬取数据,导致前端开发的反爬意识也逐步提升。因此 JS、Android 等领域的逆向,已...

    咸鱼学Python
  • 把 Android App 逆向分为几步?三步

    逆向在很多领域都有应用,比如如今爬虫技术已经遍地走,甚至不用写代码都可以爬取数据,导致前端开发的反爬意识也逐步提升。因此 JS、Android 等领域的逆向,已...

    吴延宝
  • #记一次对某违法网站的渗透纪实

    lonelyvaf

扫码关注云+社区

领取腾讯云代金券