zoukankan      html  css  js  c++  java
  • APP密码算法通用分析方法

    APP密码算法通用分析方法

    • 在APP测试过程经常会遇到报文被加密的情况,之前在大部分的情况,可能需要进行脱壳,逐行分析代码,获取算法,编写解密的程序(工具)—— 适用于任何情况下的万能解法。
    • 因为过程实在是有些繁琐,文章里是我尝试分析app加密算法的一些取巧的方式,可以进行尝试。

    密码算法介绍

    密码算法强度依赖

    • 密码算法源头可以追溯到古典算法。 一般而言古典算法依赖于两种方式——移位和代换混淆明文,从而无法破译。但是对于大多数的古典密码而言,其加密强度依赖于算法保密性以及密钥保密。
    • 但是对于现代密码学而言,加密强度完全依赖于密钥(算法在某种程度上一定会被获取,而设计好的算法存在一定的难度)。
    • 对于我想要做的app算法分析而言,我在大部分的情况是在寻找密钥。找到密钥,套用几个现代密码学算法,完成分析。

    涉及概念

    • 我在实际的接触过程中,大部分的人其实对于密码涉及到的相关概念其实认识的很模糊,经常统称为密码算法,这里进行简单的介绍
      • Hash算法(哈希算法)
        • 常见的包括md5、sha1、sm3。 这类算法主要对信息进行摘要,从摘要两个字应该能够意识到进行这种算法获取的数据无法还原成原来的信息,因为只保存了部分数据。
        • 那么我们常说的md5解密、sha1解密,又是什么呢?其实这是在说明一类情况 Hash碰撞,—— A通过hash函数生成了C,B也通过hash函数生成了C,这样一种情况。由于hash字符串的空间几乎无限大,那么我们可以理解A与B是相同的内容,所以说C通过md5解密生成了B 。我们通过提交B来代替A——对于接受对象而言的输出都是C所以是一致的(当然实际上A,B也可以不同,具体可以了解下王小云破解md5)
      • 编码算法
        • 这一类就比较容易和密码算法混淆了,这类算法主要是为了解决传输或者转换过程中可能出现的错乱。 一般而言没有密钥这样的说法,就是规定了一套编码和解码的算法,常见算法有base64、十六进制字符串
      • 密码算法
        • 其实到现在为止,密码算法一般指的就是现代密码学——几类对称密码和非对称密码。
        • 两者的区别就在于,加密和解密的密钥是否能够互相还原。
      • 分组算法(block cipher mode)
        • 密码算法都是针对具体的块进行加密,多个块之间怎么连接,就是分组算法
        • 例如ECB、CBC等,具体可以去wiki 搜索 block cipher mode
      • 填充模式
        • 长度不够的块,怎么填充。

    分析原理

    • 为什么我们在理论上一定能够突破密码算法? 我作为客户端的角色进行操作,理论上我能控制客户端所有的内容。数据在客户端完成加密、发送。  只要客户端能够提供加密的能力,我理论上也能。
    • 既然我们不想要直接分析应用app的源代码,那么我们能够工程化控制的就是执行环境,就说下图架构中除了application的所有内容

    • 众所周知,越到下面难度越高,数据被处理和变化也越多。
    • 当然这里比较好的消息是,大部分应用调用了java扩展包中的加密算法。那我们是不是能够通过hook相关的函数来获取密码算法的调用情况呢?
    • PS: 大佬们都已经整完了,上工具,丢掉脑袋,当个tool man。

    工具准备

    分析过程

    • PS: 我想这个正文可能是最短的正文了——工具流水线。

    inspeckage

    • 1. 使用inspeckage加载app,查看调用情况以及一些其他属性

    • 2. 点到crypto模块下,可以看到使用加密算法的情况

      • 密钥是:B9DC7BFD361F8348 IV: nmeug.f9/Om+L823 算法是Java 默认的AES
    • 从列表里也可以看到,密码没有打印调用栈,有时候可能不清楚哪个数据包是正确的(SDK、本地数据等等都可能调用密码算法)

    CryptoFucker

    • 通过hook,输出到ydsec文件夹下,把应用包名作为文件名
    • 运行后,可以查看相关的信息,定位调用栈(后续可以修改相关代码)

    总结

    • 其他类似工具都自己去尝试吧,上述工具都是github上的,可以根据自己的需要去修订一个合适的版本。

    常见的算法组合

    • AES/DES
      • 仅仅采用AES,密钥可能通过简单的编码或者置换存放在数据包中。
      • 硬编码在应用当中,这类情况用文中的方式较容易解决。
    • RSA + AES
      • 通过RSA加密AES密钥,与客户端进行协商,或者保存在数据包中。
    • 添加MAC
      • MAC(消息认证码),数据包的hash值作为数据包一部分。一般hash算法采用md5或者sha-1

    加解密

    • 知道相关密钥信息和IV等信息,就按照提前准备好的密码工具进行加解密即可

  • 相关阅读:
    zabbix监控
    ipv4固定ip地址
    CentOS7 内核优化 修改参数
    流媒体服务器 red5
    linux安装git
    zabbix-钉钉报警媒介
    Windows下利用IIS建立网站并实现局域网共享
    docker的简单操作和端口映射
    docker概述和安装及基本操作
    VMware Workstation创建Windows2012server虚拟机
  • 原文地址:https://www.cnblogs.com/alka1d/p/11753050.html
Copyright © 2011-2022 走看看