iOS逆向-手把手教你写支付宝蚂蚁森林收集能量助手

前言

发现iOS支付宝逆向的分析并不多,蚂蚁森林基于H5应用 套着UIWebView 基本也没这类JS和原生交互分析的帖子,就拿此练手吧 作技术分享

去掉 ptrace 和 __RESTRICT section 两个保护

脱壳和dump头文件

分析和调试

编写Tweak

总结

环境

MacBook,iPhone6,iOS 9.3.3越狱, iOS支付宝10.1.5

工具

theos

Tweak制作工具

xcode

用lldb来附加调试

class-dump

导出头文件

dumpdecrypted

> 脱appstore的壳

iHex

二进制编辑器

去掉 __RESTRICT section  和 ptrace 两个保护

去掉 __RESTRICT section 步骤

ssh到手机 执行命令 ps -e

找到 /var/containers/Bundle/Application/DD6D8BA3-95F2-4C6D-BFD7-0E20420A6E9C/AlipayWallet.app/AlipayWallet

切换到mac电脑 使用scp命令 把执行文件拷到电脑上scp root@192.168.2.2:/var/containers/Bundle/Application/C6F2DD99-6450-4838-98B8-2899E8EBC1A4/AlipayWallet.app/AlipayWallet /Users/hack/Desktop/wz

打开iHex 查找command+f 把 RESTRICT和restrict替换为其他值(比如:RRRRRRRR和rrrrrrrr。保证长度不变就行啦)看图1

拷贝文件回去scp /Users/hack/Desktop/wz/AlipayWallet root@192.168.2.2:/var/containers/Bundle/Application/C6F2DD99-6450-4838-98B8-2899E8EBC1A4/AlipayWallet.app/AlipayWallet

如果打开闪退 请Cydia中安装 AppSync

去除ptrace保护

使用theos 创建Tweak 代码如下 安装到手机就可以

#import

#import

static int (*orig_ptrace) (int request, pid_t pid, caddr_t addr, int data);

static int my_ptrace (int request, pid_t pid, caddr_t addr, int data){

if(request == 31){

NSLog(@"[AntiAntiDebug] - ptrace request is PT_DENY_ATTACH");

return 0;

}

return orig_ptrace(request,pid,addr,data);

}

%ctor{

MSHookFunction((void *)MSFindSymbol(NULL,"_ptrace"),(void*)my_ptrace,(void**)&orig_ptrace);

NSLog(@"[AntiAntiDebug] Module loaded!!!");

}

脱壳和dump头文件

执行命令 cycript -p AlipayWallet 注入支付宝进程

执行命令 [[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]

看到返回 /var/mobile/Containers/Data/Application/5E744C4A-5B05-4280-A21C-9E6EFE8EF51D/Documents/

执行命令 cd /var/mobile/Containers/Data/Application/5E744C4A-5B05-4280-A21C-9E6EFE8EF51D/Documents/

把 dumpdecrypted.dylib拷贝进去scp /Users/cardlan/Downloads/dumpdecrypted-master/dumpdecrypted.dylib root@192.168.2.2:/var/mobile/Containers/Data/Application/5E744C4A-5B05-4280-A21C-9E6EFE8EF51D/Documents/

执行命令 DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/DD6D8BA3-95F2-4C6D-BFD7-0E20420A6E9C/AlipayWallet.app/AlipayWallet

如果发现提示Killed: 9 切换su mobile 再试 提示成功如下

DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.

[+] detected 64bit ARM binary in memory.

[+] offset to cryptid found: @0x100034d90(from 0x100034000) = d90

[+] Found encrypted data at address 00004000 of length 56786944 bytes - type 1.

[+] Opening /private/var/containers/Bundle/Application/C6F2DD99-6450-4838-98B8-2899E8EBC1A4/AlipayWallet.app/AlipayWallet for reading.

[+] Reading header

[+] Detecting header type

[+] Executable is a plain MACH-O image

[+] Opening AlipayWallet.decrypted for writing.

[+] Copying the not encrypted start of the file

[+] Dumping the decrypted data into the file

[+] Copying the not encrypted remainder of the file

[+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset d90

[+] Closing original file

[+] Closing dump file

执行ls 找到  AlipayWallet.decrypted scp拷贝到电脑就可以

接下来使用 class-dump 导出头文件到当前文件夹

class-dump -H AlipayWallet.decrypted -o ./

分析和调试

打开支付宝到蚂蚁森林界面 cycript -p  AlipayWallet

我们从UI入手 执行[[UIApp keyWindow]recursiveDescription] 看到

我们返回上面找控制器[#0x1386dc970 nextResponder]  看到

我们去之前导出的头文件翻翻 找到这个控制器 看看有什么敏感的方法和属性,我们的目要找到关键的点击事件或者相关的逻辑

我们使用choose(H5WebViewController) 拿到实例 测试一下头文件的方法看看

看了一大圈真没什么什么进展,url 无法直接打开的 再想想UIWebView和原生交互的方法,如下代码获取个Html源码来看看

类似于WebViewJavascriptBridge 咱们找下callback方法或者send方法试试

[#0x136a28400 lastMainRequest]

" { URL: https://60000002.h5app.alipay.com/app/src/home.html?__webview_options__=transparentTitle%3Dauto%26canPullDown%3DNO }"

[#0x136a28400 h5WebView]

#">"

[#0x136a28400 stringByEvaluatingJavaScriptFromString:"document.documentElement.innerHTML"]

我们来使用THEOS 自带的logify.pl  生成H5WebViewController的全部方法调用和参数日志

/opt/theos/bin/logify.pl H5WebViewController.h >Tweak.xm

编译 Tweak.xm 注意:有编译出错 有些类和代{过}{滤}理block是不认识的 出错的删掉就可以

CDUnknownBlockType 作参数的可以替换成 id 继承于 DTViewController 替换成

安装之后 手机连上我们电脑 打开xcode -菜单Window-Devices-Simulators

我们点击那个能量按钮收取别人的能量看看

接下来我们使用xcode 自带的lldb来调试支付宝(默认xcode无法调试第三方应用)我们接下来给app加个权限

没权限提示

Ensure “AlipayWallet” is not already running, and cardlan_yuhuajun has permission to debug it.

注意:要使用脱壳之后的AlipayWallet执行下面的命令,也就是AlipayWallet.decrypted 重命名为AlipayWallet(否则闪退)

将应用程序从设备上拷贝到本地

利用 ldid 将应用程序的 code sign 导出:ldid -e AlipayWallet >> AlipayWallet.xml

在 AlipayWallet.xml 文件中添加 get-task-allow 权限

get-task-allow

利用 ldid 对应用进行重签名 ldid -SAlipayWallet.xml ./AlipayWallet

将应用拷回设备,将设置可执行权限 chmod 755 AlipayWallet

完成

(图3)

ps:如果如上操作还闪退 请重启iphone

然后我们连上手机 xcode 随便弄个工程 选择iphone 看图来开始附加AlipayWallet(图4) 点到森林界面点击xcode自带的看界面工具 然后再xcode 右下角自带的lldb 下断点

我们先试着下断函数

b -[H5WebViewController reportClickTime]

提示找不到no locations 我们随便找个地址 看看堆栈信息

po [H5WebViewController _shortMethodDescription]

找一个地址

b 0x1057daab0

重开页面 触发断点 ,点开xcode的堆栈窗口如(图5)

发现很多地址是没函数名的 当然也无法直接对函数名下断点 我们借用大神写的工具来恢复这些信息 文章链接如下

http://www.jianshu.com/p/967b6631756c

之后 再附加一下

下这个断点

b -[H5WebViewController reportClickTime]

发现是可以成功下断了 继续查看堆栈信息 现在函数名全部全了

(图6)

往上回溯 思路 因为我们想找到是js过来的参数和调用原生方法是哪里过来的

毕竟 reportClickTime 不是我们要分析的

看到PSDJsBride 调用了很多次 而且看参数和函数名 很有可能 中转了消息和参数 为了验证我们的猜想 ,我们使用logify.pl 来生成tweak 打印他全部的调用日志

安装到手机之后,我们取消断电  打开xcode的日志看打印 有没有敏感的信息调用

br delete

点击好友的那个能量收取 把日志全部copy 到Sublime text

看图(7)

我们看到这个英文单词 收集的意思 我们猜想这个就是收集能量的命令,看参数体有friedID 确定性90%了

证实猜想 我们用cycript 来试试 拿到PSDJsBridge 的实例 可以用choose也可以用日志打印那个

[#0x14a0bed80 _doFlushMessageQueue:@"把参数拷贝过来(自己处理转义 里面有/"号)" url:@"第二个参数"];

提供下我日志的

_doFlushMessageQueue:[{"handlerName":"remoteLog","data":{"seedId":"ANTFOREST-BEHAVIOR-CLICK-COLLECT","param1":"shareBiz=none^bubbleId=26219984^actionUserId=2088322012980000^type=behavior^currentTimestamp=1510797618289","param2":"monitor_type=clicked^remoteType=info^pageName=home.html^pageState=friend2088322012980000_enterhomeOff","bizType":"antForest"},"callbackId":"remoteLog_15107976182890.5985529306344688"},{"handlerName":"rpc","data":{"operationType":"alipay.antmember.forest.h5.collectEnergy","requestData":[{"userId":2088322012987680,"bubbleIds":[26219984],"av":"5","ct":"ios"}],"disableLimitView":true},"callbackId":"rpc_15107976182910.0005478465463966131"}] url:https://60000002.h5app.alipay.com/app/src/home.html?userId=2088322012980000]

我们执行 看看日志打印 有日志输出 看recv这些参数 和刚刚是有点差别 但是大致一样(这个能量只能收一次)来看bubbleId 这个猜一下是能量的ID

来找怎么获取的能量ID 我们打开一个有能量的好友,看日志  有获取的调用没

由于日志比较多 我们就是着重找有返回bubbleId和friedID 的列表,找到之后往上找调用着参数

[m -[ transformResponseData:{

bizNo = "092c5f8c-ee77-49ad-a3a2-dd3c059ee579-1510798661871";

bubbles =     (

{

business =             {

bigIconDisplayName = "\U884c\U8d70";

bizType = xingzou;

dayIconUrl = "https://zos.alipayobjects.com/rmsportal/xxx.png";

id = 9;

nightIconUrl = "https://zos.alipayobjects.com/rmsportal/xxx.png";

smallIconDisplayName = "\U884c\U8d70";

};

collectStatus = AVAILABLE;

fullEnergy = 92;

id = 26343893;

produceTime = 1510788093000;

remainEnergy = 72;

userId = 208890214255xxxx;

}

);

needGuide = 0;

结果有了 找调用

_doFlushMessageQueue:[{"handlerName":"remoteLog","data":{"seedId":"ANTFOREST-PAGE-READY-home","param1":"shareBiz=none^type=behavior^currentTimestamp=1510798661779","param2":"monitor_type=openPage^remoteType=info","bizType":"antForest"},"callbackId":"remoteLog_15107986617880.34833956067450345"},{"handlerName":"getSystemInfo","data":{},"callbackId":"getSystemInfo_15107986617920.08668778464198112"},{"handlerName":"hideOptionMenu","data":{},"callbackId":"hideOptionMenu_15107986617920.562577509554103"},{"handlerName":"setToolbarMenu","data":{"menus":[],"override":true},"callbackId":"setToolbarMenu_15107986617920.03417412145063281"},{"handlerName":"setGestureBack","data":{"val":true},"callbackId":"setGestureBack_15107986617920.6238974309526384"},{"handlerName":"remoteLog","data":{"seedId":"ANTFOREST-H5_PAGE_SET_PAGE_NAME","param1":"shareBiz=none^type=behavior^currentTimestamp=1510798661796","param2":"monitor_type=clicked^remoteType=info^pageName=home.html","bizType":"antForest"},"callbackId":"remoteLog_15107986617960.3546153837814927"},{"handlerName":"addNotifyListener","data":{"name":"NEBULANOTIFY_AFRefresh"},"callbackId":"addNotifyListener_15107986617960.04098325059749186"},{"handlerName":"rpc","data":{"operationType":"alipay.antmember.forest.h5.queryNextAction","requestData":[{"userId":"208890214255xxxx","av":"5","ct":"ios"}],"disableLimitView":true},"callbackId":"rpc_15107986617970.8864813686814159"}] url:https://60000002.h5app.alipay.com/app/src/home.html?userId=208890214255xxxx]

用cycript 测试这个方法 。结果如我们所愿 日志返回了我们需要的能量ID和好友ID 可以构造第一个找到那个方法 实现收一个好友的能量

由于这个方法需要好友ID的参数 我们需要拿到全部好友的ID 这样才能实现我们的一键全部收取

这里我偷个懒 不去往下折腾 点击页面在PSDJsBridge transformResponseData

取top 10的好友ID(打开页面他本身执行了 friendRanking系列方法 )

编写Tweak

整理下流程,进页面 他自身调用Top10的好友列表 我们拿到这10个用户的UID

拿到UID之后执行上面分析的第二个方法 拿到指定用户可以收的能量 collectStatus=AVAILABLE 返回参数中有 我们看字段就能猜到

拿到UID和能量ID 我们就可以执行收能量的功能了

具体的代码不一一分析 下面会提供代码下载地址

看成功图8

总结

UIWebView的应用不同于原生的应用 有正向开发经验能通过UI层能轻易找到触发事件

其实很多时候都在试错和猜想 ,逐步的去验证自己的猜想 直到找到答案

这个Tweak只作技术分析,并没有完善 Top10用户收取还不够用 大家可以试着动手 获取下一页好友 和全部好友 看日志找到字段是可以轻易实现的 还有其他功能比如 每天定时启动收取啥的

iphone快捷指令蚂蚁森林能量_iOS逆向-手把手教你写支付宝蚂蚁森林收集能量助手...相关推荐

  1. iOS逆向-手把手教你写支付宝蚂蚁森林收集能量助手

    iOS逆向-手把手教你写支付宝蚂蚁森林收集能量助手 前言 发现iOS支付宝逆向的分析并不多,蚂蚁森林基于H5应用 套着UIWebView 基本也没这类JS和原生交互分析的帖子,就拿此练手吧 作技术分享 ...

  2. 运行快捷指令无法连接服务器失败,快捷指令打不开怎么回事?iPhone快捷指令无法载入的解决办法...

    经常会有果粉朋友反馈,自己的 iPhone 快捷指令打不开.具体表现是,在 Safari 浏览器中,打开快捷指令下载安装页面,点击"获取捷径"后,一直卡在快捷指令中心正在载入页面, ...

  3. iPhone 快捷指令 查看图像信息

    获取捷径:点击此处 扫码获取: 使用方法: 在相册中选择图片,点击分享,列表下方选择"查看图像信息" 示例 代码: 附: iPhone 快捷指令 拼接长图 iPhone 快捷指令  ...

  4. iphone快捷指令怎么用?这几个快捷指令的小技巧你一定要知道,能帮你提升工作、生活效率。

    快捷指令(又叫捷径),是苹果公司开发的一款 App,我们可以用它创捷包含多个步骤的操作,帮我们快速完成任务. 熟练使用这个功能的小伙伴,可以让平时的生活工作效率大大提升,将一系列复杂的流程变得简单化: ...

  5. iphone 快捷指令 python_苹果iPhone快捷指令怎么用?IOS13快捷指令使用技巧图文介绍...

    苹果手机上有一个名为"快捷指令"的应用,可能很多人都看到过,也听说过,但就是没有认真用过一会.确实,这个应用很强大,无论是复杂功能,还是简单的功能,基本上都可以实现.小编今天就给大 ...

  6. iphone快捷指令蚂蚁森林能量_如何快速偷取蚂蚁森林能量?这有一个捷径!-芒果TV专栏...

    蚂蚁森林应该不用世超介绍了吧. 在这款产品中,咱们可以通过收取自己的能量以及薅朋友的能量,养一颗虚拟的树,等树长大支付宝就会以你的名义在荒漠种下一颗真树. 就是这么一个简单的产品,让世超跟朋友们欲罢不 ...

  7. iphone快捷指令蚂蚁森林能量_如何快速偷取蚂蚁森林能量?这有一个捷径……

    原标题:如何快速偷取蚂蚁森林能量?这有一个捷径-- 蚂蚁森林应该不用世超介绍了吧. 在这款产品中,咱们可以通过收取自己的能量以及薅朋友的能量,养一颗虚拟的树,等树长大支付宝就会以你的名义在荒漠种下一颗 ...

  8. iphone 快捷指令打开 行程码

    每次打开微信,打开小程序,找行程码是不是很烦. 可以用快捷指令 iphone手机背面轻轻点两下 或 三下打开行程码. 首先现在打开行程码最多,最方便的是 微信小程序.然而现在无法用快捷指令打开小程序. ...

  9. iPhone快捷指令导出文件.shortcut格式后缀文件解密

    在使用iPhone过程中,发现编写好的快捷指令,除了可以通过iCloud的链接分享之外,还可以将快捷指令文件导出,导出的文件格式后缀为:.shortcut 经搜索引擎找了好久好久好久好久,一直没有找到 ...

最新文章

  1. MikuMikuDance 6 菜单汉化补丁
  2. R语言ggplot2可视化使用vjust和hjust参数对齐图像中的文本注释信息(左对齐、右对齐、居中)实战
  3. MyISAM与InnoDB区别
  4. iOS 可能用到的三方框架
  5. 大量视频教程下载,全部是微软最新技术
  6. WinForm窗体拖动代码
  7. repeated_Ruby中带有示例的Array.repeated_combination()方法
  8. 新rust怎么拆除围墙_“问题围挡”拆除 街道变漂亮了
  9. java-mail.jar_mail.jar-Mail.jar下载 --pc6下载站
  10. Android游戏编程之从零开始pdf
  11. 高通SDX12:sar sensor AW9610x驱动移植
  12. flash cs4 和 flex builder 联合开发
  13. Android之应用市场排行榜、上架、首发(非原创)
  14. RHEL7挂载本地yum源
  15. 【题解】HNOI-2015落忆枫音
  16. 基于深度相机的下肢外骨骼的自适应梯级步态生成方法
  17. 微信小程序图片裁剪image-cropper插件使用
  18. 问题:我的xmindpro从桌面打开就弹窗发生错误
  19. trove mitaka集成
  20. Android实现搜索手机内的PDF文件

热门文章

  1. APE与FLAC格式对比
  2. 互联网企业进军券商业
  3. 完美者新春大礼包DVD共五篇
  4. 震惊!微信PC端也能多开!
  5. 苹果内存不够怎么办_OPPO手机内存不够怎么办?设置这4个功能,轻松省下10G
  6. 让输入法默认显示英文
  7. Navicat提示Access violation at address in module ‘navicate.exe‘. Read of address 0000000000000000
  8. 十一、轻松搭建网站管理后台
  9. 深圳市中电照明股份有限公司牵手泛微
  10. 论文精读:R-CNN:Rich feature hierarchies for accurate object detection and semantic segmentation...