ios逆向某易新闻 md5+aes

news2024/9/28 18:17:46

本期的案例比较简单,也许是ios逆向算法本来就比较简单的原因,所以前面我就多扯一些爬虫和逆向的东西。之前写的文章都是js逆向和android逆向的案例,这也是首篇ios的案例,所以会从入门开始讲起。

3大逆向对比

首先爬虫工程师大部分都是需要js逆向的,会安卓的人不多,ios的就更不用说了,js逆向中会安卓逆向的保守估计不超过40%,因为大部分人搞爬虫都是从js开始的,当然少部分会从安卓开始,而ios逆向和安卓逆向的比例不超过1:5,你去各大社区的论坛帖子数对比下就知道了,网上的ios协议分析也是少的可怜。学ios逆向有什么用处呢?对我们爬虫工程师来说就是可以增加一个技能,让你的简历脱颖而出,
很多招聘要求上都有写,会安卓逆向的优先,会ios逆向的优先。其次,ios的逆向及风控要比安卓逆向弱很多,如果安卓上业务过不去可以考虑ios,ios的很多app即使接口有加密也有很多不验证的(本篇会验证),并且不像安卓跑几次就封账号了。

ios难度与安卓对比

很多人说ios逆向比安卓简单,有以下几个原因
1 首先就是闭源,安卓开源导致的各种系统定制,各大安全厂商不得不对这些系统进行检测,对抗就是这样起来的。
2 iphone默认只允许用户从app store下载应用,并且上架到了app store的应用都被苹果加了一层壳,类似安卓的加固,安卓的叫脱壳,ios的叫砸壳,并且这个砸壳也是有成熟的方案的。对比下安卓的各大厂商的加固,虽然现在fart脱壳机可以脱很多整体加固和抽取加固,但是由于太过热门,现在也有很多厂商检测fart特征的,并且未来的第3代加固技术vmp加固你又该怎么办?
3 玩ios逆向的人少,对抗自然就少了,不过我这一篇文章也掀不起什么大风大浪。并且教程少,很多社区都没落了。
4 还有就是很多人以为设备的问题,ios逆向需要mac(其实win也够了,不开发插件的话),黑苹果也是够用的。还有就是iphone贵,现在的iphone6比pixel4便宜太多了,两三百就够了。
5 ios逆向处于调用系统加密库的时代,而安卓处于魔改算法,自写算法,白盒时代,前些天分析的x-zse-96就是一个魔改严重的AES。如果你用过安卓的算法助手就知道ios的加密类似于这个。
6 ios逆向的话我认为入门的话安卓要简单,因为有java层的加密给你体验,体验完事后你就得准备硬刚so了。整体来说还是ios要简单的。

正片开始

前提

肯定是需要一部iphone的,有预算的话最好不要选择太老的iphone,否则一些大型app你可能运行不起来,最好不要低于iphone6.电脑 win mac都可以

环境

需要能越狱的,并且在ios上安装好frida,同时配置好ssl kill switch2插件(类似安卓的justtrustme),这些教程都比较简单,网上都有资料,相信你都搞逆向了不会连这个配置都完不成吧!

抓包

app是从app store下载的,目标api是搜索接口
抓了两个包转python后对比一下
在这里插入图片描述
第一个关键词是淀粉肠,第二个关键词是可口可乐,文本对比后发现主要是sign和url中的不一样,没有看到搜索的关键词,正常人应该都会猜关键词在url中或者sign中,先看url中的5reA57KJ6IKg和淀粉肠有什么关系你觉得?应该会猜base 64吧,因为包在传输过程中有些数据字符或者空格直接传过去可能有问题,需要先base64一下。
所以关键就是这个sign了,这个sign看着也像是base64过的,长度是64并且长度固定,转成16进制是96位,也就是48字节,hash算法好像没有96位的,对称加密算法有可能,des分组长度8字节,aes分组长度16字节,这两个都有可能。
前面我们说过ios的很多都是调用的系统函数,aes和des都调用的是CCCrypt函数,CCCrypt还包括3des和rc4 rc2等等。所以可以先hook这个函数看看

frida-trace -UF -i CCCrypt

执行后当前目录会生成一个_handlers_的文件夹,子文件夹里有CCCrypt.js文件,如果你用过ida中的tracenatives插件就应该知道这个。
修改一下CCCrypt.js文件,初始生成的只会打印些简单的东西,只有参数的地址或者长度,修改成打印出加密的类型,key及key的长度,是否有iv,以及input和input的长度,output和output的长度,这份代码可以固定住,后续如果hook这个函数直接用这份就行了,当然你也可以自己改进一下

/*
 * Auto-generated by Frida. Please modify to match the signature of CCCrypt.
 * This stub is currently auto-generated from manpages when available.
 *
 * For full API reference, see: https://frida.re/docs/javascript-api/
 */

{
  /**
   * Called synchronously when about to call CCCrypt.
   *
   * @this {object} - Object allowing you to store state for use in onLeave.
   * @param {function} log - Call this function with a string to be presented to the user.
   * @param {array} args - Function arguments represented as an array of NativePointer objects.
   * For example use args[0].readUtf8String() if the first argument is a pointer to a C string encoded as UTF-8.
   * It is also possible to modify arguments by assigning a NativePointer object to an element of this array.
   * @param {object} state - Object allowing you to keep state across function calls.
   * Only one JavaScript function will execute at a time, so do not worry about race-conditions.
   * However, do not use this to store function arguments across onEnter/onLeave, but instead
   * use "this" which is an object for keeping state local to an invocation.
   */
  onEnter(log, args, state) {
    log(`CCCrypt(op=${args[0]}, alg=${args[1]}, options=${args[2]}, keyLength=${args[4]}, iv=${args[5]} dataIn=${args[6]}, dataInLength=${args[7]}, dataOut=${args[8]}, dataOutAvailable=${args[9]}, dataOutMoved=${args[10]})`);
    log('key',hexdump(args[3]));
    // log('iv',hexdump(args[5]));
    log('input',hexdump(args[6]));
    log('input len',args[7]);
    this.args8=args[8];
    this.arg10=args[10];
  },

  /**
   * Called synchronously when about to return from CCCrypt.
   *
   * See onEnter for details.
   *
   * @this {object} - Object allowing you to access state stored in onEnter.
   * @param {function} log - Call this function with a string to be presented to the user.
   * @param {NativePointer} retval - Return value represented as a NativePointer object.
   * @param {object} state - Object allowing you to keep state across function calls.
   */
  onLeave(log, retval, state) {
  log('output',hexdump(this.args8));
  log('output len',hexdump(this.arg10));
  }
}

改完只会再执行一次命令,并且输出到一个文件夹中,控制台输出太多会把一些输出冲掉。

frida-trace -UF -i CCCrypt -o 1.txt
这个时候抓包也要开着,不然输出太多不好找哪个是你要的。
在这里插入图片描述
在这里插入图片描述

把抓包中的sign转成16进制去文件里搜索
在这里插入图片描述

有结果,输入是fd99ce95acda41c8647d9520a061dba6,key的utf-8形式是neteasenewsboard,注意,如果utf-8是不可见字符的就用16进制形式的。iv是0x0,说明没有使用到iv,arg1=0x0说明用的第一种加密模式也就是aes,options=0x3代表PKCS7Padding和ecb模式
在这里插入图片描述
拿到cyberchef中加密一下结果也可以对得上。
接下来就是考虑下输入fd99ce95acda41c8647d9520a061dba6是什么了,32位考虑md5或者hmac md5,这个时候两个你都可以试一下,CC_MD5或者CCHmac,后者很少碰到,优先hook md5,这里提一下是为了提醒读者考虑这种情况,如果没hook到不要上来就往魔改去想。

/*
 * Auto-generated by Frida. Please modify to match the signature of CC_MD5.
 * This stub is currently auto-generated from manpages when available.
 *
 * For full API reference, see: https://frida.re/docs/javascript-api/
 */

{
  /**
   * Called synchronously when about to call CC_MD5.
   *
   * @this {object} - Object allowing you to store state for use in onLeave.
   * @param {function} log - Call this function with a string to be presented to the user.
   * @param {array} args - Function arguments represented as an array of NativePointer objects.
   * For example use args[0].readUtf8String() if the first argument is a pointer to a C string encoded as UTF-8.
   * It is also possible to modify arguments by assigning a NativePointer object to an element of this array.
   * @param {object} state - Object allowing you to keep state across function calls.
   * Only one JavaScript function will execute at a time, so do not worry about race-conditions.
   * However, do not use this to store function arguments across onEnter/onLeave, but instead
   * use "this" which is an object for keeping state local to an invocation.
   */
  onEnter(log, args, state) {
    this.args0 = args[0]; // 入参
    this.args2 = args[2]; // 返回值指针
  },

  /**
   * Called synchronously when about to return from CC_MD5.
   *
   * See onEnter for details.
   *
   * @this {object} - Object allowing you to access state stored in onEnter.
   * @param {function} log - Call this function with a string to be presented to the user.
   * @param {NativePointer} retval - Return value represented as a NativePointer object.
   * @param {object} state - Object allowing you to keep state across function calls.
   */
  onLeave(log, retval, state) {
    var ByteArray = Memory.readByteArray(this.args2, 16);
    var uint8Array = new Uint8Array(ByteArray);

    var str = "";
    for(var i = 0; i < uint8Array.length; i++) {
        var hextemp = (uint8Array[i].toString(16))
        if(hextemp.length == 1){
            hextemp = "0" + hextemp
        }
        str += hextemp;
    }
    log(`CC_MD5_arg=${this.args0.readUtf8String()}`);    // 入参
    log(`CC_MD5_result=${str}`);             // 返回值
    log(Thread.backtrace(this.context, Backtracer.ACCURATE)
      .map(DebugSymbol.fromAddress).join('\n') + '\n');
  }
}

同时也是开着抓包的。
在这里插入图片描述
入参是1E1CE0E2-4FDF-41A1-A9BE-74C5F425B4A61711255091 验证了是标准的md5,
入参由两部分组成1E1CE0E2-4FDF-41A1-A9BE-74C5F425B4A6和1711255091,前面部分是头部一个固定的值,后面的是时间戳。
这样的话sign就被我们成功逆向了,仅用frida hook就成功拿到结果了。ios中很多都是这样,当然大厂除外。
安卓中的应用后缀是apk,ios中的是ipa,安卓中的可以直接扔到jadx中反编译,ios的是砸壳后的mach-o文件是扔到ida中的,看的是c代码,并且这个mach-o文件是很大的,如果一个100mb的mach-o文件,ida分析都需要好几个小时,如果是安卓的so可能也就十几秒的事情。
砸壳的方式有很多种,静态砸壳,动态砸壳,最常用的就是frida-ios-dump
地址:https://github.com/AloneMonkey/frida-ios-dump,使用方式自行百度。

总结

本章案例是比较简单的入门案例,感兴趣的可以尝试复现一下,有iphone即可。
如果是标准的oc方法,ios逆向确实比安卓逆向要简单,涉及到自写或者魔改的就需要去看ida中的代码了。
技术交流+lyaoyao__i(两个_)
微信公众号
在这里插入图片描述
知识星球
在这里插入图片描述
如果你觉得对你有帮助的话也可请作者和一杯咖啡
在这里插入图片描述

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

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

相关文章

Objective-C—Class底层结构探索,真心分享给你!!!

isa 走位图 在讲 OC->Class 底层类结构之前&#xff0c;先看下下面这张图&#xff1a; 通过isa走位图 得出的结论是&#xff1a; 1&#xff0c;类&#xff0c;父类&#xff0c;元类都包含了 isa, superclass 2&#xff0c;对象isa指向类对象&#xff0c;类对象的isa指向了元…

C语言操作符和数据类型的存储详解

CSDN成就一亿技术人 目录​​​​​​​ 一.操作符 一.算数操作符&#xff1a; 二.位移操作符&#xff1a; 三.位操作符&#xff1a; 四.赋值操作符&#xff1a; 五.单目操作符&#xff1a; 六.关系操作符&#xff1a; 七.逻辑操作符&#xff1a; 八.条件操作符&…

Java学习笔记 | JavaSE基础语法05 | 方法

文章目录 0.前言1. 方法概述2. 方法的定义和调用2.1 无参数方法定义和调用2.2 带参数方法定义和调用1 带参数方法定义和调用2 形参和实参3 带参数方法练习 2.3 带返回值方法的定义和调用1 带返回值方法定义和调用2 带返回值方法练习13 带返回值方法练习24 带返回值方法练习3 3.…

V R元宇宙平台的未来方向|V R主题馆加 盟|游戏体验馆

未来&#xff0c;VR元宇宙平台可能会呈现出以下发展趋势和可能性&#xff1a; 全面融合现实与虚拟世界&#xff1a; VR元宇宙平台将更加无缝地融合现实世界和虚拟世界&#xff0c;用户可以在虚拟环境中进行各种活动&#xff0c;与现实世界进行互动&#xff0c;并且体验到更加逼…

C程序编译、链接与项目构建

C程序编译、链接与项目构建 摘要C编译环境静、动态库介绍gcc与g和程序编译、链接Visual Studio创建和链接库动态库的显示调用 Make介绍安装使用 CMake介绍安装使用构建方式内部构建外部构建构建使用静/动态库常用[系统]变量常用指令CMake模块 Make与CMake的联系与区别 摘要 本…

代码随想录|Day26|贪心01|455.分发饼干、376.摆动序列、53.最大子数组和

455.分发饼干 大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子。 局部最优&#xff1a;尽量确保每块饼干被充分利用 全局最优&#xff1a;手上的饼干可以满足尽可能多的孩子 思路&#xff1a;大饼干 尽量分给 大胃口孩子 将小孩和饼干数组排序&#xff0c;我们从大到…

40+重量级DFLab合成模型含各种神丹底丹万能模型合集分享

之前玩DFL软件积累下来的资源&#xff0c;部分模型非常稀缺&#xff0c;之前买的都很贵&#xff0c;现在不玩了&#xff0c;分享给有缘人&#xff0c;懂货的自然懂。必须懂得怎么用再下载&#xff0c;否则对你没有任何价值。点击下载 所见即所得。其中包含几个重量级稀缺资源&…

新款理想L7一边增配一边减配,难怪大家都去买华为问界

文 | AUTO芯球 作者 | 雷歌 我真是要被理想汽车笑死了&#xff0c;真不愧是“定语榜单之王”。 几年前理想汽车搞了一个“中国市场新势力品牌销量周榜” 两个定语&#xff0c;将比亚迪&#xff0c;特斯拉排除在外&#xff0c;自己在自己打造的榜单里做了一年多的冠军宝座。…

试题E(求阶乘)

解题思路&#xff1a; 写不出来&#xff0c;看的题解。要想凑个10&#xff0c;就必须要有一个2和5&#xff0c;但是明显在一个阶乘里&#xff0c;因子为2的数量一定多余5的数量&#xff0c;所以计算5的数量。 解题代码&#xff1a; import java.util.Scanner; ​ public clas…

RabbitMQ 01

01.定义 02.功能

何为布控球?布控球的分类对比

主要的分类有&#xff1a; 根据内部的主控板卡的系统分类&#xff0c;典型的是基于海思芯片的嵌入式LINUX系统的&#xff0c;一般出国标GB28181&#xff0c;另外一种是剑走偏锋的安卓系统的&#xff0c;需要把球机的输出YUV转换为UVC接入安卓主板&#xff0c;作为外接USB摄像头…

Matplotlib数据可视化实战-2绘制折线图(1)

函数plot是matplotlib.pyplot模块中的一个重要函数&#xff0c;用于在图形中绘制折线图。其基本用法是plot(x, y, [fmt], **kwargs)&#xff0c;其中x和y分别代表X轴和Y轴上的数据点&#xff0c;通常是以列表、数组或一维序列的形式给出。通常用的参数有&#xff1a; 基本参数…

大学教材《C语言程序设计》(浙大版)课后习题解析 | 第一、二章

概述 本文主要提供《C语言程序设计》(浙大版) 第一、二章课后习题解析&#xff0c;以方便同学们完成题目后作为参考对照。后续将写出三、四章节课后习题解析&#xff0c;如想了解更多&#xff0c;请持续关注该专栏。 专栏直达链接&#xff1a;《C语言程序设计》(浙大版)_孟俊宇…

《深入浅出LLM 》(二):大模型基石知识

&#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料&#xff0c;配有全面而有深度的专栏内容&#xff0c;包括不限于 前沿论文解读、…

抖音IP属地怎么更改

抖音是一个非常受欢迎的短视频平台&#xff0c;吸引了无数用户在上面分享自己的生活和才艺。然而&#xff0c;随着快手的火爆&#xff0c;一些用户开始担心自己的IP地址会被他人获取&#xff0c;引起个人隐私风险。那么&#xff0c;抖音用户又该如何更改到别的地方呢&#xff1…

ArcGIS添加天地图底图服务

目录 一、注册天地图官网、申请Key 二、ArcGis配置和使用 1、配置 2、使用 三、其他方法 一、注册天地图官网、申请Key 进入官网&#xff0c;并注册账号。 地址&#xff1a;国家地理信息公共服务平台 天地图 (tianditu.gov.cn) 点击地图API&#xff0c;申请Key。 注意&am…

python闭包详解(实例)

“闭包”这个词语相信大多数学过编程的同学并不陌生&#xff0c;但是有时候理解起来还是有一定难度。 先看定义&#xff1a;闭包是由函数和与其相关的引用环境组合而成的实体。比如参考资源中就有这样的的定义&#xff1a;在实现深约束时&#xff0c;需要创建一个能显式表示引…

线段树(算法思想+模板+例题)

基础思想 : 介绍 线段树可以用来维护区间信息(区间和 &#xff0c; 区间最值 &#xff0c; 区间GCD等) &#xff0c;可以在log n的时间内执行区间修改 和 区间查询 ; 1 . 叶子结点的特点是左右结点相等 &#xff0c; 存储元素本身; 2 . 非叶子结点存储的是区间内的统计值 &…

力扣|两数相加|链表

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

用户多部门切换部门,MySQL根据多个部门id递归获取所有上级(祖级)、获取部门的全路径(全结构名称)

背景 之前做过的项目&#xff0c;都是一个用户就一个部门的&#xff0c;现在碰到个一个用户在多个部门的需求&#xff0c;而且需要可以切换不同部门查看不同数据。 就比如说一个大公司下面有多个子公司&#xff0c;每个子公司有好多部门、子部门等等&#xff0c;然后有部分用…