IOS 逆向工程之砸壳

在《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. 太麻烦?直接下载楼猪编译好的文件

https://github.com/iosre/Ready2Rock/blob/master/dumpdecrypted_5.dylib

https://github.com/iosre/Ready2Rock/blob/master/dumpdecrypted_6.dylib

https://github.com/iosre/Ready2Rock/blob/master/dumpdecrypted_7.dylib

二、砸壳

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

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

$ scp dumpdecrypted.dylib [email protected]:/var/tmp

[email protected]‘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 [email protected]

[email protected]‘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

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

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

时间: 2024-11-09 02:02:53

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

《iOS应用逆向工程》学习笔记(六)使用dumpdecrypted砸壳

本来是打算用AppCrackr砸壳的,结果砸壳都是失败的,开始以为是App的加密太厉害了,后来才知道是因为AppCrackr太暴力了,引起公愤,结果被人投诉招致核心功能被迫关闭了. 幸好在RE官网搜到一个用dumpdecrypted砸壳的帖子.下面是我砸壳的经历. 一.造锤 1.下载dumpdecrypted源码 下载地址:https://github.com/stefanesser/dumpdecrypted/archive/master.zip,接着在Mac中解压. 2.确认iOS设备的版本

ios app 砸壳

这里介绍使用dumpdecrypted砸壳.原理是用DYLD_INSERT_LIBRARIES这个环境变量加载脱壳的动态链接库dumpdecrypted.dylib 1.ssh连接上越狱的机器,输入密码alpine ssh [email protected] 2.打开要砸的app,ps aux | grep var找到它的目录 yigewangde-iPhone:~ root# ps aux | grep var mobile    1118   0.0  1.0  1139072   9684

iOS逆向工程之给App脱壳

本篇博客以微信为例,给微信脱壳."砸壳"在iOS逆向工程中是经常做的一件事情,,因为从AppStore直接下载安装的App是加壳的,其实就是经过加密的,这个“砸壳”的过程就是一个解密的过程.未砸壳的App是无法在Class-dump.Hopper等工具中使用的.所以我们要将App进行砸壳处理.在Android开发中也存在App加壳的处理,比如什么360加固了,其实就是给App加一层壳. 本篇博客我们就以WeChat(微信)为例,从AppStore上下载微信并安装,然后使用dumpdec

(iOS逆向工程)class-dump 安装与使用

class-dump,是可以把OC运行时的声明的信息导出来的工具.说白了,就是可以导出.h文件.用class-dump可以把未经加密的app的头文件导出来.废话不多说.class-dump的下载地址是 http://stevenygard.com/download/class-dump-3.5.tar.gz 点击下载后解压后会有class-dump和源码文件.将class-dump 复制到/usr/bin/class-dump.同时打开Terminal,执行: sudo chmod 777 /u

iOS - 逆向工程

公司最近搞得物联网项目,很注重安全,对于我这种架构师,当然考虑到APP使用上的安全.分享一篇逆向基础文章. 1.ios逆向工程指的是在软件层面上进行逆向分析的一个过程.如果想要达到对ios软件较强的逆向分析能力,最好能非常熟悉ios设备的硬件构成.ios系统的运行原理,还要具备丰富的ios开发经验,比如:拿到一个App之后能清晰的推断出这个App使用的技术,包括引用了那些FrameWork,那些经典的第三方代码,以及整个App工程大致的文件个数等. 2.逆向工程的主要两个作用:首先是攻破目标程序

ios逆向工程-静态分析

最近在学习IOS逆向工程,查看网络上的资料也不是太多,边学边总结一下. 首先学习资料: 念茜(大神)的博客: http://nianxi.net <ios应用逆向工程 分析与实战> ----------------------------------------------------凌乱的分割线------------------------------------------ 其次讲讲要用到的工具(ios安装工具使用Cydia中搜索安装,有些需要数据源可以自行查找): 已经越狱的IOS设备

iOS逆向工程的一些资料

Apple开发.调试工具下载链接  https://developer.apple.com/downloads/index.action 逆向工具下载  http://pan.baidu.com/s/1nt3BKyX iOS运行时工具-cycript http://blog.csdn.net/sakulafly/article/details/29633627 DEMO http://bbs.iosre.com/forum.php?mod=viewthread&tid=123 http://bb

ARM指令集应该也算得上是iOS逆向工程的基础

当然,如果读者仅仅是想阅读污点跟踪相关的代码,可以去github中按照自己的需要下载对应部分源码即可.如实现变量级.Native级污点跟踪的代码基本都在dalvik目录下,单个函数调用操作所使用的栈部分被称为栈帧(stack frame)结构,其一般结构如上图所示.栈帧结构的两端由两个指针来指定.寄存器ebp通常用做帧指针(frame pointer),而esp则用作栈指针(stack pointer).在函数执行过程中,栈指针esp会随着数据的入栈和出栈而移动,因此函数中对大部分数据的访问都基

iOS逆向工程之使用LLDB的USB连接调试第三方App

LLDB是Low Level Debugger的简称,在iOS开发的调试中LLDB是经常使用的,LLDB是Xcode内置的动态调试工具.使用LLDB可以动态的调试你的应用程序,如果你不做其他的额外处理,因为debugserver缺少task_for_pid权限,所以你只能使用LLDB来调试你自己的App.那么本篇博客中就要使用LLDB来调试从AppStore下载安装的App,并且结合着Hopper来分析第三方App内部的结构.LLDB与Hopper的结合,会让你看到不一样的东西,本篇博客就会和你