iOS逆向反编译

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

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

本文首发于 个人博客

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

2.利用brew安装ldid

$ brew install ldid

  • 修改环境变量

    1. 编辑用户配置文件

$ vim ~/.bash_profile

2.在􏰝..bash_profie􏰛 文件后面加入下面两行

export THEOS=~/theos
export PATH=THEOS/bin:PATH

3,让.bash_profie配置的环境变量立即生效(或者重新打开终端)

>$ source ~/.bash_profile
  • 􏰣􏰵下载theos

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

git clone --recursive https://github.com/theos/theos.gitTHEOS

  • 新建tweak 项目

    1,cd到放文件的目录下(比如桌面

cd ~/Desktop nic.pl

2,选择􏱋􏱌[13.] iphone/tweak

3,填写项目信息

名称 项目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</pre>

        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
  • 重签名工具

十二、其他笔记:

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</pre>
更多资料,欢迎关注个人公众号,不定时分享各种技术文章。

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

推荐阅读更多精彩内容