iOS逆向(七)常用逆向工具介绍

3,773 阅读6分钟

逆向工具集和安装和使用

iOS逆向工程的工具大致可分为四类:

  • 检测工具 如:Reveal、tcpdump等
  • 反编译工具(反汇编工具 - 分析二进制文件并得到一些信息) 如:IDA、Hopper Disassembler、classdump等
  • 调试工具 如:lldb、Cycript等
  • 开发工具 如:Xcode、theos等

1 、classdump介绍

class-dump是用来dump目标文件的类信息的工具。它利用Objective-C语言的runtime的特性,将存储在mach-O文件中的@interface和@protocol信息提取出来,并生成对应的.h文件。

注:class-dump只能导出未经加密的App的头文件。classdump是对"otool -ov" 信息的翻译,以一种我们熟悉的易读的方式呈现,官方介绍如下:

This is a command-line utility for examining the Objective-C runtime information stored in Mach-O files. It generates declarations for the classes, categories and protocols. This is the same information provided by using ‘otool -ov’, but presented as normal Objective-C declarations, so it is much more compact and readable.

classdump官网地址

打开链接后,选择class-dump-3.5.dmg,进行下载。下载完成之后,将dmg文件中的class-dump复制到/usr/bin目录,并在终端执行如下执行进行赋权:

sudo chmod 777 /usr/bin/class-dump

然后运行class-dump指令,即可看到如下结果:

class-dump的简单使用

class-dump -H /Applications/Calculator.app -o /Users/GofLee/Desktop/CalculateHeads

【说明】

  • /Applications/Calculator.app:计算器app的路径;
  • /Users/GofLee/Desktop/CalculateHeads:存放dump结果的头文件文件夹路径。
  • 执行上面的指令之后,我们可以在
  • /Users/GofLee/Desktop/CalculateHeads 目录下看到生成的.h列表

从上面的结果可以看到,我们有了这些.h文件之后,就可以初步了解目标App的程序结构。后面可以结合Reveal和cycript工具,更精准的分析目标App某个页面的功能实现。 同样的,我们也可以导出AppKit、UIKit的头文件:

class-dump -H /System/Library/Frameworks/AppKit.framework -o /Users/GofLee/Desktop/AppKitHeaders

【注意】:有时class-dump指令会执行失败,无法得到想要的头文件,或头文件的内容是加密的密文。出现这种情况是因为class-dump的作用对象必须是未经加密的可执行文件,一般App Store中下载的App都是经过签名加密的,这个时候需要先进行砸壳。

class-dump-z 下载地址

class-dump-z 是对 class-dump 和 class-dump-x 的改进版,完全用C++重写,避免动态调用,这使得 class-dump-z 比 class-dump 和 class-dump-x快10倍左右,并且可以在 Linux、Mac、 iPhone 上运行。

dumpdecrypted 砸壳工具

dumpdecrypted地址

cd到 dumpdecrypted的目录下,然后运行如下命令

make //make之后会生成dumpdecrypted.dylib动态库文件

然后将该动态库文件拷贝到手机的tmp文件的目录下
  • 定位要砸壳的StoreApp的执行文件名字TargetApp (ps -e 可以得到全路径)
  • 定位要砸壳的StoreApp的Document目录:
cycript -p TargetApp [[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0] 
  • 得到路径:
 #"file:///var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/" 
  • 进入Document目录:
cd /var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/
  • 拷贝dumpdecrypted.dylib:

注意:作如下操作之前你如要使用scp将dumpdecrypted.dylib文件提前拷贝到手机

scp dumpdecrypted.dylib . DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat

获取沙盒路径的方式

ps -e | grep WeChat  //找到微信的进程  app路径

cycript -p WeChat    //在进程中开启cycript

dir = NSHomeDirectory() //获取沙盒路径

control +D   关闭cycript
  • 获取沙盒路径之后 进入沙盒路径的Documents的路径之下 以上的具体操作如下
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB root# ls
Documents/  Library/  tmp/
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB root# cd Documents/
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root# ls
00000000000000000000000000000000/  MMResourceMgr/   app_tutt/
079d66db896f66ef28a7e029c2eff367/  MMappedKV/       heavy_user_id_mapping.dat
CrashReport/                       MemoryStat/      mmupdateinfo.archive
LocalInfo.lst                      OpenImResource/
LoginInfo2.dat                     SafeMode.dat
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root# cp /tmp/dumpdecrypted.dylib .      //这一步需要提前将dumpdecrypted.dylib文件拷贝到手机的/tmp文件夹下
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root# ls
00000000000000000000000000000000/  MMResourceMgr/   app_tutt/
079d66db896f66ef28a7e029c2eff367/  MMappedKV/       dumpdecrypted.dylib*
CrashReport/                       MemoryStat/      heavy_user_id_mapping.dat
LocalInfo.lst                      OpenImResource/  mmupdateinfo.archive
LoginInfo2.dat                     SafeMode.dat
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root#
  • 使用如下命令进行 获取解密后程序
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/E736B0BC-7ED4-42CE-8513-CE52F88F5F52/WeChat.app/WeChat

如果以上命令运行完成之后报如下错误 表示dumpdecrypted.dylib 没有进行签名 需要先进行签名

dyld: could not load inserted library 'dumpdecrypted.dylib' because no suitable image found.  Did find:
    dumpdecrypted.dylib: required code signature missing for 'dumpdecrypted.dylib'

    /private/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents/dumpdecrypted.dylib: required code signature missing for '/private/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents/dumpdecrypted.dylib'


Abort trap: 6
  • 签名:
ldid -S /private/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents/dumpdecrypted.dylib
  • 签名过后再次使用如下命令
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/E736B0BC-7ED4-42CE-8513-CE52F88F5F52/WeChat.app/WeChat

ls 后的目录结构 ,其中WeChat.decrypted是解密后的文件

9-A7B1-AA3B8FD268CB/Documents root# ls
00000000000000000000000000000000/  MMResourceMgr/   WeChat.decrypted
079d66db896f66ef28a7e029c2eff367/  MMappedKV/       app_tutt/
CrashReport/                       MemoryStat/      dumpdecrypted.dylib*
LocalInfo.lst                      OpenImResource/  heavy_user_id_mapping.dat
LoginInfo2.dat                     SafeMode.dat     mmupdateinfo.archive
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root#

//将解密后的文件拷贝到mac

scp WeChat.decrypted hexindai@172.20.8.179:/tmp

注意:当砸壳完毕后,使用 class-dump 仍然只导出 CDStructures.h 一个文件,则可能架构选择错误;因为 dumpdecrypted 只会砸你手机处理器对应的那个壳,fat binary 的其它部分仍然是有壳的,而 class-dump 的默认目标又不是被砸壳的那个部分,因此很有可能就会报错;

class-dump -s —arch armv7 -S -H WeChat.decrypted -o ./WCHeaderscd
  • 完成之后的头文件如下