常见加解密算法03 - RC4逆向认识

各位聪明绝顶,才高八斗的读者们你们好!今天我们主要讨论编译之后的RC4算法识别。

题外话,之前看到一个蛋疼的小知识,说“势”这个字最好不好查词典释义。我是很好奇的,果然后来无法直视势不可挡这个成语。

言归正传,我们将上一篇的Java与C的代码都编译一下,分别反编译看看。

Java版

Java版的就很好识别,几乎与源码没啥区别。

C版

这里我们先给出RC4加密算法在逆向分析过程中的快速识别经验:

  1. 首先判断明文和密文长度是否相等,等长则代表是序列密码。

  2. 接下来判断是否是RC4。RC4算法中的初始化算法(KSA)中有两轮非常显著的长度为256的循环体,用于根据给定的key生成s盒。伪随机子密码生成算法(PRGA)会根据上一步得到的扰乱的s盒,进一步生成子密钥流,最终和给定的明文进行逐字节的异或。

由于 so 是可以加 ollvm 的,而且还可以做字符混淆,所以逆向起来不会像Java那么容易,在我们找到一个怀疑对象函数之后,就可以通过编写frida脚本或xposed插件完成对相应函数的主动调用,判断当输入明文为任意长度时的密文长度。

关于 ndk 的混淆是有很多文章的,自己可以尝试一下控制流混淆与字符串混淆。

我们看一个混淆之后的例子:

  sub_F658(&unk_38008, dest);

unk_38008实际上是一个字符串,不过这个字符串被混淆了,在 init 阶段后才会被解密。

看里面的逻辑:

  sub_F0AC((__int64)v7, (__int64)a1, v4);v2 = strlen(a2);return sub_F3C4(v7, a2, v2);

有2个函数比较可疑,先看 sub_F0AC

先看1处,有一个很明显的交换数组元素的逻辑。

再看2处,只有当 v7 = 915845509 的时候才会交换逻辑,循环次数是 256 次,这些都与  RC4 的 init 阶段是一样。

当然这里也只是大胆猜测,而且混淆级别开的没那么高,所以还能看清楚一定的逻辑。实际上这里就已经很难看出来第一个给 S 盒赋值的循环在哪里了,只能根据 result 的位置来看。

后面我们可以使用hook来验证我们的想法。

再看 sub_F3C4 函数:

看 1,2处,发现循环会执行的次数与第3个参数一样,看前面的逻辑:

这就是说,循环次数是第二个字符串的长度。配合第3处的异或,也可以合理怀疑这里就是加密函数。

Hook验证

 sub_F0AC((__int64)v7, (__int64)a1, v4);

通过上面的分析,第一个参数是返回值,第二个参数是密钥,第三个参数是密钥长度。所以返回的是一个密钥流。

sub_F3C4(v7, a2, v2);

第一个参数是密钥流,第二个参数是明文,第三个参数是明文的长度。返回值(第一个参数)是加密后的结果。

sub_F658()

所以,这个函数就是一个 RC4 算法,我们 hook 这些函数,观察参数与结果。

export function invoke_sub_F658(arg1: string, arg2: string) {var offset = 0xF658;var module = Process.getModuleByName("libnative-lib.so");var sub_address = module.base.add(offset);var arg1_address = Memory.alloc(10);let arg2_address = Memory.alloc(10);arg1_address.writeUtf8String(arg1);arg2_address.writeUtf8String(arg2);var hooked_sub_f658 = new NativeFunction(sub_address, 'pointer', ['pointer', 'pointer']);var result = hooked_sub_f658(arg1_address, arg2_address);console.log("result:", hexdump(result));
}function hook_libnativelib() {var nativelibmodule = Process.getModuleByName("libnative-lib.so");var subf0ac = nativelibmodule.base.add(0xf0ac);var subf3c4 = nativelibmodule.base.add(0xf3c4);Interceptor.attach(subf0ac, {onEnter: function (args) {console.log("secret key: ", hexdump(args[1]), '\n length:', args[2]);}, onLeave: function () {}});Interceptor.attach(subf3c4, {onEnter: function (args) {this.arg1 = args[1];console.log("input: ", hexdump(args[1]), args[2]);}, onLeave: function () {console.log("output: ", hexdump(this.arg1));}});}function main() {if (Java.available) {Java.perform(function () {console.log("go into main");var RuntimeClass = Java.use('java.lang.Runtime');RuntimeClass.loadLibrary0.implementation = function (arg0: object, arg1: string) {var result = this.loadLibrary0(arg0, arg1);console.log("Runtime.loadLibrary0:", arg1);if (arg1.indexOf('native-lib') != -1) {hook_libnativelib();}return result;}})}
}rpc.exports = {invokesubf658: invoke_sub_F658
};setImmediate(main);

注意,我们hook so 的加载选择的是 Runtime 类,这是因为直接hook System 类会导致 Reflection.getCallerClass() 的值出问题。还有就是我的手机系统换到了 Android 10,注意自行查看源码区别。

hook 逻辑也很简单,就不细说了,看一下就明白。

注入脚本,看一下输出:

┌──(root㉿kali)-[~/workspace/frida-agent-example]
└─# frida -U -f com.kanxue.rc4 --no-pause -l _agent.js 
secret key:0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  0123456789ABCDEF
724f339008  72 63 34 74 65 73 74 00 31 32 33 34 35 36 37 38  rc4test.12345678

可以看到,secret key 是 rc4test

input:0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  0123456789ABCDEF
7fe568aa10  31 32 33 34 35 36 37 38 00 00 00 00 00 00 00 00  12345678........

加密的明文是 12345678

加密后的结果是:

output:0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  0123456789ABCDEF
7fe568aa10  a6 df 7a 5d dd ea 97 47 00 00 00 00 00 00 00 00  ..z]...G........

从 a6 到 47 这8个字节。

我们也可以主动调用函数,反复确认输入与输出是否一样长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/11918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】常见的数据类型

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:MySQL 目录 👉🏻常见的数据类型bit类型enumset集合查询函数find_ in_ set 👉🏻浮点类型float类型decimal &am…

Ansys Zemax|HUD 设计实例

说明 本文介绍了HUD设计实例。 实例说明 规格如下: 显示器尺寸:24*8mm 眼盒尺寸:100*40mm 放大倍率:5 (虚像尺寸 120*40mm) 虚像距离:1.8m 最终光学系统的整体布局如下图所示。 从HUD发出的…

官宣!招商工作全面启动“2024南京智博会”众多企业踊跃报名

2024南京智博会,作为一场盛大的科技盛宴,经过多年的发展与沉淀,已经成功跻身国内顶尖的高新技术产品及解决方案的展示平台之列,成为了引领行业趋势的风向标。本届智博会不仅汇聚了众多知名科技企业,更展现了国内外最前…

中北大学软件学院javaweb实验三JSP+JDBC综合实训(一)__数据库记录的增加、查询

目录 1.实验名称2.实验目的3.实验内容4.实验原理或流程图5.实验过程或源代码(一)编程实现用户的登录与注册功能【步骤1】建立数据库db_news2024和用户表(笔者使用的数据库软件是navicat)【步骤2】实现用户注册登录功能(与上一实验报告不同的是&#xff0…

哪个品牌led灯好?五大好用护眼台灯推荐

哪个品牌led灯好?目前LED护眼台灯当中做得比较好的有明基、松下、书客等品牌。在如今LED灯市场的海洋中,选择一款可靠的护眼台灯变得愈发重要。然而,众多品牌和产品的涌现也让消费者面临着选择困难。为了帮助大家找到最合适的LED台灯&#xf…

Chromium 调试指南2024 Windows11篇-使用日志来辅助调试(八)

1. 日志:你的第一个调试工具 日志是开发者最简单也是最常用的调试工具之一,它能够提供程序运行时的详细记录。通过合理的日志记录策略,开发者可以快速定位问题发生的上下文,理解程序的运行流程和状态。 2. 如何在Chromium中使用…

百度云防护自定义访问策略URI使用说明

百度云防护的创建防御模板里的自定义访问策略功能是一个不错自定义拦截功能。 其中URI拦截策略是一种非常不错的拦截手段,今天我们来说明下如何使用URI。 首先什么是URI?关于什么是URI百度上写了很多,不过对于小白来说,是非常难…

中国平安发布“绿美广东·平安古树守护行动” 为广东古树名木提供超2600万风险保障

为响应国家关于生态文明建设的号召,发展绿色金融,助力构建“绿美广东”生态建设新格局,5月11日,中国平安在广东省韶关市南华寺成功举办“绿美广东平安古树守护行动”活动,并发布“我为古树上保险”计划,将为…

Qt实现水平方向流式布局FlowLayout简单又实用!

Qt中常见的布局管理器有: QHBoxLayout:水平布局(常用) QVBoxLayout:垂直布局(常用) QGridLayout:表格布局(常用) QFormLayout:表单布局&#…

4.分支与循环

逻辑控制分为三部分: 1.顺序结构---》顺序执行代码 2.分支结构---》if语句和switch语句 3.循环执行---》for语句 while语句 和do while语句 顺序结构比较简单,按照代码书写的顺序一行一行执行 分支结构(if、switch语句) 也就是…

StarCloud开源行动:激发算力调度的创新潜力

01 关于StarCloud OpenCSG StarCloud 是一个集开源系统(Kubernetes ,K8S)与高性能计算(High Performance Computing,HPC)一体的混合算力调度平台。它专注于大模型训练和推理,并提供一站式服务,包括从训练到部署,以及多模型比较等。除了在人…

【OpenVINO™】在 C# 中使用OpenVINO™ 部署PP-YOLOE实现物体检测

前言 OpenVINO™ C# API 是一个 OpenVINO™ 的 .Net wrapper,应用最新的 OpenVINO™ 库开发,通过 OpenVINO™ C API 实现 .Net 对 OpenVINO™ Runtime 调用,使用习惯与 OpenVINO™ C API 一致。OpenVINO™ C# API 由于是基于 OpenVINO™ 开发…

DevOps 温故知新

【引】伴随着微服务架构以及云技术的广泛使用,DevOps相应地引起了人们的关注,尤其在互联网企业展开了大量的探索和实践。去年赋闲在家的时候, 有幸精读了三本书,分别是《持续架构实践——敏捷和DevOps时代下的软件架构》&#xff…

Linux安装MySQL(CentOS 7)

安装步骤 下载的MySQL版本为mysql-8.0.26 进入网站MySQL,点击下载 找到mysql社区版 点击Archive,查看所有相关不同版本 点击MySQL Community Server 注意下载MySQL对应的Linux版本,CentOS7 对应 Linux7,如果下成Linux 8 则后面…

解决SpringBoot整合MyBatis和MyBatis-Plus,请求后不打印sql日志

问题发现 在整合springBootmyBatis时,发现请求不打印sql日志,示例代码如下: RestController public class MyController {AutowiredProductMapper productMapper;GetMapping("/test")public void test() {System.out.println(&qu…

全国大学生数学建模竞赛【集训营E题】丨 近5年赛题实现,模拟参赛体验

全国大学生数学建模竞赛E题集训营即将开营 基于Python的近5年E题数学建模基础巩固 近5年E题赛题实现 模拟参赛体验与作品评审

数据库笔记-【视图】

视图 视图通俗是企业想展示给用户看的,数据库存储的数据有很多,但是也有很多是不能对外公开的,做项目的过程就通过视图这个媒介达到这种效果 视图也可以保证数据库表结构字段的隐私安全等 create or replace view stu_v_1 as select id st…

✨✨使用vue3打造一个el-form表单及高德地图的关联组件实例✨

✨1. 实现功能 🌟表单内显示省市县以及详细地址 点击省市县输入框时,打开对应地图弹窗,进行位置选择选择位置回显入对应输入框表单内的省市县以及地址输入框同外嵌表单走相同的校验方式触发校验后点击reset实现清除校验与清空数据 &#x1f…

Base64在线编码解码方法

Base64在线编码解码 打开网站 在线工具网-梦幻加菲猫 选择“Base64编码解码” 输入需要编码/解码的内容,点击“编码”/“解码”按钮 编码: 解码: 4. 复制已经编码/解码后的内容。

【云原生】Kubeadm搭建K8S

一、部署Kubernetes 实验环境 服务器主机名IP地址主要组件k8s集群master01 etcd01master01192.168.10.100kube-apiserver kube-controller-manager kube-schedular etcdk8s集群node01 etcd02node01192.168.10.101kubelet kube-proxy docker flannelk8s集群node02 etcd03nod…