前情提要
最近在追一个护士小姐姐,带出来玩了两次手都牵上了感觉很有机会,而且最近沉迷拍照,要修图的时候发现网上的版本最高也就是24.2.0,而且一联网还提示我ps无法使用,显然是检测到了盗版。无奈之下只能自己动手破解最新版,就为了修自己拍的照片。
那么看我帖子比较多的朋友呢我就不重复一些简单的步骤了,大家可以参考我早期发布的帖子互补一下相关的信息。
这次破解PS也是受到了一些朋友的帮助,还有HSICO团队放出来的24.2版本的破解文件,在此表示感谢。
本文并没有写出我失败的过程,仅仅写了成功的步骤,所以内容会有些简短。
0x01 开始
16825993302724.jpg (260.92 KB, 下载次数: 0)
下载附件
2023-4-28 04:01 上传
16825995218177.jpg (243.52 KB, 下载次数: 0)
下载附件
2023-4-28 04:01 上传
0x02 先上LLDB
lldb /Applications/Adobe\ Photoshop\ 2023/Adobe\ Photoshop\ 2023.app/Contents/MacOS/Adobe\ Photoshop\ 2023
输入run直接附加上去启动看看。
16825995811823.jpg (69.16 KB, 下载次数: 0)
下载附件
2023-4-28 04:01 上传
16825996583066.jpg (366.64 KB, 下载次数: 0)
下载附件
2023-4-28 04:01 上传
开局就给了我一点小小的购买正版震撼。
为了看反汇编,我们放出IDA跑一下。
16826000060998.jpg (934.37 KB, 下载次数: 0)
下载附件
2023-4-28 04:01 上传
等待分析IDA结果时,我们先观察一下这个app。
首先这是订阅制,那么订阅制有两种方案,一种是伪造返回数据,另一种自然就是爆破用户检查有效期的函数了。伪造数据比较复杂,这里还是选择爆破关键函数。
我们打开抓包软件,观察如下:
在启动app时,我们看到这样:
16826199923010.jpg (355.58 KB, 下载次数: 0)
下载附件
2023-4-28 04:01 上传
而颇为凑巧的是,app还发送了一个获取用户信息的请求
16826200559653.jpg (1003.67 KB, 下载次数: 0)
下载附件
2023-4-28 04:01 上传
那么我们必然是有端联想:
他通过这个api获取用户信息后进行检查是否过期,如果过期则弹窗强制退出app,否则继续使用。
下面就开始检察官搜查系列:
16826204808286.jpg (325.86 KB, 下载次数: 0)
下载附件
2023-4-28 04:01 上传
可以看到这个网址确实存在且只有一个地方引用,所以我们开始跳转过去:
为了找到调用堆栈,我们要给1042C6E13地址下断点:
br s -a 0x1042C6E13
随后输入r重启app,让他断在我们的地址:
Process 72209 stopped
* thread #16, name = 'com.adobe.ngl-0x70000db2f000', stop reason = breakpoint 9.1
frame #0: 0x00000001042c6e13 Adobe Photoshop 2023`___lldb_unnamed_symbol253631 + 9
Adobe Photoshop 2023`___lldb_unnamed_symbol253631:
-> 0x1042c6e13 : lea rsi, [rip + 0x37502c1] ; "/ims/token/v4"
0x1042c6e1a : call 0x1042c6750 ; ___lldb_unnamed_symbol253608
0x1042c6e1f : mov rax, rbx
0x1042c6e22 : add rsp, 0x8
Target 0: (Adobe Photoshop 2023) stopped.
(lldb)
然后我们输入bt查看堆栈
(lldb) bt
* thread #16, name = 'com.adobe.ngl-0x70000db2f000', stop reason = breakpoint 9.1
* frame #0: 0x00000001042c6e13 Adobe Photoshop 2023`___lldb_unnamed_symbol253631 + 9
frame #1: 0x000000010422b883 Adobe Photoshop 2023`___lldb_unnamed_symbol252241 + 1499
frame #2: 0x0000000104227a09 Adobe Photoshop 2023`___lldb_unnamed_symbol252233 + 145
frame #3: 0x0000000104229885 Adobe Photoshop 2023`___lldb_unnamed_symbol252235 + 61
frame #4: 0x000000010428c40e Adobe Photoshop 2023`___lldb_unnamed_symbol253115 + 28
frame #5: 0x0000000104296911 Adobe Photoshop 2023`___lldb_unnamed_symbol253131 + 2499
frame #6: 0x0000000104287eaf Adobe Photoshop 2023`___lldb_unnamed_symbol253076 + 101
frame #7: 0x00000001042a4b0a Adobe Photoshop 2023`___lldb_unnamed_symbol253187 + 44
frame #8: 0x00000001042db930 Adobe Photoshop 2023`___lldb_unnamed_symbol253891 + 270
frame #9: 0x00000001041a470e Adobe Photoshop 2023`___lldb_unnamed_symbol250887 + 66
frame #10: 0x00000001041d6a0e Adobe Photoshop 2023`___lldb_unnamed_symbol251200 + 646
frame #11: 0x00000001041d3b62 Adobe Photoshop 2023`___lldb_unnamed_symbol251156 + 34
frame #12: 0x000000010424e497 Adobe Photoshop 2023`___lldb_unnamed_symbol252488 + 71
frame #13: 0x00000001041ec35a Adobe Photoshop 2023`___lldb_unnamed_symbol251707 + 26
frame #14: 0x000000010424e5d7 Adobe Photoshop 2023`___lldb_unnamed_symbol252490 + 59
frame #15: 0x00007ff81a66d1d3 libsystem_pthread.dylib`_pthread_start + 125
frame #16: 0x00007ff81a668bd3 libsystem_pthread.dylib`thread_start + 15
(lldb)
都是非常可疑的函数调用链条,为了一步到位我们直接看#14.
__int64 __fastcall sub_10424E59C(_QWORD *a1)
{
void **v1; // rbx
pthread_key_t *v2; // rax
const void *v3; // rsi
__int64 (__fastcall *v4)(_QWORD); // rax
_QWORD *v5; // rdi
__int64 v6; // rax
v1 = a1;
v2 = std::__1::__thread_local_data(a1);
v3 = *a1;
*a1 = 0LL;
pthread_setspecific(*v2, v3);
v4 = a1[1];
v5 = v1[3] + v1[2];
if ( v4 & 1 )
v4 = *(v4 + *v5 - 1);
v6 = v4(v5);
sub_10424E1BE(v6, v1);
operator delete();
return 0LL;
}
可以看到这里显然是一个线程函数,__thread_local_data/pthread_setspecific一出来我就闻到那味儿了。
虽然但是,这里还不算,我们继续xref看看有没有引用了:
unsigned int __fastcall sub_10424E4E8(pthread_t *a1, __int128 *a2, __int64 *a3)
{
__int64 *v3; // r12
std::__1::__thread_struct *v4; // r15
char *v5; // rbx
__int128 v6; // xmm0
__int64 v7; // rax
unsigned int result; // eax
const char *v9; // rdx
v3 = a3;
v4 = operator new(8uLL);
std::__1::__thread_struct::__thread_struct(v4);
v5 = operator new(0x20uLL);
v6 = *a2;
v7 = *v3;
*v5 = v4;
*(v5 + 8) = v6;
*(v5 + 3) = v7;
result = pthread_create(a1, 0LL, sub_10424E59C, v5);
if ( result )
{
std::__1::__throw_system_error(result, "thread constructor failed", v9);
BUG();
}
return result;
}
这里adobe创建了一个线程并返回了线程id,恰好执行的sub_10424E59C任务就是我们找到这个函数。
0x03 注入补丁持久化破解
我们新建一个Library库,编写一个简单的hook代码将sub_10424E59C这个函数nop掉。
关于如何新建Library库进行注入,可以看我之前的帖子,这些基本步骤都相同,在此不再赘述。
16826253039257.jpg (498.88 KB, 下载次数: 0)
下载附件
2023-4-28 04:01 上传
随后复制/Applications/Adobe Photoshop 2023/Adobe Photoshop 2023.app/Contents/Frameworks/AdobeARE.framework/Versions/A/AdobeARE到/Applications/Adobe Photoshop 2023/Adobe Photoshop 2023.app/Contents/Frameworks/AdobeARE.framework/Versions/A/AdobeARE_副本,然后注入我们编译出来的补丁:
sudo insert_dylib /Users/qiuchenly/Library/Caches/JetBrains/AppCode2023.1/DerivedData/InlineInjectPlugin-eklzvojrwuuobhdysecelanfrlvy/Build/Products/Debug/libInlineInjectPlugin.dylib /Applications/Adobe\ Photoshop\ 2023/Adobe\ Photoshop\ 2023.app/Contents/Frameworks/AdobeARE.framework/Versions/A/AdobeARE_副本 /Applications/Adobe\ Photoshop\ 2023/Adobe\ Photoshop\ 2023.app/Contents/Frameworks/AdobeARE.framework/Versions/A/AdobeARE
Last login: Fri Apr 28 00:51:22 on ttys003
❯ sudo insert_dylib /Users/qiuchenly/Library/Caches/JetBrains/AppCode2023.1/DerivedData/InlineInjectPlugin-eklzvojrwuuobhdysecelanfrlvy/Build/Products/Debug/libInlineInjectPlugin.dylib /Applications/Adobe\ Photoshop\ 2023/Adobe\ Photoshop\ 2023.app/Contents/Frameworks/AdobeARE.framework/Versions/A/AdobeARE_副本 /Applications/Adobe\ Photoshop\ 2023/Adobe\ Photoshop\ 2023.app/Contents/Frameworks/AdobeARE.framework/Versions/A/AdobeARE
Password:
====================
2023.2.26 秋城落叶修改版
感谢insert_dylib的开源人员!仓库地址:https://github.com/Tyilo/insert_dylib
====================
/Applications/Adobe Photoshop 2023/Adobe Photoshop 2023.app/Contents/Frameworks/AdobeARE.framework/Versions/A/AdobeARE 目标文件已经存在. 要重写他吗? [y/n] y
这是一个FAT格式二进制,携带 2 个架构的代码(Intel/Apple Silicon ARM64).
发现代码加载签名: LC_CODE_SIGNATURE load command. 要自动删掉吗? [y/n] y
发现代码加载签名: LC_CODE_SIGNATURE load command. 要自动删掉吗? [y/n] y
添加 LC_LOAD_DYLIB 指令到通用架构, 应用程序:/Applications/Adobe Photoshop 2023/Adobe Photoshop 2023.app/Contents/Frameworks/AdobeARE.framework/Versions/A/AdobeARE。
这样就注入成功。
然后我们直接打开PhotoShop,可以看到成功破解。
16826238316789.jpg (363.92 KB, 下载次数: 0)
下载附件
2023-4-28 04:01 上传
存在的问题
[ol]
[/ol]
参考补丁文件
https://github.com/QiuChenly/MyMacsAppCrack