IOS逆向分析某租房应用 签名生成
本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关;本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文涉及的技术而导致的任何意外,作者均不负责。
01
—
抓包分析
进入租房页面下拉列表拿到接口
可以看到每个接口都有sign以及ajk_sign
看着都非常像md5

其他加密
请求头还有一些关于风控的参数

这篇主要搞sign和ajk_sign
02
—
mach-o生成位置分析
之前文章里面有怎么脱壳获取mach-o文件,不会的可以看看之前的文章
拿到macho文件拖进ida分析
ajk_sign
这个ajk_sign 有两种找到函数实现方法
方法1
追踪urlwith调用栈
这个是一个get https 请求 大部分都会经过urlwith
frida trace 写法是
frida-trace -H xxxxx -F -m "+[NSURL URLWithString:]"
trace文件名字地址
"C:\Users\xxxxx\__handlers__\NSURL\URLWithString_.js"
这个我们需要编辑下这个文件

文件内写法是这样子的
var bt = Thread.backtrace(this.context, Backtracer.ACCURATE);var symbols = bt.map(DebugSymbol.fromAddress).slice(0, 20);log("Call stack:\n" + symbols.join('\n'));
这个需要写在onEnter里面
触发下接口
url会触发多次
一种url没后缀

一种url有后缀

其实我们需要关注的是第一个 因为第二个触发的时候已经有了值
说明第一个触发时候已经完成了参数生成
看下调用栈
0x106b96640 /private/var/containers/Bundle/Application/B24F11C1-E9A5-4D6D-A654-96CA81722FEB/Anjuke.app/Anjuke!+[HSFoundationNetwork p_parameterWithURL:]0x106b96110 /private/var/containers/Bundle/Application/B24F11C1-E9A5-4D6D-A654-96CA81722FEB/Anjuke.app/Anjuke!+[HSFoundationNetwork p_signParamDict:orignalURL:]0x106b95fd4 /private/var/containers/Bundle/Application/B24F11C1-E9A5-4D6D-A654-96CA81722FEB/Anjuke.app/Anjuke!+[HSFoundationNetwork requestTarget:configuration:needOldAJKSign:needWUASign:completionBlock:]0x106681140 /private/var/containers/Bundle/Application/B24F11C1-E9A5-4D6D-A654-96CA81722FEB/Anjuke.app/Anjuke!-[HouseListDataPresenter doIncludeStyleRequestServer:readCache:cache:params:]0x106680c6c /private/var/containers/Bundle/Application/B24F11C1-E9A5-4D6D-A654-96CA81722FEB/Anjuke.app/Anjuke!-[HouseListDataPresenter requestDataForSeparateFilterStyle:]0x1066802dc /private/var/containers/Bundle/Application/B24F11C1-E9A5-4D6D-A654-96CA81722FEB/Anjuke.app/Anjuke!-[HouseListDataPresenter requestData]0x1066b7d08 /private/var/containers/Bundle/Application/B24F11C1-E9A5-4D6D-A654-96CA81722FEB/Anjuke.app/Anjuke!-[HouseListViewController scrollViewDidScroll:]0x192880c20 CoreFoundation!__invoking___0x192750d30 CoreFoundation!-[NSInvocation invoke]0x192751908 CoreFoundation!-[NSInvocation invokeWithTarget:]0x1080c2924 /private/var/containers/Bundle/Application/B24F11C1-E9A5-4D6D-A654-96CA81722FEB/Anjuke.app/Anjuke!-[HALTableViewDelegateProxy forwardInvocation:]0x19287e86c CoreFoundation!___forwarding___0x192880a7c CoreFoundation!_CF_forwarding_prep_00x196d26a24 UIKitCore!-[UIScrollView _notifyDidScroll]0x196ab3c74 UIKitCore!-[UITableView _notifyDidScroll]0x196d10c34 UIKitCore!-[UIScrollView setContentOffset:]
值得关注的
[HSFoundationNetwork p_signParamDict:orignalURL:][HSFoundationNetwork requestTarget:configuration:needOldAJKSign:needWUASign:completionBlock:]
有两个带sign的
其实搜第一个函数就可以直接找到生成位置了如下图

方法二 (第一次可能失败)
第一次反编译ida并不一定都会成功,因为macho 体积比较大并不一定会正确的反编译所以引用
先新打开一个string视图ida

搜sign太多,搜ajk_sign
可搜到一个匹配项

查引用

继续查引用

点进去会发现还是刚才的我们找到的那个函数

建议第一次先用方法1
03
—
函数分析
函数

没啥加密基本都是明文
objc_retainAutoreleasedReturnValue(objc_msgSend(v11, "string02XFromMD5")),

要确定 objc_msgSend(v11, “string02XFromMD5”) 实际调用的是哪个函数,关键在于 Objective-C 的方法派发机制。v11 是一个 NSMutableString 对象(它继承自 NSString),调用 string02XFromMD5 方法时,运行时系统会:
查找 v11 对象的类(NSMutableString)中是否实现了 string02XFromMD5 方法。
如果没有,继续向上查找父类 NSString。
如果 NSString 的分类中有实现,则使用该实现。
-[NSString string02XFromMD5] __text 00000001055C63E0 000000F8 000000C0 R . . . . . B T . .




04
—
总结
夜雨聆风