IOS逆向学习-加壳、脱壳

  • 1. 加壳和脱壳
    • 1.1 加壳的原理
    • 1.2 脱壳
    • 1.3 APP的可执行文件是否加壳
    • 1.4 IOS中的脱壳工具
      • 1.4.1 Clutch
      • 1.4.2 Clutch的使用
      • 1.4.3 dumpdecrypted
      • 1.4.4 dumpdecrypted过程中遇到问题
      • 1.4.5 class-dump脱壳后的文件问题
      • 1.4.6 实战-theos工具
        • 1.4.6.1 安装theos工具
        • 1.4.6.2 theos创建项目

1. 加壳和脱壳

从appStroe上下载的app都是加壳(对可执行文件进行过加密)的文件,你直接使用class-dump、hopper工具 是解析不出来的,但是某些app通过其他工具安装,比如PP助手安装是可以直接解析的

流程: IPA文件 —上传–> AppStore(对其上传的可执行文件进行了加壳操作) -----下载—> iphone手机上

1.1 加壳的原理

  • 什么是加壳?

    • 利用特殊的算法,对可执行文件的编码进行改变(比如压缩、加密),已达到保护程序代码的目的
  • 加壳的过程:

1.2 脱壳

  • 什么是脱壳?

    • 摘掉壳程序,讲未加密的可执行文件还原出来(有些人也成为“砸壳”)
  • 脱壳主要有两种方法: 硬脱壳、动态脱壳

  • IOS上一般是采用硬脱壳的方式,直接脱壳

1.3 APP的可执行文件是否加壳

  • 通过iFunBox知道手机上安装app的路径,然后把可执行的Mach-o文件拷贝到电脑上,通过以下几种方式查看app是否加壳:

    • 在手机上运行软件,然后再终端,登录手机,执行指令ps -A打印出app的路径:

    • 通过iFunBox找到手机上的这个路径,并把可执行文件拷贝到电脑上:

    • 可以通过class-dump指令来看看能否导出头文件,如果是加密的文件导出来头文件上这样的,只有一个文件,而正常的是多个头文件:

    • 通过命令行otool指令(otool -l 可执行文件路径 | grep crypt)打印Load command去查看Mach-O文件是否加壳:

    • 使用MachOView 产看 Load commands 中的 LC_ENCRYPTION_INFO 属性中 Crypt的值 如果是非0的数值 就表示加壳(加密)过, 如果是0则表示没有加密 , arm64 架构的话LC_ENCRYPTION_INFO_64 会在后面加上64 arm7则不需要

1.4 IOS中的脱壳工具

  • IOS中有很多好用的脱壳工具

    • Cluth:https://github.com/KJCracks/Clutch
    • dumpdecrypted:https://github.com/stefanesser/dumpdecrypted/
    • AppCracker、Crackulous

1.4.1 Clutch

  • 下载最新的Release版:https://github.com/KJCracks/Clutch/releases
  • 下载下来之后,建议改名称,去掉版本号,改名为Clutch
  • 将Clutch文件拷贝到iPhone的/usr/bin目录下
  • 如果在iPhone上执行Clutch指令,权限不够,赋予可执行权限chmod +x /usr/bin/Clutch

1.4.2 Clutch的使用

  • 列出已安装的APP:

  • 输出APP序号或则Bundle Id进行脱壳操作:Clutch -d APP序号或BundleId,脱壳过程报错Error: Failed to dump <xxxx> with arch arm64

  • 注意: Clutch工具经过本人验证在IOS12的系统上已经失效了,无法脱壳,(本人也查找了下网上相关资料,大部分网友表示该工具在IOS12上失效,已无法使用)

1.4.3 dumpdecrypted

  • 下载源代码,然后再源码目录中执行make指令进行编译,获取dylib动态库文件

  • dylib文件拷贝到iPhone上(如果是root用户,建议放/var/root目录)

    • 将终端进入dylib所在的目录
    • 使用环境变量DYLD_INSERT_LIBRARIESdylib注入到需要脱壳的可执行文件(可执行文件路径可以通过ps -A查看获取)
  • 指令示例:DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/ABFAC835-3195-4C85-9384-E25454911641/Reading.app/Reading 然后执行

  • 砸壳成功:

也可以通过iFunBox来查看:

  • 查看文件的属性:

1.4.4 dumpdecrypted过程中遇到问题

  • IOS12以上系统报一下错误,说明缺少签名:
dyld: warning: could not load inserted library 'dumpdecrypted.dylib' into hardened process because no suitable image found.  Did find:dumpdecrypted.dylib: code signature in (dumpdecrypted.dylib) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.

解决办法: 使用 ldid 工具执行下面的代码ldid -S dumpdecrypted.dylib命令给 dumpdecrypted.dylib直接签名就可以

  • 遇到XcodeSDK版本和越狱手机的SDK版本不匹配,我的Xocde 版本11.2.1 ,越狱手机版本12.5.1
dyld: Symbol not found: ___chkstk_darwinReferenced from: dumpdecrypted.dylib (which was built for iOS 13.2)Expected in: /usr/lib/libSystem.B.dylibin dumpdecrypted.dylib
Abort trap: 6

解决办法:需要下载一个对应SDK版本低 Xcode,重新编译动态库,然后再脱壳,如果你已经安装了高版本的Xocde,例如12.3 ,在打开Xcode10.3的过程中报错:

  • 解决办法:

    1. 根据上面PlugIn Pathcd: /Applications/Xcode10.3.app/Contents/Developer/usr/lib
    2. 找到libMainThreadChecker.dylib插件
    3. 修改其名称:mv libMainThreadChecker.dylib libMainThreadChecker.dylib.00
    4. 然后再打开Xcode10.3 就不会报错了
  • 如遇一下错误:

  • 原因:对dyld所在的文件夹权限不够

  • 解决方案:将dyld放在用户所在的文件夹。比如:

    • 如果是root用户,请将dyld放在/var/root目录
    • 如果是moblie用户,请将dyld放在/var/moblie目录

1.4.5 class-dump脱壳后的文件问题

脱壳成功后,使用class-dump指令,导出头文件,但是报如下错误:

经过查找,可能是swift和OC混编导致,无法dump出头文件, 目前没有找到有效的方法

1.4.6 实战-theos工具

思路: 首先通过Reveal工具找到广告页面(UIView),然后找到其对应的init方法,我们需要hook初始化方法。达到我们去掉广告的页面的目的,实质:hook代码----> 生成.deb插件,在安装到手机上(.deb安装包: 一些越狱插件)

1.4.6.1 安装theos工具

  • 安装签名工具brew install ldid (直接通过Homebrew工具直接安装软件)
  • 修改环境变量
vim ~/.bash_profile
export THEOS=~/theos
export PATH=$THEOS/bin:$PATH
  • 注意:

    • 只要配置到PATH这个环境变量中, 这样你就可以通过终端不管是在那个路径下都可以方法这个指令,相当于我们直接方法/usr/bin 、/usr/local/bin 下面指令一样
    • 引用环境变量是$环境变脸名 例如:$PATH
    • :的作用是 把当前配置的环境变量和以前的环境变量加起来,都可以起作用,不然就是直接覆盖掉系统配置好的环境变量了
    • 打印环境变量的值:echo 环境变量,例如:echo $PATH
    • .bash_profile : 用来编辑电脑当前用户的环境变量,如果你发现编辑这个文件配置好环境变量,但是打印环境变量的值是空,这是因为文件还没有生效,需要执行下文件source .bash_profile 让文件的内容马上生效。(所以建议大家以后修改了 export 这种环境变量以后,执行一个source操作,这样环境变量才回生效)
  • 下载theos:git clone --recursive https://github.com/theos/theos.git $THEOS

1.4.6.2 theos创建项目

配置上述环境变量之后,并且下载theos成功之后,那么我们可以使用theos来创建项目,编写插件代码。

  • 验证theos是否安装成功(在终端输入指令nic.pl):
    弹出如图所示界面,表示theos安装成功, 我们创建项目选择15(iphone/tweak)

  • 创建项目步骤:

  • 创建好的项目结构目录:

接下来我们可以把项目拖拽到SubLime Text工具中编辑,开始编写文件

  • 配置环境变量:

  • 编写hook代码:

    • 首先可以把SubLime Text的调整为Objective-C++模式可以编辑
  • 编写好的hook类:

  • 编译、打包, 然后直接安装到手机上(make install

  • 如何卸载这个插件,在手机上利用iFunBox删除文件:

IOS逆向学习-加壳、脱壳相关推荐

  1. 壳学习一:PECompact 2.x 加壳脱壳

    壳学习一:PECompact 2.x 加壳脱壳 SkyJacker Http://blog.csdn.net/skyjacker Email:HeMiaoYu <At> gmail.com ...

  2. IOS逆向学习-Tweak

    IOS逆向学习-Tweak 1. theos指令及可能遇到问题 2. thes的实战练习 2.1 将桌面的更新数字去掉 2.2. 给微信发现界面增加两行功能 2.2.1 hook代码语法知识 2.2. ...

  3. 壳与加壳脱壳基础知识

    在自然界中,我想大家对壳这东西应该都不会陌生了,由上述故事,我们也可见一斑.自然界中植物用它来保护种子,动物用它来保护身体等等.同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程 ...

  4. PE结构详解(加壳脱壳必备知识)第二篇·存储地址介绍

    昨天分享了一篇PE结构详解(加壳脱壳必备知识),本篇是上一篇续篇,主要介绍关于PE结构的三种存储地址 VA.RVA.FILEOFFSET及转换方式,希望对你有所帮助. 一.关于VA.RVA.FILEO ...

  5. 吾爱软件加壳脱壳工具箱 v 1.0

    集整理一些常用软件加壳脱壳工具制作成工具箱,希望大家喜欢. 下载地址 本文转自haiyang45751CTO博客,原文链接:http://blog.51cto.com/haiyang457/19288 ...

  6. PE结构详解(加壳脱壳必备知识)

    近期太忙一直没有抽出时间来更新文章,周末抽空写一篇关于PE结构相关知识,PE结构是windows下的可执行文件的标准结构.可执行文件的装载.内存分步.执行等都依赖于PE结构.如果要掌握反病毒.免杀.权 ...

  7. 【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )

    文章目录 一.动态加载 二.第一代加壳技术 ( DEX 整体加固 ) 三.第二代加壳技术 ( 函数抽取 ) 四.第三代加壳技术 ( Java 函数 -> Native 函数 ) 五.so 动态库 ...

  8. iOS逆向工程之App脱壳

    本篇博客以微信为例,给微信脱壳."砸壳"在iOS逆向工程中是经常做的一件事情,,因为从AppStore直接下载安装的App是加壳的,其实就是经过加密的,这个"砸壳&quo ...

  9. 加固加壳脱壳分析(3)_实战手动脱壳某家加固

    手动脱壳准备 一个加固的Apk文件 frida环境 一台Root手机 手动脱壳准备 本次的脱壳目标就是一个叫每日优先的软件 我在论坛里分析了很久 最后发现这个软件适合用来练手 目标就是脱出完整的dex ...

  10. 加固加壳脱壳分析(1)_加固加壳原理和几代壳

    什么是加固加壳 对App资源代码进行保护,使其不容易被反编译工具解开. 加固的核心在于保证软件正常运行的同时又能保证源码的安全性. 为什么要加固加壳 若应用不做任何安全防护,极易被病毒植入.广告替换. ...

最新文章

  1. python中的连续比较是什么_在python中提取连续行之间的差异
  2. pyhton/Perl设置 sublime text2
  3. 经典C语言程序100例之八七
  4. shell常用命令之curl: -w,–write-out参数详解
  5. 设计模式练习_设计练习是邪恶的
  6. 5.1 入门整合案例(SpringBoot+Spring-data-elasticsearch) ---- good
  7. php8更新,PHP 8 中新特性以及重大调整
  8. git撤销git commit
  9. 获取计算机最大磁盘,Qt获取电脑磁盘容量(示例代码)
  10. jsp登录密码加密_[源码和文档分享]基于JSP和MYSQL数据库的在线购物网站的设计与实现...
  11. struts2中的method
  12. 基于shell 脚本处理文本数据流程
  13. java8—Stream
  14. R实例:非典型的数据可视化(一)
  15. 手机3D建模初现端倪,预计今年市场规模将达1.45亿美元
  16. 菜鸟打印助手接口_打印快递单,这4件事儿你非做不可
  17. 树莓派4使用CSI摄像头
  18. cdr对象管理器怎么用_CDR新手必看之对象管理的方法
  19. 【畅销书】浪潮之巅--吴军
  20. 很自由的PDF在线转换器

热门文章

  1. chm打不开解决办法
  2. 世嘉MD游戏开发进阶篇【一】:两点之间的距离
  3. xis表格怎么打印_《如何通过虚拟打印机将文件打印成excel文档》 表格怎么打印出来...
  4. ElasticJob分布式调度,监听器的使用附源码(四)
  5. php将文字生成图片显示,php生成文字图片效果
  6. PC端微信自动发送机器人
  7. svn忽略class文件夹上传的方法
  8. 以太网转DMX模块核心模块 支持ArtNet sACN DMX RDM
  9. 4.2 制定项目章程
  10. android 截屏实现的几种方式