iOS逆向流程

为了表示我对简书『饱醉豚』事件的不满,简书不再更新,后续有文章只更新 个人博客掘金

欢迎移步 个人博客或者 掘金

本文首发于个人博客

准备:完美越狱iPhone

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

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

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

​ 4,代码编写

​ 5,注入代码到APP中

​ 6,必要时还可能需要重新签名、打包ipa

一、Mac远程登录iPhone

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

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

    可以通过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

https://cgit.sukimashita.com/usbmuxd.git/snapshot/usbmuxd-1.0.8.tar.gz

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

  • Cycript 安装到手机上

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

    官网: http://www.cycript.org/

    文档: http://www.cycript.org/manual/

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

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

    ​ cycript -p 进程名称

    ​ 取消输入:Ctrl + C

    ​ 退出:Ctrl + D

    ​ 清屏:Command + R

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

    https://github.com/CoderMJLee/mjcript

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

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

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

    ps –A 列出所有的进程

​ ps命令是process status

​ 可以过滤关键词,比如 : ps -A | grep WeChat

三、脱壳

  • iOS中有很多好用的脱壳工具

​ Clutch:https://github.com/KJCracks/Clutch

​ dumpdecrypted:https://github.com/stefanesser/dumpdecrypted/

​ 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 是加壳

四、反编译出头文件

  • class-dump

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

    官方地址:http://stevenygard.com/projects/class-dump/

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

    常用格式:

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

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

五、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 其他回车

六、编写代码

​ 具体情况具体分析

七、打包编译安装

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

​ 自己做的插件在 Device/Library/MobileSubstrate/DynamicLibraries

八、theos资料

  • 目录结构: https://github.com/theos/theos/wiki/Structure

  • 环境变量: http://iphonedevwiki.net/index.php/Theos

  • Logoes语法: http://iphonedevwiki.net/index.php/Logos

    • %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)

九、MAC、IPhone 软件破解

​ 例:PC软件破解 ./YZCTest

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

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

​ 如果是未越狱的IPhone 则还需要打包签名等操作。

十、动态调试

十一、签名打包

  • 准备一个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

十二、其他笔记:

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底层原理班

更多资料,欢迎关注个人公众号,不定时分享各种技术文章。

image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容