准备工作

工具下载

以下工具包括Folx都打包好上传网盘了,这里下载。

  • Folx
    一个mac上挺好用的下载工具,本文逆向破解的对象。直接把Folx.app拖到Applications文件夹中即可。

  • mySIMBL
    扩展包(plug in)管理软件,本文将要给Folx软件写扩展包达到破解的目的,因此使用mySIMBL进行扩展包管理,图形界面方便的删除、开启等功能。
    直接把mySIMBL.app拖到Applications文件夹中即可。

  • EasySIMBL-Bundle-Template
    一个扩展包XCode模板,类似于开发iOS在XCode新建工程时选的Single View App
    EasySIMBL Bundle.xctemplate文件夹拖到~/Library/Developer/Xcode/Templates/Project Templates目录下即可,如图所示。

EasySIMBL安放地址

  • class-dump
    iOS/Mac逆向必须介绍的软件,从可执行文件中导出头文件,然而本文用不上,不做介绍。

  • Hopper Disassembler
    超级强大的反编译软件,不仅可以把机器码解析成汇编,还能解析出相似与Objc的伪代码。总之就是太强大了,强大到我们几乎连class-dump都用不上了。本文提供了史蒂芬周的破解版本,把Hopper Disassembler v4.app拖进HopperV4Patcher即可破解,如图所示。

破解Hopper

问题分析

Folx有个很方便的功能下载Youtube视频,只要把Youtube视频的URL输入就可以下载(而且速度还不错,暂时没验证需不需要科学上网)。然而这是个付费功能,只要点下OK按钮就会跳出讨钱页。

Folx

Folx叫你交保护费

听说有小伙伴因为种种原因弄不到Youtube的URL?下面提供一个。

https://www.youtube.com/watch?v=QFH747sK200

逆向分析

打开Hopper,选择File-Read Executable to Disassemble直接粗暴读取二进制可执行文件来破解,如图所示。

Hopper界面

选择Applications文件夹中的Folx,右键显示包内容,并找到可执行文件,类似于win平台的.exe文件,在这里:

打开Folx![Uploading 7_151717.png . . .]可执行文件

等Hopper缓过神来,界面就差不多长这样。由于个人使用习惯,隐藏了底部和右边栏,可以在右上角的三个按钮选择是否开启。
左边栏是导航,可以看到使用Objc的方框语法列出了许多方法,还要啥class-dump?
中间区域是汉莫拉比法典,记载了一些上古语言,讲述了一些你不需要了解的事,直接无视就行。

Hopper界面

OK我们的目的是要破解YouTube下载功能,那么把Youtube当做关键词来搜索应该不会错,所以在左边栏的搜索框中输入youtube,可以得到许多和Youtube相关的类和方法:

搜索Youtube

我们来猜一下这都是些什么东西。(十秒逆向九秒猜)

  • FolxYouTubeHelper:看上去没有什么特别的东西,应该不是我们要找的。
  • AppDelegate:看上去也只是一个干杂货的,负责弹框之类,应该也不是我们要找的。
  • SDUrl:看上去像是个下载辅助的东西,应该还不是我们要找的。
  • FolxNewEditTask:看上去是负责新建下载任务相关的类,估计会包含验证之类的东西,我们可以尝试从这个入手。

在搜索栏中查找FolxNewEditTask,可以得到一整列表,这东西有点肥,看上去方法很多,其实基本每个@Property都有getset两个方法。

此处无图

FolxNewEditTask的方法中看到一个done:方法,应该是新建任务完成的方法,也就是OK按钮的点击方法。选中该方法,一探究竟。

done方法

在顶部栏点击伪代码按钮可以把上古语言翻译成类似于Objc的代码,极大提高可阅读性。代码中还保留了许多汇编的特征,例如rbxr14之类的寄存器,可以简单理解为变量。如果你认可我葬爱家族,那么这样的代码对你来说应该没有任何阅读压力。

伪代码按钮

得到[FolxNewEditTask purchased]的伪代码:

伪代码

在方法的开头就是一个判断语句,由&&区分出两个判断条件。
前一条件首先是一个Objc下消息机制的方法调用,由前一句r14 = @selector(addTaskType);可以猜测应该是判断当前的下载类型,记得Folx提供了三个下载类型,而Youtube是第三个类型,就是==0x2成立。

下载类型

后一个条件的关键词在于purchased,这就很明显了。purchase的消息对象是rbx,前两句rbx=self可以知道FolxNewEditTask对象应该有个purchased方法,判断交没交保护费,如果交了就走else语句,没交的话就弹出交钱框,就是底下的@selector(showFreeYouTubeAlert:)
不过我们的重点在于判断交保护费的方法,在左侧栏搜索,果然FolxNewEditTask是有这个方法,而且还有setPurchased方法,可以推知purchased`应该是一个成员属性。

purchased方法

这样我们就不用管它判断的机制是什么,只要这个方法返回YES就对了,办法就是把FolxNewEditTask的purchased方法换成我们自己的purchased方法,这样不仅是YES,要返回大象都可以。

Hook

打开XCode,新建一个EasySIMBL模板工程

新建工程

工程名无所谓,最重要的是Target App Bundle Id,也就是我们要破解的App的Bundle ID,在Folx.app的包内容中可以找到info.plist文件,然后找到Folx的Bundle ID。
我一般用如下结构存放文件,其中Sources组下存放原App中类的头文件,而HookClasses组下存放我们自制的对应类。

思维僵化的项目结构

首先在Sources下创建FolxNewEditTask.h文件,然后把里面的代码都删了,填入如下内容。

@interface FolxNewEditTask- (BOOL)purchased;@end

虽然我们创建了FolxNewEditTask.h,假装我们知道FolxNewEditTask的一切,其实我们只需要知道FolxNewEditTask有purchased这么一个方法,但这就够了,因为我们只需要一个flag。当然正经点的做法是使用class-dump导出.h头文件来使用,学习class-dump。

接着在HookClasses中创建FolxNewEditTask+Hook的.h和.m文件。在FolxNewEditTask+Hook.h文件中填入代码如下:


#import <Foundation/Foundation.h>
#import "FolxNewEditTask.h"@interface NSObject(FolxNewEditTaskHook)+ (void)hookFolxNewEditTask;@end

FolxNewEditTask+Hook.m文件中填入如下代码:

#import "FolxNewEditTask+Hook.h"@implementation NSObject(FolxNewEditTaskHook)+ (void)hookFolxNewEditTask {NSError *error;[self jr_swizzleMethod:@selector(purchased)withMethod:@selector(banana_purchased)error:&error];if (error) {NSLog(@"+++++hookFolxNewEditTask error: %@", error);}
}- (BOOL)banana_purchased {return YES;
}@end
  • banana_purchased方法是我们自制的保护费管理员,不管什么情况下都会返回YES。
  • hookFolxNewEditTask中我们调用jr_swizzleMethod:方法把FolxNewEditTask原本的purchased方法和我们自制的purchased方法交换。

接着就是要在Folx程序启动的时候调用偷天换日大法。找到Banana.m或者你的项目名.m,里面已经提供好了load方法,搞Objc开发的都应该知道load方法是在类载入内存的时候调用,也是偷换方法的最佳时机。
首先得导入我们的头文件:

#import "FolxNewEditTask+Hook.h"

其次在load方法后加上一行来调用偷换方法。

[NSClassFromString(@"FolxNewEditTask") hookFolxNewEditTask];

command+B来编译一下,显示build succeeded这样扩展就已经安装好了。我们可以打开mySIMBL来管理扩展。

mySIMBL管理扩展界面

因为在扩展的方法中我们打印了一些信息,因此可以打开Console.app来查看,这个是系统自带程序,在Launchpad里找找。在Consolo里搜索++++来过滤其他不必要信息。

然后就是见证奇迹了,运行Folx吧。

在Console中接收到这么一条消息就表示扩展已经成功执行:

Console接收NSLog信息

接下来去测试一下Youtube功能是不是能使用。
点击OK之后讨厌的讨钱窗口没有跳出来,而是直接开始下载了,那么就算破解成功了:

Folx开始下载Youtube视频

根据我的猜测也有可能因为某些科学原因没法下载,因为公司都是科学上网的,所以我才不会开4G去验证呢。

更暴力的方法

正如标题所说,Hopper玩转Mac逆向,而没说Mac和XCode玩转Mac逆向。
Hopper掌握了机器码,就拥有了生杀大权,所谓汇编、伪代码都是解析给程序员看的,虽然说使用Hook方法替换原方法可以自定返回值,甚至可以返回大象!但是我们不需要大象,如果只是一个BOOL的事,汇编的修改是不是就够了呢?
当然,首先我们在mySIMBL里把方才所写的Folx扩展禁用掉,然后把Folx关了,回到Hopper中。
依旧在左侧栏中搜索找到[FolxNewEditTask purchased]方法,并选择汇编代码。

选择汇编代码

其实[FolxNewEditTask purchased]的Objc代码只有一两行,对应的汇编代码其实也不长,就7行:

1. push       rbp
2. mov        rbp, rsp
3. mov        rax, qword [objc_ivar_offset_FolxNewEditTask__purchased]
4. mov        al, byte [rdi+rax]
5. movsx      eax, al
6. pop        rbp
7. ret

rax寄存器是返回值寄存器,相当于被放在rax里的值最后都会被return rax;
rax在第3行出现过一次,mov指令可以理解为赋值语句,意义是将qword [objc_ivar_offset_FolxNewEditTask__purchased]的值赋予rax
我们不用管qword [objc_ivar_offset_FolxNewEditTask__purchased]是什么,我们要的结果是return YES,也就是return 0x01,只需要确保在ret指令的时候rax的值是0x01即可。
因此选中mov rax, qword [objc_ivar_offset_FolxNewEditTask__purchased]一行,选择Modify-Assemble Instruction,输入如下指令:

mov rax, 0x01

回车

修改汇编代码

选择File-Produce New Executable来生成新的可执行文件Folx,替换掉原来的文件即可。

结尾

没有结尾。

作者:喂草
链接:https://www.jianshu.com/p/c04ac36c6641
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最简单的Hopper Disassembler玩转Mac逆向相关推荐

  1. mac mini 储存文件的服务器,另一种“NAS”的玩法---mac系统的远程管理和文件共享...

    另一种"NAS"的玩法---mac系统的远程管理和文件共享 2019-12-28 17:00:00 8点赞 111收藏 24评论 自从我用矿渣蜗牛星际装黑群晖之后系统崩溃,费劲力气 ...

  2. 简单几步让你的 Mac 系统恢复如新

    简单几步让你的 Mac 系统恢复如新 Mac同Windows一样,用的时间越久,也会感觉越来越"卡". 卡顿是高效工作的第一大敌,这里向大家介绍几个简单步骤,保准你的Mac系统&q ...

  3. MAC下的反编译、反汇编和调试神器Hopper Disassembler

    很久没去pediy了,偶尔去看下,还真有新东西 mac下的反汇编工具,貌似参考ida做的,看起来很不错 地址在这里 官网:http://www.hopperapp.com/ 传送门:http://pa ...

  4. 苹果如何分屏_玩转mac—苹果电脑操作教程

    永新Apple / Huawei Store(中国移动合作商):苹果+华为(荣耀)专卖.售后维修.技术支持.新机置换.分期付款:移动通信服务: 永新店:建设西路70号(三湾大酒店旁)   微信手机:1 ...

  5. 手把手教你怎样简单利用GitHub实现合作开发(Mac)

    前言 之前对于GitHub完全是当作一个存代码的远程仓库,或者是一个参考别人代码的网站 这篇文章可以看作GitHub进阶,告诉你如何建立分支,合并代码,与别人合作开发 参考文章 GitHub 的 Fo ...

  6. 傻瓜式做法,最简单的短视频玩法

    傻瓜式的短视频变现副业 无需技巧,简单制作 一个月搞个几千块 课程简介 傻瓜式的短视频变现副业 无需技巧,简单制作 一个月搞个几千块 文字转视频一键粘贴文字自动生成视频,这个项目非常适合小白,以及前期 ...

  7. 记住这些快捷键,让你轻松玩转mac(macOS 常用快捷键分享)

    适当运用键盘快捷键可以帮助用户提高效率,这里小编为大家带来了一些macOS 常用快捷键,掌握这些快捷键可以帮你解放鼠标手,成为键盘侠,一起来看看吧! 快捷键标识简介 当你在应用菜单中发现部分操作项后边 ...

  8. 使命召唤16正在获取cdn地址_玩机不求人 | 简单教程,爽玩《使命召唤:战区》攻略!...

    2019年2月<Apex英雄>上线,三天人数达到1000万,2020年3月<使命召唤:战区>上线,三天人数达到1500万,历史似乎正在重演.<使命召唤:战区>的火爆 ...

  9. 涨姿势,简单易懂带你玩转二叉树(图码并茂)

    作者:Optimism&Active www.cnblogs.com/xisuo/p/11921647.html 目录 前言 1.数组和链表的特点 2.树和二叉树 3.二叉搜索树以及它是通过什 ...

  10. 简单的小游戏,六步实现简单扫雷!(可玩)

    文章目录 前言 一.游戏步骤及实现的功能 二.制作步骤 1.游戏进入界面以及准备工作 game.h 初始界面 2.初始化棋盘 3.打印棋盘 4.随机布置雷 5.获取周围的雷数 6.排雷以及递归寻找周围 ...

最新文章

  1. 原型 原型链 call / apply
  2. 天津大学计算机非全日制录取名单,天津大学法律硕士拟录取名单(非全日制).xls...
  3. linux怎么给目录创建acl,LINUX-ACL文件访问控制列表
  4. 计算机网络自顶向下-运输层
  5. 学术研究 | 仅仅因为方法 Too Simple 就被拒稿,合理吗?
  6. 蓝桥 PREV-34 历届试题 矩阵翻硬币
  7. 在linux安装windows应用商店,Ubuntu 已在微软官方应用商店 Windows Store 上免费提供下载...
  8. ztek usb转串口 linux,Z-tek驱动下载_Z-tek usb转串口驱动官方下载 - 系统之家
  9. 微信小程序毕业设计(一)
  10. cαr怎么发音_韵母a的发音情况是()。
  11. python实现 stft_Python中可转换的STFT和ISTFT
  12. Win11系统电脑怎么C盘扩容教学
  13. 给盲目跟风网络营销的商户们一个忠告——搞不好你会死得很惨
  14. httpwatch使用
  15. 学习笔记-SNN用STDP法的MNIST数据集识别代码深入阅读
  16. [配置文件]_start.wzd
  17. markdown 输入积分符号
  18. 阿里云ACP ACE认证考试重要事项
  19. 《预测控制》学习记录二-DMC的内模控制结构(IMC)分析
  20. 单个路由器设置计算机无线网络,无线路由器无线MAC地址过滤设置方法(指定电脑上网)...

热门文章

  1. 13.罗马数字转整数
  2. ps制作html网页的跳转,PS图片转页面CSS+HTML的步骤
  3. Maven setting文件配置错误:Non-parseable settings..in comment after two dashes (--) next character must be
  4. cout 声明与定义
  5. win版本openssl工具下载安装
  6. 聊聊那些我们不应该被百度惯坏的搜索技巧
  7. android 辅助服务默认开启,Android 检测辅助功能是否开启,并调整设置页面
  8. 计算机sci四区论文,sci四区发表论文是什么水平
  9. Backtrader策略实现(一) | 简单双均线
  10. Java实现身份证号合法性校验(包含港澳台地区)