由于爱奇艺会员到期,于是产生逆向APP 的想法,尚未找到解决办法。
原有iOSOpenDev的升级,非越狱插件开发集成神器!
- 可以使用Xcode开发CaptainHook Tweak、Logos Tweak 和 Command-line Tool,在越狱机器开发插件,这是原来iOSOpenDev功能的迁移和改进。
- 只需拖入一个砸壳应用,自动集成class-dump、restore-symbol、Reveal、Cycript和注入的动态库并重签名安装到非越狱机器。
- 支持调试自己编写的动态库和第三方App
- 支持通过CocoaPods第三方应用集成SDK以及非越狱插件,简单来说就是通过CocoaPods搭建了一个非越狱插件商店。
安装教程可参考:安装
一般从某助手上下载的越狱版本,就是已经砸壳的,当然也可以自行通过 dumpdecrypted 工具实现。
class-dump 是一个工具,它利用了 Objective-C 语言的运行时特性,将存储在 Mach-O 文件中的头文件信息提取出来,并生成对应的 .h 文件。
到 class-dump 官网 进行下载,目前最新的版本为 3.5。
在个人目录下新建一个 bin
目录,并将其添加到 PATH 路径中,然后将下载后的 class-dump-3.5.dmg 里面的 class-dump 可执行文件复制到该 bin
目录下,赋予可执行权限:
$ mkdir ~/bin
$ vim ~/.bash_profile
# 编辑 ~/.bash_profile 文件,并添加如下一行
export PATH=$HOME/bin/:$PATH
# 将 class-dump 拷贝到 bin 目录后执行下面命令
$ chmod +x ~/bin/class-dump
到最后一步,以爱奇艺为例,使用 class-dump 来将微信的头文件导出:
$ class-dump -H iQiYiPhoneVideo.app -o Payload/
这样,所有的头文件就都被导出到了 .Payload/
目录下了。
可以借助 FLEX 工具来查看APP 的层级和数据以及接口声明,可以快速定位我们要修改的位置
FLEX 官方仓库,通过Cocoapods 安装依赖即可。
source 'https://github.com/AloneMonkey/MonkeyDevSpecs.git'
platform :ios, '9.0'
target 'antrees' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# Pods for antrees
end
target 'antreesDylib' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# 注意是安装到动态库 而不是APP
# Pods for antreesDylib
pod 'FLEX'
end
紧接着在程序启动以后,添加FLEX 的显示
CHConstructor{
NSLog(INSERT_SUCCESS_WELCOME);
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
[[FLEXManager sharedManager] showExplorer];
#ifndef __OPTIMIZE__
CYListenServer(6666);
CycriptManager* manager = [CycriptManager sharedInstance];
[manager startDownloadCycript:NO];
#endif
}];
}
我们可以通过这个FLipboard 来实现操作,具体效果如下
主页 | 菜单 | 视图 | 选择 |
---|---|---|---|
比如,我们想去掉Tab 栏那个可恶的泡泡(截图部分已处理),我是非常讨厌那个功能,感觉很鸡肋,体验极差。
此时我们可以通过select
功能点击底部菜单栏,然后进入到视图查看层级关系,最终找到对应的实例,如下图所示
主页 | 视图1 | 视图2 | |
---|---|---|---|
处理前 | |||
处理后 |
代码实例如下
CHDeclareClass(TabbarView)
CHOptimizedMethod0(self, NSArray*, TabbarView, tabbarImageArray){
//get origin value
NSMutableArray* originArray = CHSuper(0, TabbarView, tabbarImageArray).mutableCopy;
[originArray removeLastObject];
//change the value
return originArray.copy;
}
CHOptimizedMethod0(self, NSArray*, TabbarView, tabbarTitleArray){
//get origin value
NSMutableArray* originArray = CHSuper(0, TabbarView, tabbarTitleArray).mutableCopy;
[originArray removeLastObject];
//change the value
return originArray.copy;
}
CHConstructor {
CHLoadLateClass(TabbarView);
CHHook0(TabbarView, tabbarImageArray);
CHHook0(TabbarView, tabbarTitleArray);
}
通过MonkeyDev 大大降低了逆向开发的门槛,使得逆向变得更加有趣和更具规范性。通过逆向,可以实现很多意想不到的功能,给你不断的惊喜!
下面是本次实践的代码示例,会员和去广告相关功能暂未实现,正在寻求其他思路~