楼小二IOS逆向手记(破解扫码开闸,含接口破解)

楼小二IOS逆向手记(破解扫码开闸)

如非特别注明,本人文章均为原创,转载请注明出处并保留本文所有内容。

email:udf.q@qq.com

原文发于本人小笔记 http://leanote.bitcode.tk:251/blog/post/sma11case/%E6%A5%BC%E5%B0%8F%E4%BA%8CIOS%E9%80%86%E5%90%91%E6%89%8B%E8%AE%B0-%E7%A0%B4%E8%A7%A3%E6%89%AB%E7%A0%81%E5%BC%80%E9%97%B8 此处做个备份,转载请保留此段文字, 原文附赠登录算法爆破,欢迎指导~~~


废话略过,本文只解说逆向思路和关键过程,其中涉及的工具和重签名打包等知识请自行谷歌。

1. App Store安装最新版本(本文使用4.6版本),部署抓包代理,设置好iPhone全局代理后启动APP,依次登录账号,选择有开闸权限的楼宇(抓取样本数据),进入一次二维码界面,把抓到所有请求保存好备用。

2. SSH连接到越狱手机,ps -ef查看进程并进行砸壳,把砸壳后的APP复制到电脑备用。

3. 检查APP的可执行文件架构lipo -info <execute_file>,如果是FAT-FILE,建议精简为ARM64架构减小文件体积方便调试(调试时需要反复复制到手机)。

4. 使用class-dump生成头文件,放/tmp/headers,使用grep命令对头文件进行搜索,关键字QR,得到二维码页面的控制器类名LXEQrCodeBreakingViewController

5. 查看对应类名的方法列表,HOOK可疑的方法,挂调试器打断点得到真实有效方法名- (id)createQRForString:(id)arg1;,二话不说,打断点po arg1得到二维码的数据格式,a|b|c|d,其中b是手机号,c每次不同,猜测是时间戳,随便找个在线工具反查一下,发现是毫秒的时间戳,此时四个数据破译了两个(毫无压力 _)。

6. 把剩下的两个数据在刚才抓包的所有请求中搜索,发现直接就是接口结果,一个是城市id,另一个是楼宇id,id明显是不会随便改变的,至此二维码数据已经破译完毕,开闸时把四个数据写死在APP中,改变时间戳生成不同二维码即可开闸。

7. 但仅是可以开闸并不能满足技术探索的需要,因此继续看请求的数据,发现每个请求都有sign字段,很明显是对请求进行签名,如果签名不对则直接返回错误,数一下sign数据长度,32位,嗯~~,很熟悉的长度,直接猜测是MD5,废话少说,在头文件中搜索md5关键字,发现很多类有md5相关方法,把可疑的HOOK掉反复尝试(其实也不用怎么猜测,类名LXE开头的才是APP的~~~),最后得到确定的方法名[LXEEncryptTool md5:],啥也不说,挂调试器,下断点~~

8. 随便请求几个接口,发现规则很EASY,把sendData字段数据的KEY进行排序,拼接为URL格式,然后加上&A#Rf-f8Cs=La6&<时间戳>,生成sign后合并成请求数据,嗯,很好,正常返回了,有盐有味~~~至此接口规则也爆破完了~~~

9. 收工

附上关键接口列表


// 查询城市列表
static NSString *const kLXECityListUrl = @"https://louxiaoer.cloudsplus.com.cn/louxe-mall-api/intf/Building_queryCityList.do";

// 查询楼宇列表
static NSString *const kLXEBuildingListUrl = @"https://louxiaoer.cloudsplus.com.cn/louxe-mall-api/intf/Building_queryCityBuildingList.do";