乐于分享
好东西不私藏

IOS逆向分析某租房应用 签名生成

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(020); 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

函数分析

函数

没啥加密基本都是明文

我们其实不用分析上面那些字典排序取值,其实只用找到加密的入口hook加密明文值就可以了
 objc_retainAutoreleasedReturnValue(objc_msgSend(v11, "string02XFromMD5")),
看到这里是有一个frommd5的关键字在方法中搜索下
可以看到很多
怎么确定那个是我们需要hook的md5呢

要确定 objc_msgSend(v11, “string02XFromMD5”) 实际调用的是哪个函数,关键在于 Objective-C 的方法派发机制。v11 是一个 NSMutableString 对象(它继承自 NSString),调用 string02XFromMD5 方法时,运行时系统会:

查找 v11 对象的类(NSMutableString)中是否实现了 string02XFromMD5 方法。

如果没有,继续向上查找父类 NSString。

如果 NSString 的分类中有实现,则使用该实现。

所以我们需要hook这个
-[NSString string02XFromMD5]	__text	00000001055C63E0	000000F8	000000C0		R	.	.	.	.	.	B	T	.	.
hook如下
就是我们的请求参数拼接到一起再加一盐 最后进行md5就是
ajk_sign了
对比一下
一模一样
我们看hook还会发现有这俩
可以看到这个结果就是signature
都是标准的md5
至于signture的明文组成都是什么大家可以自己研究

04

总结

函数不难,但是找这个加密位置第一次可能找不到,下一篇打算继续看这个app 看下 wua 的生成应该和风控相关