20.安卓逆向-frida基础-hook分析调试技巧2-hookDES

news2024/10/9 21:12:19

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于:图灵Python学院

本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:19.安卓逆向-frida基础-hook分析调试技巧1-hookMD5

上一个内容里使用Frida hook了MD5算法并尝试了对一个app进行使用MD5hook找参数,本次接着继续

本次hook DES算法

下图是DES两种标准实现

package com.example.course1.suanfa;

import android.util.Base64;

import java.security.spec.AlgorithmParameterSpec;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

public class AES {
    public static String des_1(String args) throws Exception{
        /**
         * SecretKeyFactory.getInstance("DES") 获取一个DES
         * generateSecret初始化DES的加密钥匙,专业术语叫做KEY
         * 一个des算法需要获取的就死key、iv、明文,有了这些之后就可以对参数模拟加密了
         */
        SecretKey secretKey = SecretKeyFactory.getInstance("DES").generateSecret(new DESKeySpec("123456789".getBytes()));
        /**
         *  new IvParameterSpec("87654321".getBytes()); IV
         *
         */
        AlgorithmParameterSpec iv = new IvParameterSpec("87654321".getBytes());
        /**
         * Cipher.getInstance("DES/CBC/PKCS5Padding"); 加密模式
         */
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        /**
         * cipher.init(1, secretKey, iv); 初始化,1表示加密
         *
         */
        cipher.init(1, secretKey, iv);
        /**
         *  cipher.update(args.getBytes()); 把明文放到缓存区准备加密
         */
        cipher.update(args.getBytes());
        /**
         * cipher.doFinal() 加密
         */
        return Base64.encodeToString(cipher.doFinal(), 0);
    }

    public static String des_2(String args) throws Exception{
        SecretKey secretKey = SecretKeyFactory.getInstance("DES").generateSecret(new DESKeySpec("123456789".getBytes()));
        AlgorithmParameterSpec iv = new IvParameterSpec("87654321".getBytes());
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(1, secretKey, iv);
        return Base64.encodeToString(cipher.doFinal(args.getBytes()), 0);
    }

}

Frida hook脚本

function bytesToHex(arr) {
    var str = "";
    for (var i = 0; i < arr.length; i++) {
        var tmp = arr[i];
        if (tmp < 0) {
            tmp = (255 + tmp + 1).toString(16);
        } else {
            tmp = tmp.toString(16);
        }
        if (tmp.length == 1) {
            tmp = "0" + tmp;
        }
        str += tmp;
    }
    return str;
}
function bytesToBase64(e) {
    var base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    var r, a, c, h, o, t;
    for (c = e.length, a = 0, r = ''; a < c;) {
        if (h = 255 & e[a++], a == c) {
            r += base64EncodeChars.charAt(h >> 2),
                r += base64EncodeChars.charAt((3 & h) << 4),
                r += '==';
            break
        }
        if (o = e[a++], a == c) {
            r += base64EncodeChars.charAt(h >> 2),
                r += base64EncodeChars.charAt((3 & h) << 4 | (240 & o) >> 4),
                r += base64EncodeChars.charAt((15 & o) << 2),
                r += '=';
            break
        }
        t = e[a++],
            r += base64EncodeChars.charAt(h >> 2),
            r += base64EncodeChars.charAt((3 & h) << 4 | (240 & o) >> 4),
            r += base64EncodeChars.charAt((15 & o) << 2 | (192 & t) >> 6),
            r += base64EncodeChars.charAt(63 & t)
    }
    return r
}
function bytesToString(arr) {
    if (typeof arr === 'string') {
        return arr;
    }
    var str = '',
        _arr = arr;
    for (var i = 0; i < _arr.length; i++) {
        var one = _arr[i].toString(2),
            v = one.match(/^1+?(?=0)/);
        if (v && one.length == 8) {
            var bytesLength = v[0].length;
            var store = _arr[i].toString(2).slice(7 - bytesLength);
            for (var st = 1; st < bytesLength; st++) {
                store += _arr[st + i].toString(2).slice(2);
            }
            str += String.fromCharCode(parseInt(store, 2));
            i += bytesLength - 1;
        } else {
            str += String.fromCharCode(_arr[i]);
        }
    }
    return str;
}

function main() {
    Java.perform(function () {
      var SecretKeyFactory = Java.use("javax.crypto.SecretKeyFactory")
        SecretKeyFactory.getInstance.overload('java.lang.String').implementation = function(str) {
            console.log(`算法是----》${str}《------------------------------------------------------------》`)
            return this.getInstance(str)
        }
        // 获取 key
        var DESKeySpec = Java.use("javax.crypto.spec.DESKeySpec")
        DESKeySpec.$init.overload('[B').implementation = function(str) {
            console.log(`DESKeySpec.$init.overload--》DES的Key bytesToString:${bytesToString(str)}`)
            console.log(`DESKeySpec.$init.overload--》DES的key bytesToHexKey:${bytesToHex(str)}`)
            return this.$init(str)
        }
        // 获取 iv
        var IvParameterSpec = Java.use("javax.crypto.spec.IvParameterSpec")
        IvParameterSpec.$init.overload("[B").implementation = function(str) {
            console.log(`DES IV bytesToString:${bytesToString(str)}`)
            console.log(`DES IV bytesToHex:${bytesToHex(str)}`)
            return this.$init(str)
        }

        var Cipher = Java.use("javax.crypto.Cipher")
        Cipher.getInstance.overload('java.lang.String').implementation = function(str) {
            console.log(`Cipher 加密模式 Cipher.getInstance.overload('java.lang.String'):${str}`)
            return this.getInstance(str)
        }

          Cipher.getInstance.overload('java.lang.String', 'java.lang.String').implementation = function(str1,str2) {
            console.log(`Cipher 加密模式 Cipher.getInstance.overload('java.lang.String', 'java.lang.String') :${str1} || ${str2}`)
            return this.getInstance(str1, str2)
        }

        Cipher.update.overload('[B').implementation = function(str) {
            console.log(`DES 明文  Cipher.update.overload('[B') bytesToString:${bytesToString(str)}`)
            return this.update(str)
        }

          Cipher.update.overload('[B', 'int', 'int').implementation = function(str,i1, i2) {
            console.log(`DES 明文 Cipher.update.overload('[B', 'int', 'int') :${bytesToString(str)} 入参2:${i1} 入参3:${i2}`)
            return this.update(str, i1, i2)
        }

        Cipher.doFinal.overload('[B').implementation = function(str) {
            console.log(`des密文入参 Cipher.doFinal.overload('[B') bytesToString:${bytesToString(str)}`)
            console.log(`des密文入参 Cipher.doFinal.overload('[B') bytesToHex:${bytesToHex(str)}`)
             var m = this.doFinal(str)
             console.log(`des密文返回值 Cipher.doFinal.overload('[B') bytesToHex:${bytesToHex(m)}`)
             console.log(`des密文返回值 Cipher.doFinal.overload('[B') bytesToBase64:${bytesToBase64(m)}`)
            return m
        }

        Cipher.doFinal.overload().implementation = function() {
            var m = this.doFinal()
            console.log(`des密文返回值 Cipher.doFinal.overload() bytesToHex:${bytesToHex(m)}`)
            console.log(`des密文返回值 Cipher.doFinal.overload() bytesToBase64:${bytesToBase64(m)}`)
            return m
        }

    })
}

main()

效果图:加密的key

然后是iv,如下图iv的构造方法有两个,如果为了全面可以把两个都给使用Frida hook了(其它的方法也是一样为了全面可以把所有相同名的方法全部hook)

iv效果图,下图的Frida hook脚本里把iv的入参从字节转成了字符串,有的app这个字节的内容它是十六进制数(也就是传过来的也是被加密之后的信息)

获取加密之后的数据

使用DES在线加密网站测试,可以正常根据hook到的key、iv、明文加密成正确的密文


img

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

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

相关文章

MEMS 课本习题(1)

Chapter 5 Lump Modeling 为了将机械系统转换为等效电路&#xff0c;我们需要将各个机械元件转换为相应的电气元件。以下是机械元件和其电气等效元件的对照关系&#xff1a; 质量&#xff08;m&#xff09; - 转换为 电感&#xff08;L&#xff09;弹簧&#xff08;k&#xff…

SD入门教程一:Stable Diffusion 基础(技术篇)

前言 在开篇的时候就大致讲了SD和VAE&#xff0c;那么今天我们具象化地再来讲讲Stable Diffusion&#xff08;稳定扩散&#xff09;。 严格说来它是一个由几个组件&#xff08;模型&#xff09;构成的系统&#xff0c;而非单独的一个模型。我以最常见的文生图为例&#xff0c;…

PCL 计算3DSC并可视化

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 法线计算 2.1.2 3DSC特征计算 2.1.3 可视化3DSC直方图 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#…

【C++】——继承【上】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;Yan. yan.                        …

MPLS解决BGP路由黑洞问题

文章目录 MPLS应用实验实验配置 MPLS应用实验 实验目的&#xff1a;解决BGP中IBGP邻居之间存在的问题 MPLS解决BGP路由黑洞问题实验 配置完基本的MPLS和BGP操作之后&#xff0c;只有R2和R5上面有两个私网的路由&#xff0c;中间的设备没有私网路由&#xff0c;这时候默认还是走…

Linux源码阅读笔记-USB驱动分析

基础层次详解 通用串行总线&#xff08;USB&#xff09;主要用于连接主机和外部设备&#xff08;协调主机和设备之间的通讯&#xff09;&#xff0c;USB 设备不能主动向主机发送数据。USB 总线采用拓扑&#xff08;树形&#xff09;&#xff0c;主机侧和设备侧的 USB 控制器&a…

IT招聘乱象的全面分析

近年来&#xff0c;IT行业的招聘要求似乎越来越苛刻&#xff0c;甚至有些不切实际。许多企业在招聘时&#xff0c;不仅要求前端工程师具备UI设计能力&#xff0c;还希望后端工程师精通K8S服务器运维&#xff0c;更有甚至希望研发经理掌握所有前后端框架和最新开发技术。这种招聘…

RAG测评关键指标

解读RAG测评&#xff1a;关键指标与应用分析 ©作者|CodeDan 来源|神州问学 一、RAG介绍 1.1 简介 RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一种结合信息检索与文本生成的技术&#xff0c;旨在提高大型语言模型&#xff08;LLM&#xff09;在回答复…

ROS理论与实践学习笔记——4 ROS的常用组件之TF坐标变换

tf:TransForm Frame,坐标变换 坐标系:ROS 中是通过坐标系统开标定物体的,确切的将是通过右手坐标系来标定的。 作用:在 ROS 中用于实现不同坐标系之间的点或向量的转换。 说明:在ROS中坐标变换最初对应的是tf,不过在 hydro 版本开始, tf 被弃用,迁移到 tf2,后者…

docker 搭建 vue3 + vite

vue3发布了,今天就分享一下我使用docker 搭建 vue3 vite 开发环境。至于为什么使用docker搭建&#xff0c;因为多版本可以快速切换&#xff0c;和本地环境避免冲突。好了话不多说我们开始吧。 1. 准备资料 Docker Desktop wsl2 ubuntu 下载地址 : https://www.docker.…

实验室认证需要准备哪些文件材料?

实验室认证需要准备的文件材料通常包括以下几类&#xff1a; 一、法律地位文件 实验室成立文件及营业执照&#xff1a;包括实验室的成立证明文件、单位营业执照等&#xff0c;以证明实验室的法律地位和合法性。 人员任命文件&#xff1a;最高管理者&#xff08;如总经理&…

QT 实现QMessageBox::about()信息自定义显示

这是我记录Qt学习过程的第四篇心得文章&#xff0c;主要是方便自己编写的应用程序显示“关于信息”&#xff0c;对QMessageBox::about()输入信息进行规范&#xff0c;可以设置应用程序名称&#xff0c;通过定义宏从pro文件获取应用程序版本号&#xff0c;以及编译程序的QT版本、…

关于C语⾔内存函数 memcpy memmove memset memcmp

memcpy使⽤和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 这个函数在遇到 \0 的时候并不会停下来。 如果source和destination有任何的重叠&am…

Linux环境通过APT 仓库安装版PostgreSQL 数据库实战

Linux环境通过APT 仓库安装版PostgreSQL 数据库是运维人员常见的需求之一&#xff0c;今天我们一步一步演示一下&#xff1a; 1、添加 PostgreSQL APT 仓库 确保你的系统更新&#xff0c;然后添加 PostgreSQL 的官方 APT 仓库。 sudo apt update sudo apt install -y wget w…

原来机器学习那么简单——决策树回归

引言&#xff1a; 在正文开始之前&#xff0c;首先给大家介绍一个不错的人工智能学习教程&#xff1a;https://www.captainbed.cn/bbs。其中包含了机器学习、深度学习、强化学习等系列教程&#xff0c;感兴趣的读者可以自行查阅。 一、算法介绍 回归树是决策树的一种&#xff…

[已完结] Authentication Lab —— 靶场笔记合集

Authentication Labhttps://authlab.digi.ninja/ 0x01&#xff1a;Authentication Lab 靶场简介 Authentication Lab 是由 DigiNinja 提供的&#xff0c;一个专注于身份验证和授权漏洞的实验平台。该网站旨在提供一个可以让用户探索和实践各种常见与不常见的身份验证与授权漏…

带你深入浅出设计模式:十、责任链模式:设计模式中的多米诺骨牌效应

此为设计模式第十谈&#xff01; 用总-分-总的结构和生活化的例子给你讲解设计模式&#xff01; 码农不易&#xff0c;各位学者学到东西请点赞收藏支持支持&#xff01; 开始部分&#xff1a; 总&#xff1a;责任链的本质是使多个对象都有机会处理请求&#xff0c;将这些对象…

指针和引用区别

目录 指针 指针类型 野指针 二级指针 Const修饰指针 引用 引用的作用 常引用 引用和指针的对比 引用能够完全替换指针吗&#xff1f; 指针 指针是C语言中的概念&#xff0c;它是指计算机储存内容的地址。指针它的值指向存在电脑储存器中另一个地方的值。通过地址能找…

玩机搞机基本常识-----如何在 Android 中实现默认开启某个功能 修改方法列举

我们有时候需要对安卓系统进行修改。实现其中的某些功能。让用户使用得心应手。节约时间。那么如果要实现系统中的有些功能选项开启或者关闭。就需要对系统有一定的了解。那么在 Android 中实现默认开启某个功能可以通过以下几种方式&#xff1a; 一、在应用的设置中添加选项 …

Chromium 中js Fetch API接口c++代码实现(二)

Chromium 中JavaScript Fetch API接口c代码实现&#xff08;一&#xff09;-CSDN博客 接着上一篇继续介绍调用&#xff0c;上函数堆栈。 1、打开http://192.168.8.1/chfs/shared/test/test02.html 此标签进程ID12484&#xff0c; 2、打开vs附加上此进程ID12484 3、点击页面测…