iOS逆向流程

本文首发于我的博客php

准备:完美越狱iPhone

逆向APP思路:1,代码分析html

​ 2,对Mach-O文件的静态分析MachOView、class-dump、Hopper Disassembler、ida等python

​ 3,动态调试 对运行中的APP进行代码调试 p debugserver、LLDBios

​ 4,代码编写git

​ 5,注入代码到APP中github

​ 6,必要时还可能须要从新签名、打包ipa数据库

1、Mac远程登陆iPhone

  • SSH (Secure Shell) 是“安全外壳协议”vim

    OpenSSH 是SSH协议的免费开源实现 (在iPhone上经过Cydia安装OpenSSH工具(软件源http://apt.saurik.com))sass

    能够经过OpenSSH的方式让Mac远程登陆到iPhone安全

  • SSH是经过TCP协议通讯,因此要确保Mac和iPhone在同一局域网下,好比链接着同一个WiFi下

    在终端输入

ssh 帐户名@服务器主机地址
复制代码

​ 例如:

ssh root@192.168.8.157  而后输入密码(默认是alpine )     
复制代码

​ 这种方式wifi登陆,受到网速限制

  • usb链接 (不须要网络,速度快,安全) 1.1 sh usb.sh (注: python2 usbmuxd-1.0.8/python-client/tcprelay.py -t 22:10010 8888:8888)

​ 1.2 sh login.sh (注:ssh -p 10010 root@localhost)

​ 上面的命令生效是由于已经把 usb.sh 和 login.sh 两个文件作了端口映射并放到了根目录 (映射须要usbmuxd工具包)

​ 另外: 1.echo $PATH 查看设置的根目录,若是本身想写脚本在其余地方都能执行,也能够放在PATH路径下

​ 2.手机和电脑能链接是由于,手机的受权文件 /var/root/.ssh/authorized_keys 中 添加了电脑的公钥 ~/.ssh/id_rsa.pub

Mac上有个服务程序usbmuxd(它会开机自动启动),能够将Mac的数据经过USB传输到iPhone

/System/Library/PrivateFrameworks/MobileDevice.framework/Resources/usbmuxd

下载usbmuxd工具包(下载v1.0.8版本,主要用到里面的一个python脚本:tcprelay.py

cgit.sukimashita.com/usbmuxd.git…

2、获取手机上软件的ipa包

  • Cycript 安装到手机上

    Cycript是Objective-C++、ES6(JavaScript)、Java等语法的混合物,能够用来探索、修改、调试正在运行的Mac\iOS APP

    官网: www.cycript.org/

    文档: www.cycript.org/manual/

    经过Cydia安装Cycript,便可在iPhone上调试运行中的APP

    使用: cycript -p 进程ID 好比:cycript -p NewsBoard

    ​ cycript -p 进程名称

    ​ 取消输入:Ctrl + C

    ​ 退出:Ctrl + D

    ​ 清屏:Command + R

    Github 上有基于cycript封装了一些函数 参考

    github.com/CoderMJLee/…

    ​ @import mjcript --->MJAppId、MJFrontVC()、MJDocPath、MJAppPath 等

  • Clutch -i 获取加壳软件的appid

  • PS命令 (手机上安装adv-cmds)

    ps –A 列出全部的进程

​ ps命令是process status

​ 能够过滤关键词,好比 : ps -A | grep WeChat

  • 也能够用github 上工具获取 github.com/CoderMJLee/…

    MJAppTools 能够获取到架构,名称,是否加壳,安装包路径,数据库路径等

3、脱壳

  • iOS中有不少好用的脱壳工具

​ Clutch:github.com/KJCracks/Cl…

​ dumpdecrypted:github.com/stefanesser…

​ AppCrackr、Crackulous

  • Clutch -i 获取到appid以后,Clutch -d (APP序号) 导出app包 eg: Clutch -d 1 会打印出脱壳路径

  • DYLD_INSERT_LIBRARIES 脱壳

    例如:MJAppTools 获取 到 【网易新闻】 <com.netease.news> /private/var/mobile/Containers/Bundle/Application/64F0B25C-062E-4A89-8834-3F534C24E70D/NewsBoard.app

    执行:

    DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /private/var/mobile/Containers/Bundle/Application/64F0B25C-062E-4A89-8834-3F534C24E70D/NewsBoard.app/NewsBoard

    获取到的脱壳文件再当前目录下 (Device/var/root)

  • 查看是否脱壳

    otool -l 名称 | grep crypt 例如: otool -l NewsBoard | grep crypt 查看网易新闻是否脱壳

    也能够用hopper看是否脱壳

    cryptid 0 为脱壳 cryptid 1 是加壳

4、反编译出头文件

  • class-dump

    顾名思义,它的做用就是把Mach-O文件的class信息给dump出来(把类信息给导出来),生成对应的.h头文件

    官方地址:stevenygard.com/projects/cl…

    下载完工具包后将class-dump文件复制到Mac的/usr/local/bin目录,这样在终端就能识别class-dump命令了

    经常使用格式:

    class-dump -H Mach-O文件路径 -o 头文件存放目录 -H表示要生成头文件 -o用于制定头文件的存放目录

    例如:当前目录下 class-dump -H NewsBoard -o Header (新建一个Header的文件夹) 这时候能够用hopper 等分析代码了

5、theos

  • 安装签名工具ldid

    1.先确保安装brew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
复制代码

​ 2.利用brew安装ldid

$ brew install ldid
复制代码
  • 修改环境变量
  1. 编辑用户配置文件
$ vim ~/.bash_profile
复制代码
  1. 在.bash_profile文件后面加入下面两行
export THEOS=~/theos
export PATH=$THEOS/bin:$PATH
复制代码
  1. 让bash_profiel配置的环境变量当即生效(或者从新打开终端)
$ source ~/.bash_profile
复制代码
  • 下载theos

    建议在$PATH 目录下载代码(就是刚才配置的)

    $ git clone --recursive https://github.com/theos/theos.git $THEOS
    复制代码
  • 新建tweak 项目

  1. cd到放文件的目录下(好比桌面)
$ cd ~/Desktop
$ nic.pl
复制代码
  1. 选择选项[13.] iphone/tweak

  2. 填写项目信息

​ 名称 项目ID随便写, MobileSubstrate Bundle filter 写应用的id 其余回车

6、编写代码

​ 具体状况具体分析

7、打包编译安装

​ 当前tweak文件目录下make clean && make && make package && make install (已经写好了文件,能够直接 sh ~/tweak.sh

​ 本身作的插件在 Device/Library/MobileSubstrate/DynamicLibraries

8、theos资料

  • 目录结构: github.com/theos/theos…

  • 环境变量: iphonedevwiki.net/index.php/T…

  • Logoes语法: iphonedevwiki.net/index.php/L…

    • %hook %end : hook一个类的开始和结束

    • %log : 打印方法调用详情 能够再Xcode -> Window -> Devices and Simulators中查看

    • HBDebugLog 相似NSLog

    • %new: 添加一个新的方法

    • %c(className): 生成一个class对象,好比Class%c(NSObject),相似于NSStringFromClass()、objc_getClass()

    • %orig: 函数调用原来的逻辑

    • %ctor : 在加载动态库时候调用

    • %dtor : 程序退出时调用

    • logify.pl: 能够将一个头文件快速转成已经包含打印信息的xm文件

      • logify.pl xx.h > xx.xm
        复制代码

        1,在 UserCenterViewController.h 目录下执行

        logify.pl UserCenterViewController.h > UserCenterViewController.xm

        2, UserCenterViewController.xm 拷贝到Makefile(Tweak.xm) 所在目录

        3, 新建一个src目录,把.xm文件放进去,修改路径 YZRongxin_FILES = $(wildcard src/*.xm)

        4,不认识的类 替换为void 删除__weak 删除协议

        5, 不想太详细 %log 换成NSLog(@"%@",NSStringFromSelector(_cmd));

        6,HBLogDebug(@" = 0x%x", (unsigned int)r) 改成 HBLogDebug(@" = 0x%@", r)

9、MAC、IPhone 软件破解

​ 例:PC软件破解 ./YZCTest

​ 例:网易新闻去广告 NTESNBNewsListController hasAd

​ 例:优酷去掉90s开头广告 XAdEnginePreAdModule setupVideoAd needAd

​ 若是是未越狱的IPhone 则还须要打包签名等操做。

10、动态调试

11、签名打包

  • 准备一个embedded.mobileprovision文件(必须是付费证书产生的,appid,device必定要匹配)并放入到.app包中。

    • 能够经过Xcode自动生成,而后再编译后的APP包中找到
    • 能够去开发者网站生成证书下载
  • 从embedded.mobileprovision文件中提取出entitlements.plist权限文件

    • security cms -D -i embedded.mobileprovision > temp.plist
    • /usr/libexec/PlistBuddy -x -c'Print :Entitlements' temp.plist > entilements.plist
  • 查看可用的证书

    • security find-identity -v -p codesigning
  • 对.app内的动态库、AppExtension等进行签名
    • codesign -f -s 证书ID XXX.dylib
  • 对.app包进行签名
    • codesign -f -s 证书id --entitlements entitlements.plist xxx.app
  • 重签名工具
    • iOS App Signer
      • https://github.com/DanTheMan827/ios-app-signer
        复制代码
      • 对.app重签名,打包成ipa

      • 须要再.app包中提供对应的embedded.mobileprovision文件

    • iReSign
      • github.com/maciekish/i…
      • 能够对ipa进行重签名,打包成ipa
      • 须要提供embedded.mobileprovision、entitlements.plist文件的路径

12、其余笔记:

Tweak 技巧

1,加载 图片资源 建立 layout 文件夹 至关于Device/Library

图片会放在 在Device/Library/PreferenceLoader/Preference

2,本身作的插件在 Device/Library/MobileSubstrate/DynamicLibraries

3,#define YZFile(path) @"/Library/PreferenceLoader/Preferences/yzxmly/" #path

4,多个文件,多个目录,引用头文件要使用路径好比 @import “abc/def/person.h”

5,路径 全路径,或者 代替 好比:src/test.xm src/.m (中间一个空格)

6,若是本身增长类,方法属性等,要声明的话

eg:

@interface yzdefine

- (void)vipReOpenPlayer;

@end
复制代码

参考资料

iOS应用逆向工程(第2版)

iOS底层原理班

更多资料,欢迎关注我的公众号,不定时分享各类技术文章。

相关文章
相关标签/搜索