Tools
[ol]
[/ol]
0x01 灵根育孕源流出 心性修持大道生
从AppStore下载的版本如图所示。
16727307240306.jpg (153.72 KB, 下载次数: 0)
下载附件
2023-1-3 16:24 上传
左下角有一个订购按钮,盲猜订阅后会消失。但这并不是重点。
0x02 悟彻汇编真妙理 断魔归本合元神
正如上图所示,肯定要搜字符串"您的试用期还剩下xxx"啊!
这种想法是错误的。我们看一下代码:
16727318115160.jpg (874.28 KB, 下载次数: 0)
下载附件
2023-1-3 16:24 上传
函数是顺序执行的,也就是说: 只有没有订阅的用户才会提示这个字符串,如果订阅了会直接不显示。
这一点我们打开start函数----也就是app入口函数佐证这一点:
16727320415899.jpg (826.93 KB, 下载次数: 0)
下载附件
2023-1-3 16:24 上传
注意看伪代码228行,我来翻译一下这段代码:
if(v37){//如果v37的值非0:意思就是v37这个寄存器内有数据
v38=v37;//意义不明 反编译器的bug
v39=getUserReceipt().decryptPKCS5:WithPassword(qwordxxxx);//解密用户购买的授权文件
v42=AESEncryptUtil.dictionaryWithJsonString(v40);//转换为JSON数据给软件读取
if(v42){//如果数据不为0:指寄存器中存在数据
byte_10003BDD8 = sub_10001D3D4(v42) != 0;//byte_10003BDD8赋值为1表示注册成功,意思就是sub_10001D3D4()返回值要非0才行.
}
}
if ( byte_10003BDD8 )//如果为1
{
objc_msgSend(v3, "removeObjectForKey:", "LeftTime");//删除剩余时间key对应的数据 应该是类似于取消显示
byte_10003BAA8 = 0;
goto LABEL_47;//这里直接跳转到启动主程序代码 而不进行后面的剩余时间计算
}
想必大家都看得懂了。那么我是怎么知道这里是检查授权的呢?
16727331827649.jpg (53.56 KB, 下载次数: 0)
下载附件
2023-1-3 16:25 上传
答案很简单,我直接翻开入口函数就发现这段代码了。
做IOS开发的想必知道receipt这个单词的意思,虽然我对IOS开发一窍不通:这是表示读取Apple用户订阅的有效授权票。
结合上面说到的跳转,我想你也能猜到这到底代表什么意思了吧!
那么爆破点在哪里呢?
0x03 IDA助威征正版 落叶施法灭授权
即然知道问题在哪里,那么我们就要狠狠的Crack it。
if ( v37 )
{
v38 = v37;
v39 = objc_msgSend(&OBJC_CLASS___AESEncryptUtil, "decryptPKCS5:WithKey:", v37, qword_10003BDE8);
v40 = objc_retainAutoreleasedReturnValue(v39);
objc_release(v38);
v41 = objc_msgSend(&OBJC_CLASS___AESEncryptUtil, "dictionaryWithJsonString:", v40);
v42 = objc_retainAutoreleasedReturnValue(v41);
v43 = v42;
if ( v42 )
byte_10003BDD8 = sub_10001D3D4(v42) != 0;
objc_release(v43);
objc_release(v40);
v28 = v115;
}
改为
if ( !v37 )
{
v38 = v37;
nop;
v40 = objc_retainAutoreleasedReturnValue(v39);
objc_release(v38);
nop;
v42 = objc_retainAutoreleasedReturnValue(v41);
v43 = v42;//由于nop了赋值函数 这里v41会变成0 也就是v42会变成0 所以要把jz改成jnz强制跳转。
if ( !v42 )
byte_10003BDD8 = sub_10001D3D4(v42) != 0;
objc_release(v43);
objc_release(v40);
v28 = v115;
}
16727329919354.jpg (1.23 MB, 下载次数: 0)
下载附件
2023-1-3 16:25 上传
也就是如图所示两个夺命连环Call。如果你不nop掉软件会因为null指针崩溃:因为你根本没有授权文件,读到的可不就是null?
16727331128532.jpg (1.21 MB, 下载次数: 0)
下载附件
2023-1-3 16:25 上传
黄色表示修改后的字节。
sub_10001D3D4函数改返回值 6a 01 58 c3。
16727329075137.jpg (1.29 MB, 下载次数: 0)
下载附件
2023-1-3 16:25 上传
改为
16727329371773.jpg (267.85 KB, 下载次数: 0)
下载附件
2023-1-3 16:25 上传
即可。
最后别忘了v37也需要反转字节哦!jz改为jnz即可。
16727335333089.jpg (575.37 KB, 下载次数: 0)
下载附件
2023-1-3 16:25 上传
最后改完之后伪代码如下:
16727335649197.jpg (172.72 KB, 下载次数: 0)
下载附件
2023-1-3 16:25 上传
最后导出文件,codesign it。
16727333896088.jpg (120.72 KB, 下载次数: 0)
下载附件
2023-1-3 16:25 上传
打开app:
16727336102263.jpg (50.78 KB, 下载次数: 0)
下载附件
2023-1-3 16:25 上传
发现左下角的订购按钮已经悄然失踪。并且应该不会有暗桩,因为上面计算时间的代码此时被我强制跳过,也就是走的正版激活版本的流程。
0x04 九九数完魔灭尽 三三行满道归根
最后欣赏一下成品:
16727337749813.jpg (141.4 KB, 下载次数: 0)
下载附件
2023-1-3 16:25 上传