在《iOS应用逆向工程》4.6.2节中,我们曾推荐使用iPhoneCake源的AppCrackr 1.7版给App砸壳。这种方式简单粗暴,省时省力,但正是因为它过于方便有木有,导致几乎所有iDevice用户都可轻松上手,随便亵玩,所以不少用户都拿它来破解程序,而不是学习《iOS应用逆向工程》,简直可以说是婶可忍叔不可忍!这也导致了iOS越狱开发社区普遍认为这个软件助长了盗版的气焰,没有脱离低级趣味,对iPhoneCake源进行了强烈谴责,责令其限期整改。迫于压力,iPhoneCake在前段时间将AppCrackr下架,而书中提到的xsellize源中的AppCrackr则是1.5旧版,已不能在高级系统中使用。所以,为了响应业界反盗版的呼声,提倡毛主席“自己动手丰衣足食”的革命精神,让“砸壳”这件事恢复单纯的研究目的,在这里我们会使用更偏geek一些的dumpdecrypted方式来给App砸壳,不再推荐AppCrackr、Clutch、Crackulous等纯UI方式。由于dumpdecrypted刚经历过一次大升级,目前网上可以找到的使用教程均已过期,所以这里我们手把手带大家进行一次完整的“砸壳 + class-dump”,请大家准备板凳瓜子汽水,开始围观。如果能对着电脑,边看边做,善莫大焉!楼猪才疏学浅,如有纰漏,敬请斧正,洗耳恭听,污言秽语,免开尊口,感谢支持!
 
一、设置
 
1. 下载dumpdecrypted的源码
源码下载地址是“https://github.com/stefanesser/dumpdecrypted/archive/master.zip”,下载后请将其解压至你习惯的位置
楼猪这里把它存放在/Users/wwc(自己电脑的名称)/Desktop/Code目录下
2. 确认你的iDevice系统版本
设置 -> 通用 -> 关于本机
3. 修改Makefile中的SDK字段
dumpdecrypted必须使用与iOS版本相同的SDK版本编译,才能正常工作。打开“终端(Terminal)”,输入

xcrun –sdk iphoneos –show-sdk-path,查看输出,看看目前的默认SDK是什么版本,例如楼猪的是“/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk”。这里分2种情况:

i. 如果你使用的iOS版本同以上输出的SDK版本符合(例如楼猪使用的正是iOS 6.1.5),则无需对dumpdecrypted工程中的文件作任何改动;
ii. 如果你使用的iOS版本同以上输出的SDK版本不符则需要更改Makefile(友情提示:可用文本编辑器打开)中的
SDK=`xcrun –sdk iphoneos –show-sdk-path`
为iOS版本相同的SDK版本。什么,你只有一个SDK?去https://developer.apple.com/downloads/index.action下载旧版本的Xcode,然后把里面的SDK提取出来。什么,不会提取?自己去Google一下,罚你今晚表睡觉了!提取出了旧版的SDK后,楼猪习惯把它们放在新版SDK相同的目录下,然后将
SDK=`xcrun –sdk iphoneos –show-sdk-path`
改为
SDK=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.X.sdk

SDK=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.X.sdk

,即iOS版本需要与SDK版本相同。       注意,5.1版SDK编译出的dylib是向下兼容的,可以用于iOS5.0,6.1版SDK同理。(注意:这个有待验证,楼猪还没这么干过)

4. 修改Makefile中的GCC_UNIVERSAL字段和dumpdecrypted.c
如果你的iOS/SDK版本是7.0,则goto “这里继续:”。如果并不是7.0,则需要修改Makefile中的GCC_UNIVERSAL字段和dumpdecrypted.c。将Makefile中的

GCC_UNIVERSAL=$(GCC_BASE) -arch armv7 -arch armv7s -arch arm64

改为

GCC_UNIVERSAL=$(GCC_BASE) -arch armv7 -arch armv7s

再将dumpdecrypted.c第76行的

if (lc->cmd ==LC_ENCRYPTION_INFO || lc->cmd == LC_ENCRYPTION_INFO_64)

改成

if(lc->cmd == LC_ENCRYPTION_INFO)

,保存。这里继续:接着直接cd到“/Users/wwc/Desktop/Code/dumpdecrypted-master/”下,然后输入“make”并回车,生成“/Users/wwc/Desktop/Code/dumpdecrypted-master/dumpdecrypted.dylib”。

5. 太麻烦?直接下载楼猪编译好的文件
 
二、砸壳

1.将“锤子”放入设备中

查看iOS设备的IP地址,然后在Mac上使用scp命令将dumpdecrypted.dylib文件放到iOS设备中:

$ scp dumpdecrypted.dylib root@192.168.xxx.xxx:/var/tmp

root@192.168.xxx.xxx's password:

dumpdecrypted.dylib                           100%   81KB  81.0KB/s   00:00

2.砸

选定一个让你觉得非常不爽或非常感兴趣的app,我就随便选了一个QQ。在iOS设备上打开iFunBox,查到它的可执行文件的路径为:/var/mobile/Applications/xxxxxxxx/QQ.app/QQ

然后用SSH连到iOS设备上,cd到刚刚动态库的路径:/var/tmp。

$ ssh root@192.168.xxx.xxx

root@192.168.xxx.xxx's password:

root# cd /var/tmp/

root# ls

FlipswitchCache/                              com.apple.audio.hogmode.plist

L65ancd.sock=                                 com.apple.tccd/

L65d.sock=                                    com.apple.timed.plist

MediaCache/                                   cydia.log

RestoreFromBackupLock*                        dumpdecrypted.dylib*

SpringBoard_reboot_flag                       launchd/

com.apple.assistant.bundleservicecache.plist  mobile_assertion_agent.log

砸壳(久等了):

  1. root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Applications/xxxxxxxx/QQ.app/QQ
  2. mach-o decryption dumper
  3. DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.
  4. [+] detected 32bit ARM binary in memory.
  5. [+] offset to cryptid found: @0xd5a90(from 0xd5000) = a90
  6. [+] Found encrypted data at address 00004000 of length 3047424 bytes - type 1.
  7. [+] Opening /private/var/mobile/Applications/EBBD26E9-DDBA-481E-9403-84D159436889/QQ.app/QQ for reading.
  8. [+] Reading header
  9. [+] Detecting header type
  10. [+] Executable is a FAT image - searching for right architecture
  11. [+] Correct arch is at offset 16384 in the file
  12. [+] Opening QQ.decrypted for writing.
  13. [+] Copying the not encrypted start of the file
  14. [+] Dumping the decrypted data into the file
  15. [+] Copying the not encrypted remainder of the file
  16. [+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset 4a90
  17. [+] Closing original file
  18. [+] Closing dump file

成果:

root# ls

FlipswitchCache/                              com.apple.audio.hogmode.plist

QQ.decrypted                                com.apple.tccd/

L65ancd.sock=                                 com.apple.timed.plist

L65d.sock=                                    cydia.log

MediaCache/                                   dumpdecrypted.dylib*

RestoreFromBackupLock*                        launchd/

SpringBoard_reboot_flag                       mobile_assertion_agent.log

com.apple.assistant.bundleservicecache.plist

其中的QQ.decrypted就是目标产物

 
///////////////////////注意://///////////////////////////
这一段楼猪没有得到验证,有心的小伙伴可以验证一下,然后反馈给楼猪,楼猪再次先谢过了。
 
class-dump
在崭新的21世纪,App的可执行文件一般都是fat binary,也就是说一个二进制文件里包含适合多个CPU架构使用的可执行文件,虽然CPU架构是向下兼容的(也就是说armv64可以执行armv7s的指令,反之则不行),但向下兼容一般会导致一部分性能的牺牲。这样如果一个binary既包含适用于armv7架构的可执行文件,又包含armv7s的,还包含arm64的,就意味着它可以在iPhone 4(armv7),4s(armv7),5(armv7s),5s(arm64)上都发挥100%的性能。虽然除了处女座以外的其他星座用户一般是感受不到这个性能的提升的~但是,机器比处女座还要处女座,它在执行一个fat binary时,会选择最适合自己CPU的那个可执行文件,其他的可执行文件其实是没有得到执行的。因此dumpdecrypted.dylib起作用的只有实际得到执行的那一个可执行文件,举个例子,如果Victim里含有armv7和armv7s这2种架构,而我们的操作机是一台iPhone5/4,那么dumpdecrypted砸掉的是armv7s/armv7那部分的壳,armv7/armv7s部分仍是有壳的。自然地,class-dump的作用对象必须是砸掉壳的binary,所以我们要在class-dump时指定目标,在本例中,就是
 class-dump –arch armv7s Victim.decrypted

class-dump –arch armv7 Victim.decrypted

///////////////////////注意://///////////////////////////

楼猪直接执行了class-dump命令提取了头文件,命令如下:

class-dump -H QQ.decrypted -o /Users/wwc/Desktop/Code/headers

等待命令执行完毕,查看这个目录,你想要的东西就在里面了。

这是楼猪借鉴了各方经验,加上自己亲自动手操作得到的结论,可能某些地方存在纰漏,希望各位小伙伴积极指正。小弟在此拜谢了。

IOS 逆向工程之砸壳的更多相关文章

  1. IOS逆向-砸壳笔记

    本人ios10.3.1 iphone6越狱机.方案三个. 方案一.dumpdecrypted.dylib 1. ssh到越狱机上,看WeChat可执行文件在哪. # ps aux|grep WeCha ...

  2. 最新iOS砸壳方式Frida (Mac OSX)

    1. 安装Frida 首先需要安装Python3,我下载的是 macOS 64-bit installer 安装,因Macbook本机自带python为2.7.x,故需要配置~/.bash_profi ...

  3. ios 逆向工程文档汇总

    iOS逆向工程工具集 http://www.jianshu.com/p/7f9511d48e05 移动App入侵与逆向破解技术-iOS篇 http://blog.csdn.net/heiby/arti ...

  4. iPhone手机越狱-逆向砸壳-代码注入

    iPhone手机越狱 逆向砸壳 代码注入 工具下载 操作越狱 安装待逆向应用(app) 使用OpenSSH连接手机 找到应用二进制文件地址 找到应用document沙盒地址 拷贝砸壳工具(dumpde ...

  5. Talking Ben App砸壳记

    需求: 导出Talking Ben app的头文件 实施: 1)准备材料: 越狱IOS设备一部,并安装Talking Ben游戏 IOS设备上安装open SSH IOS设备的/usr/bin 中安装 ...

  6. iOS逆向工程资料

    链接: 基于iOS逆向工程的微信机器人 - 猫友会大讲坛第1期 我的失败与伟大 —— 创业必备的素质(狗神经验谈)

  7. 我也要学iOS逆向工程--全局变量

    大家好!很久不见了.我之前去音乐学院进修爵士吉他去了.现在回来了.之前我一直在学windows开发和逆向.后来到了音乐学院,老师推荐了1个录音软件叫logic prox.可惜啊!当时我只有个索尼的笔记 ...

  8. iOS逆向工程,(狗神)沙梓社大咖免费技术分享。

    序言 简介:本文针对于广大iOS开发者,作为一名开发者,仅仅专注于一门语言可能已经不适用现在的市场需求,曾经因高薪和需求量巨大,而火爆一时的移动端开发者(Android,ios),如今的路却是不再那么 ...

  9. iOS逆向工程概述(转)

    逆向工程一词,对很多人来说可能很陌生,在android领域,我们经常会听到“反编译某个apk”,那么逆向工程从某种角度讲也包括反编译这项技术,这样一对比,可能我们就更容易理解逆向工程的定义了. 我们引 ...

随机推荐

  1. Java对象校验框架之Oval

      只要有接口,就会有参数的校验,目前开源的校验框架已经非常多了,不过不得不提一下Oval.OVal 是一个可扩展的Java对象数据验证框架,验证的规则可以通过配置文件.Annotation.POJO ...

  2. Vim自动补全神器:YouCompleteMe

    第一次听说这个插件还是在偶然的情况下看到别人的博客,听说了这个插件的大名.本来打算在实训期间来完成安装的,无奈网实在不给力,也就拖到了回家的时候.在开始准备工作的时候就了解到这个插件不是很容易安装,安 ...

  3. line-height属性使文字垂直居中原理

    原理:line-height与font-size的计算之差(在CSS中成为“行间距”)分为两半,分别加到一个文本内容的顶部和底部,这样就使得文字垂直居中了.

  4. pipe/popen/fifo

    pipe(管道) 专用于父子进程通信, 函数原型 int pipe(int fd[2]) fd[0]表示输入, fd[1]表示输出 如果父子进程要双向通信, 可以通过类似信号的功能进行控制, 也可以简 ...

  5. WPF-控件-ListView

    <Window x:Class="DataTemplate2.MainWindow" xmlns="http://schemas.microsoft.com/win ...

  6. Windows Phone中的几种集合控件

    前言 Windows Phone开发过程中不可避免的就是和集合数据打交道,如果之前做过WP App的开发的话,相信你已经看过了各种集合控件的使用.扩展和自定义.这些个内容在这篇博客里都没有,那么我们今 ...

  7. 【quartz】 理论知识

    属性的介绍 1.调度器属性:分别设置调度器的实例名(instanceName) 和实例 ID (instanceId).属性 org.quartz.scheduler.instanceName 可以是 ...

  8. 2016 系统设计第一期 (档案一)jQuery ajax serialize()方法form提交数据

    jQuery ajax serialize()方法form提交数据,有个很奇怪的问题,好像不能取到隐藏控件的值. //点击提交按钮保存数据 $('#btn_submitUser').click(fun ...

  9. WPF TextBox 的 EventTrigger & 重写控件

    遇到一个需求,在textbox获得焦点的时候,调用一个外部的软键盘. 这可以用两个不同的方法来达到目的. 1.EventTrigger 首先定义一个Style <Style x:Key=&quo ...

  10. PHP获取mysql数据表的字段名称和详细信息的方法

    首先我们需要了解下查询MySQL数据库/表相关信息的SQL语句: 代码如下: SHOW DATABASES                                //列出 MySQL Serv ...