逆向App总体思路

UI剖析

Cycript 、Reveal;

代码剖析

代码在Mach-O 文件,所以要对Mach-O 文件进行静态剖析;

MachOView、class-dump、Hopper Disassember、ida;

动态调试

对运转中App 进行代码调试

debugserver、LLDB;

代码编写

注入代码到app中

必要时还可能需求重新签名、打包ipa;

MonkeyDev装置与运用

非越狱插件开发集成神器

装置

MonkeyDev下载地址:github.com/AloneMonkey…

装置过程:

官方阐明文档地址:github.com/AloneMonkey…

运用

1、点击File - New - Project...创立iOS项目,挑选MonkeyApp

iOS逆向分析工具使用汇总

创立完成后,是这样的一个工程;

MonkeyTestAppDylib这个是将被注入目标App的动态库,你自己要hook的代码能够在MonkeyTestAppDylib.m文件里边写,支撑OC runtime的HOOK,C函数的fishhook。AntiAntiDebug这个里边是反反调试的代码。

fishhook这个是主动集成的fishhook模块。MonkeyDev的Framewroks现已主动集成了RevealServer.frameworklibcycript.dylib。如果挑选Release编译的话是不会集成的。

iOS逆向分析工具使用汇总

2、准备脱壳后的ipa文件,然后右键项目里边的TargetApp文件夹Show in Finder,把ipa文件拖入下面的方位。TargetApp文件夹下的put ipa or app here这个文件不要删去。

3、注意事项:

在Xcode 12上运转会有2个过错:

1、动态库证书过错

iOS逆向分析工具使用汇总

解决方法:在TARGETSBuild Settings 下增加 CODE_SIGNING_ALLOWED 为NO

iOS逆向分析工具使用汇总

2、ld: file not found: /usr/lib/libstdc++.dylib 过错

iOS逆向分析工具使用汇总

解决方法:

MonkeyTestAppDylibBuild SettingsOther Linker Flags 中移除掉 /usr/lib/libstdc++.dylib-weak_library

iOS逆向分析工具使用汇总

Reveal 装置与运用

Reveal是一个很强壮的UI剖析工具,UI剖析十分直观,用来检查app的UI布局相当便利。

装置

相关MonkeyDev,翻开Reveal 页面,Help-Show Reveal Library in Finder -iOS Library 拷贝RevealServer.framework,然后前往 /opt/MonkeyDev/Frameworks 替换掉RevealServer.framework。

iOS逆向分析工具使用汇总

iOS逆向分析工具使用汇总

运用

在真机上运转monkeyDev 工程,程序发动后,翻开Reveal ,挑选USB方法,点击app的icon,进入UI剖析页。

class-dump的装置和运用

class-dump首要用于提取Mach-O文件中的头文件信息并生成.h文件,经过对生成的.h文件可剖析对应App实现的基本思路和一些重要的类对应的功用,以便进一步进行逆向工作。

装置

class-dump下载地址:stevenygard.com/projects/cl…

下载class-dump的dmg格局:class-dump-3.5.dmg

iOS逆向分析工具使用汇总

装置操作:

1、 翻开终端输入:open /usr/local/bin

2、把dmg文件中的class-dump文件复制到 /usr/local/bin

3、改权限,终端输入: sudo chmod 777 /usr/local/bin/class-dump

运用

在终端经过指令能够导出文本格局头文件,我们能够导出text文件格局:

class-dump -H iQiYiPhoneVideo -o IQIY

如需协助则在终端输入 :class-dump –help

Hopper Disassembler 介绍

Hopper Disassembler Mac版是一个强壮的Mac反编译神器,能够反汇编,反编译和调试应用程序。而且支撑iOS逆向,能够把Mach-O文件的机器语言代码反编译成汇编代码、OC或Swift的伪代码。Hopper Disassembler 支撑分解Mach-O、ARM和Windows二进制文件,是程序员进行拆开代码进行调试或学习的神器。

Hopper Disassembler 官方下载地址:www.hopperapp.com/

iOS逆向分析工具使用汇总

Cycript 装置和环境配置

Cycript是Objective-C++、ES6(JavaScript)、Java等语法的混合物,运用Cycript 能够动态调试App。

装置

Cycript 官方下载地址:www.cycript.org/

Cycript 官方学习文档:www.cycript.org/manual/

从Cycript下载SDK,下载完成后解压文件夹放到/opt目录下。

iOS逆向分析工具使用汇总

配置环境变量

翻开终端输入: open -e .bash_profile

在翻开的.bash_profile 文件内增加Cycript环境变量地址:export PATH=/opt/cycript_0.9.594/:$PATH

装置遇到的问题

1、Cycript 需求依靠低版本的ruby2.0。

dyld: Library not loaded: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib
 Referenced from: /opt/cycript_0.9.594/./Cycript.lib/cycript-apl
 Reason: image not found
zsh: abort   ./cycript -r 10.19.80.176:6666

解决方法

查找到ruby 装置地点目录:拷贝出libruby.2.4.10.dylib ,并将动态库改成libruby.2.0.0.dylib,粘贴到/opt/cycript_0.9.594/Cycript.lib/目录下。

iOS逆向分析工具使用汇总

运用

1、翻开终端进入cycript_0.9.594 目录: cd /opt/cycript_0.9.594 ;

2、在终端输入电脑与真机有必要同一局域网内的IP地址:./cycript -r 10.19.80.176:6666

按enter 键出现 cy#表明成功衔接。

日志内也能够查到可运转的IP地址:

Download cycript(cydia.saurik.com/api/latest/…) then run: ./cycript -r 10.19.80.176:6666

3、control +D退出检查。

在cy#后面输入:[[UIApp keyWindow]recursiveDescription].toString()

能够检查UI全体布局结构。

查找根视图

cy# UIApp.keyWindow.rootViewController

#”<RootViewController: 0x141150400>”

获取目标的所有成员变量,运用(*目标)

cy# *UIApp.keyWindow.rootViewController

筛选出某种类型目标

choose(UIViewController) choose(UITableViewCell)

运用遇到的问题

*** _syscall(connect(socket_, info->ai_addr, info->ai_addrlen)):../Console.cpp(306):CYSocketRemote [errno=61]

MDCycriptManager.h 中的端口值换一下,#define PORT 6666换成端口为6688

代码注入举例

@interface MyViewController
@end
%hook MyViewController
\- (void)showLoginPopup{
  NSLog(@"hook viewDidLoad method");
   UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"我的第一个tweak工程创立成功了" delegate:self cancelButtonTitle:@"确认" otherButtonTitles:@"撤销",nil];
   [alertView show];
​    UITableView* p = MSHookIvar<UITableView*>(self,"_tableView");
  p.backgroundColor=[UIColor purpleColor];
}
\- (void)toLogin{
​    %orig;
   UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"你过来呀" delegate:self cancelButtonTitle:@"确认" otherButtonTitles:@"撤销",nil];
   [alertView show];
}
%end

总结

iOS逆向之路有坑有惊喜,需求了解并运用逆向中的各种工具,要求对汇编语言了解,熟悉各种脚本语言,对体系的底层常识的了解要求更高,越狱环境下的逆向自由度更高,非越狱环境下逆向依然充溢挑战。在逆向他人app时候,也在提醒我们,开发项目中涉及的核心代码安全性很重要,防止被走漏出去。