TA的每日心情 | 奋斗 2016-1-13 12:25 |
---|
签到天数: 3 天 [LV.2]偶尔看看I
|
本帖最后由 small-q 于 2020-6-28 19:09 编辑
大家好,我又来教学iOS破解了!
起因:
2020飘云阁原创:《iOS应用逆向与安全之道》购买地址:https://item.jd.com/12800426.html
我第一时间购买了坛主的书,然后看了好几章节,手非常之痒痒的,想找些目标练习,话说之前,打开 App Store ,由于之前我购买过图片处理软件,
苹果推荐了 Enlight 给我,我随手下载 Quickshot Pro 好家伙,是内购应用,然后随即下载了全家桶,包括 "Enlight-Photos" 即 Quickshot,"Enlight-Video",
"Enlight-Editor","Enlight-Phoenix",话说这软件处理图片视频特效非常不错!可惜内购影响了使用,我的目的是解除它!开始:
第一步:
一台MBP和越狱的机器( iOS 13.5 真香),有些基础内容,本文章将一笔带过,可先观看之前我的文章:https://www.chinapyg.com/thread-136317-1-1.html
,然后根据《iOS应用逆向与安全之道》第二篇 第4章 用任意一种方法脱壳得到无壳ipa备用.
第二步:
猜,Frida 使用你应该了解一下,我们得知内购有一个强大的关键字: receipt (凭据)
先行目标:"Enlight-Phoenix".
frida-trace -U -f com.lightricks.Enlight-Phoenix -m "*[* receipt]"
果然有调用:
此时的小朋友,你是不是非常多????,无法继续? 是的我也是,Frida 只是告诉了我们,这方法有在调用,那解决方案只能IDA
搬出IDA:
...
双击到了
哭,还是一脸问号???? 看来此路不通啊!
后来从C版那里得知,此应用是ReactiveCocoa SDK写的,好吧,转换思维一下,有舍关键字呢???
猜到没: 订阅 (名词:subscription 动词:subscribe)
在芒芒大海中,我捞到关键一针:
意思大体是这样:
NSNumber *boolNumber = [NSNumber numberWithBool:NO];//方法写死了
if ([boolNumber boolValue] & 1)
{
//有订阅跑这里
}esle
{
//执行了关键,所以要买....
}
研究sdk太过复杂,我不玩,那我们尝试,不执行 -[PNXSubscriptionModel setSessionState:] 方法,让它的会话状态设置不上,那是不是就把功能打开了呢?
下面Frida代码测试(感谢B.S)
[JavaScript] 纯文本查看 复制代码 //frida -U -f com.lightricks.Enlight-Phoenix -l QS.js
if(ObjC.available){
var hook = ObjC.classes['PNXSubscriptionModel']["- setSessionState:"];
var add = new NativeFunction(hook.implementation,'void', []);
// 进行替换
Interceptor.replace(add, new NativeCallback(function(num2) {
console.log("你调了我,我不给你东西!");
// 调用原函数
},'void', []));
}
永久代码:
[Objective-C] 纯文本查看 复制代码 %hook PNXSubscriptionModel
- (void) setSessionState: (id)a1{
NSLog(@"[+] Enlight-Phoenix setSessionState");
%log;
//%orig;
}
%end
好家伙功能全部打开,并且可用.
但是,软件启动后有toolbar还有PRO标记图标,并显示了618触销界面! "导出" 功能按钮两字不见了(成了一个空按钮),我们要解决这些问题!
这样,功能说算是打开了,但我个完美主义者,必须修理!
上面三个过程处理如下:
1.去除toolbar里PRO标记图标
还记得我们的猜关键字么? 用动词: Subscribe 去捞下
-[PNXToolbarTreeGenerator toolbarNodeForFeatureNode:featureObjects:isSubscriber:freeAssetsIdentifiers:remoteCellState:featureTree:]
方法里面,isSubscriber影响了toolbar还有PRO标记,我们要做的就是返回:YES, 好!
永久代码:
[Objective-C] 纯文本查看 复制代码 %hook PNXToolbarTreeGenerator
- (id) toolbarNodeForFeatureNode:(id)a1 featureObjects:(id)a2 isSubscriber:(bool)a3 freeAssetsIdentifiers:(id)a4 remoteCellState:(id)a5 featureTree:(id)a6 {
NSLog(@"[+] Enlight-Phoenix toolbarNodeForFeatureNode");
%log;
return %orig(a1,a2,(bool)YES,a4,a5,a6);
}
%end
2. 去除618广告界面
在调试此软件时间在618前,肯定有618关键字,继续猜!捞到:-[PNXSubscriptionModel bindIsPartOf618Promotion]
永久代码:
[Objective-C] 纯文本查看 复制代码 %hook PNXSubscriptionModel
- (void) bindIsPartOf618Promotion {
NSLog(@"[+] Enlight-Phoenix bindIsPartOf618Promotion");
%log;
}
%end
3.导出按钮文字消失,补回显示!
最后,导出那里没有文字的按钮啊,是我的心头痛!
我的想法是没有,那我就主动写,主动插入!然后继续猜,关键字导出(export)
在IDA看到:
UIButton *__cdecl -[PNXExportView exportButton](PNXExportView *self, SEL a2)
{
return self->_exportButton;
}
这个就是导出按钮实例:UIButton *
经C版一指导永久代码如下:
[Objective-C] 纯文本查看 复制代码 %hook PNXExportView
- (void) setupExportButton{
%orig;
NSLog(@"[+] Enlight-Phoenix setupExportButton");
%log;
UIAlertView *alertView1 = [[UIAlertView alloc] initWithTitle:@"提示" message:@"[PYG]出品!\n [url=http://www.chinapyg.com]www.chinapyg.com[/url]" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView1 show];
}
%end
%hook PNXExportView
- (id) exportButton{
NSLog(@"[+] Enlight-Phoenix exportButton");
%log;
UIButton* btn = %orig;
[btn setTitle:@"导出" forState:UIControlStateNormal];
return btn;
}
%end
经这么一折腾,完美!
文章最后附赠全家桶中的另三款永久代码
一个字,都是猜的结果,都没有处理关于处
[Objective-C] 纯文本查看 复制代码 %hook PNXMainViewModel
- (void) bindSubscription {
NSLog(@"[+] Enlight-Phoenix bindSubscription");
%log;
UIAlertView *alertView1 = [[UIAlertView alloc] initWithTitle:@"提示" message:@"完美破解! 功能全部可用." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView1 show];
}
%end
/////////////////////////////////////////////////////////////////
%hook OWLUserSubscriptionStateProvider
- (bool) isSubscriber {
NSLog(@"[+] Enlight-photo OWLUserSubscriptionStateProvider isSubscriber");
%log;
return YES;
}
%end
/////////////////////////////////////////////////////////////////
%hook ENSubscriberInfo
- (bool) isSubscribed {
NSLog(@"[+] Enlight-Editor ENSubscriberInfo isSubscribed");
%log;
return YES;
}
%end
/////////////////////////////////////////////////////////////////
%hook EVDSubscriptionState
- (bool) isSubscriber {
NSLog(@"[+] Enlight-video EVDSubscriptionState isSubscriber");
%log;
return YES;
}
%end
/////////////////////////////////////////////////////////////////
然后,你要做的就是把所有永久代码组合在一个Tweak.x文件里面
再然后.plist文件里写上全家桶就能通杀了
{
Filter = {
Bundles = (
"com.lightricks.Enlight-Photos",
"com.lightricks.Enlight-Video",
"com.lightricks.Enlight-Editor",
"com.lightricks.Enlight-Phoenix",
);
};
}
生成过程,请看上一遍文章,论坛不能给出Bin文件! 感谢你的理解.
第三步 总结:
全家桶里面,最不好搞的就是Phoenix,全程就是一个字:猜!!! 因为作者更本不按套路出牌(不能通过一个全局变量来搞定破解.遇到断头路) 但方法名称又是通往大道之路,猜出一遍天地!
全程感谢吊大的C版不厌其烦的回答我无脑提问,在此深刻感受到学好OC正向编程的重要性,有了正向编程经验再分析破解会做到事伴功倍的效果!
最后感谢飘云编写的 《iOS应用逆向与安全之道》帮助了我很多,书里面有非常多的解决方案,是值得深入学习的一本好书!深入学习方能: 大道至简!
|
评分
-
查看全部评分
|