[原创]ios逆向-app登录协议分析破解
发表于:
2021-11-9 19:07
42787
某app登录协议逆向分析 设备
iphone 5s
Mac Os
app:神奇的字符串57qm5Y2V 本文主要通过frida-trace、fridaHook、lldb动态调试完成破解相应的登录算法,从达到登录成功,并根据该步骤完成ios逆向分析,文中所有涉及的脚本都已经放在github上面。 抓包分析 之前文章已经进行了详细的抓包教程。iOS系统抓包入门实践之短链
从上图中可以看到ydtoken、请求响应以及该接口涉及到的mobile
为要破解的内容。
请求参数分析这里涉及到的frida相关环境安装配置可以参考ios逆向-frida&环境&破解appSign算法
ydtoken通过砸壳以及ida分析
加密是通过yd_md5:
方法进行加密,继续追踪。
调用CC_MD5
进行加密。 通过trace命令:frida-trace -UF -i "CC_MD5"
,可以很快速的破解该app的ydtoken
算法。frida默认trace是不能打印入参的,更改之后如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
onEnter(log, args, state) {
log(
'CC_MD5()--arg[0]='
+
args[
0
].readUtf8String());
},
onLeave(log, retval, state) {
log(
'CC_MD5()--return--='
);
var md5_digest
=
hexdump(retval,{length:
16
});
var hexified
=
" "
;
var raw_array
=
md5_digest.split(
"\n"
);
for
(var a
=
0
; a<raw_array.length; a
+
+
)
{
var line_array
=
raw_array[a].split(
" "
);
for
(var b
=
1
; b<line_array.length
-
1
; b
+
+
)
{
if
(line_array[b].length
=
=
=
2
)
{
hexified
+
=
line_array[b];
hexified
=
hexified.trim();
}
}
}
log(hexified
+
"\n"
);
}
}
参数显示出来了
Mobile在ida分析之后,发现该算法是属于des加密。 使用默认的CCCrypt继续trace:frida-trace -FU -i CCCrypt
更改之后的trace脚本代码较长,放在了github。141K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6*7K9r3q4G2j5X3!0&6z5e0j5&6x3W2)9J5c8X3c8S2K9h3I4&6j5h3&6S2L8s2W2K6K9i4x3`.
响应分析这里主要是针对响应内容无法正常看到信息,目前通过Mac的日志控制台定位发现,这里其实定位了好久,直到最后才通过日志找到算法位置。
接口返回信息失败这块的日志定位到该响应解密的位置parseStringByRule:
这里其实是对后台的数据做了一个映射。sohoFilteredInfo
是把映射key和value做成字典。
这里的数字对应ASCII
的值,那要解密响应内容,只需要获取该key、value的映射关系即可。这里使用fridaHook、lldb进行获取该映射关系。
fridaHook确定到算法位置之后,使用frida进行hook。
1
2
3
4
5
6
7
8
9
10
11
12
var className
=
"ADAuthenticationRule"
;
var methodName
=
"- parseStringByRule:"
;
var hooking
=
ObjC.classes[className][methodName];
Interceptor.attach(hooking.implementation, {
onEnter: function (args) {
var obj
=
ObjC.
Object
(args[
0
]);
console.log(
'sohoFilteredInfo'
,obj.sohoFilteredInfo())
},
onLeave: function (returnValues) {
}
});
lldb debugserver处理
将未经处理的debugserver从iOS拷贝到macOS中的,scp root@iOSIP:/Developer/usr/bin/debugserver ~/debugserver
瘦身 lipo -thin arm64 ~/debugserver -output ~/debugserver
iphone5s是arm64
给debugserver添加task_forpid权限/opt/theos/bin/ldid -Sent.xml debugserver
或者 codesign -s - --entitlements ent.plist -f debugserver
[entitlements.plist](78bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4A6Z5j5h3!0^5K9h3&6U0K9r3g2F1k6#2)9J5k6h3y4G2L8g2)9J5c8Y4N6H3i4K6u0V1j5$3!0F1N6r3g2F1N6q4)9J5c8Y4g2H3L8r3!0S2k6s2y4Q4x3V1j5J5x3o6t1I4i4K6u0r3x3e0q4Q4x3V1k6W2L8Y4c8A6N6r3I4W2L8h3g2F1N6s2y4Q4x3X3g2H3L8r3W2K6N6l9`.`. .zip "entitlements.plist")
将经过处理的debugserver拷回iOS scp ~/debugserver root@iOSIP:/usr/bin/debugserver
在iOS上用debugserver来attach进程 : ssh连接手机之后,使用debugserver localhost:1234 -a pid
lldb调试 在mac终端执行lldb。 使用iproxy
端口转发 iproxy 1234 1234
在lldb中执行process connect connect://localhost:1234
链接手机debugserver 动态调试需要知道基地址+偏移。 查看macho基地址:image list -f -o
,红色框就是基地址
计算需要下断点的地址: 下断地址=0x0000000000638000+0x0000000100104EF0=0x10073CEF0 此处地址是映射方法返回的值,也就是解密需要的映射表。b 0x10073CEF0
下断点 运行app 停到了断点位置,读取x0的值,映射函数返回值给了x0寄存器。po $x0
c
app继续运行。 更多命令可以 help
查看。
效果
小结该app用来练手最好不过,没有特别复杂的算法,又需要一定的耐心跟踪。在后边的映射中,要是更懂oc的语法,可能会更加上手。 文中涉及脚本github地址(喜欢可以点小星星):05eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6*7K9r3q4G2j5X3!0&6z5e0j5&6x3W2)9J5c8X3c8S2K9h3I4&6j5h3&6S2L8s2W2K6K9i4x3`.
参考文章248K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6A6L8%4y4J5k6g2)9J5k6h3y4G2L8g2)9J5c8Y4c8Q4x3V1k6V1k6h3u0#2k6%4y4W2M7Y4k6W2M7W2)9J5k6r3I4D9k6r3u0Q4x3X3c8Y4k6r3u0Q4x3V1j5$3y4b7`.`. 376K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2B7K9h3q4F1M7$3S2#2i4K6u0W2j5$3!0E0i4K6u0r3M7q4)9J5c8U0k6W2y4X3u0T1x3r3b7H3k6h3f1%4z5l9`.`.
[注意]看雪招聘,专注安全领域的专业人才平台!
最后于 2021-11-9 19:45
被mb_aoooaosd编辑
,原因: