coc插件

COC插件 by cc

玩COC三个多月,发现每日搜鱼打鱼很是无聊,于是有了这一篇帖子。
先用clutch对app脱壳,用class-dump-z大致看了下头文件,主要有ADC、FB、MAT等广告、社交、支付平台的库,没发现什么特别的。用removePIE去掉app的ASLR,方便之后调试时地址的换算。

一、分析叉叉助手

叉叉助手提供了移动平台上多种游戏的辅助工具,旗下的COC插件实现了自动搜鱼、沙箱攻击、保持在线的功能,国内活跃玩家基本人人在用。毫无疑问,我们先拿它开刀学习下。该插件基于substrate框架,用class-dump-z查看下头文件,基本就是实现那几个功能的函数以及一个GUI。

  1. 找出注入位置

既然基于substrate框架,那么无非调用了substrate框架中几个库函数替换了部分原app函数的实现,我们可以注入进substrate的库函数找出所有注入点。

<blockquote>#include "substrate.h"

substrate是按字母顺序导入插件的,所以为了找出注入点,新插件的工程名需要在叉叉助手插件的工程名之前。

Sep 21 23:02:17 iPad Clash of Clans[1115]: MS:Notice: Loading: /Library/MobileSubstrate/DynamicLibraries/HookSubstrate.dylib
Sep 21 23:02:17 iPad Clash of Clans[1115]: MS:Notice: Loading: /Library/MobileSubstrate/DynamicLibraries/xxCOCPlugin.dylib
Sep 21 23:02:17 iPad Clash of Clans[1115]: <hooksubstrate> Hooked into MSHookFunction & MSHookMessageEx

一共注入了两处,第一处新函数名为func_hook_new_searchi,很显然实现了自动搜鱼功能。值得注意的是,第一个注入点并不代表任何符号。

  1. 通过Logify和在objc_msgSend下断点理解程序流程

Objective C基于消息机制,了解了各个消息传递的先后顺序也就大致了解了整个程序的流程。首先,使用Theos提供的Logify可以很方便的了解程序中不同类的交互方式。其次,对于某个特定的函数,可以在每个objc_msgSend处下断点了解该函数的大致流程。

在叉叉助手的设置框中,分别有三个按钮控制三大功能的开关。通过Logify不难发现,当按下其中任一按钮后,-[XXSettingViewController switchViewChangeValueAction:]会被触发。

Sep 22 00:07:07 iPad Clash of Clans[1115]: -<XXSettingViewController: 0x1a6374b0> switchViewChangeValueAction:<UISwitch: 0x1a696900; frame = (184 2; 51 31); tag = 33333; layer = <CALayer: 0x1a696990>>]

进一步分析-[XXSettingViewController switchViewChangeValueAction:],我们希望找出该函数本身每一次objc_msgSend调用的参数,但同时并不想输出内层的objc_msgSend调用。最开始,我试图注入objc_msgSend,然后在新的实现中使用[NSThread callStackSymbols]得到调用栈,当顶层的调用栈是我需要分析的函数时则输出该次objc_msgSend的调用。但是,我在注入objc_msgSend时遇到了些问题,最后转而使用其他途径。注入objc_msgSend与注入其他C函数不同的是objc_msgSend的参数数量是可变的,而且参数和返回值的类型都是在运行时才能决定的,这导致objc_msgSend必须由汇编实现。幸运的是,在进入objc_msgSend时,寄存器以及堆栈的值都已经设好了,我们只需直接传递下去就行,同时,我们可以使用一个自由寄存器lr,所以,实现本身并不存在技术上的障碍。(可以从http://opensource.apple.com/tarballs/objc4/下载到objc_msgSend的实现)我的问题是链接器不能正确输出内联汇编中符号的相对地址(http://stackoverflow.com/questio … ine-assembly-on-arm),如果你知道为什么会发生这样的问题或者/以及怎么解决,请告诉我

with open("func") as f:

第二部分使用Logify来理解程序流程,不如用LLDB。对于有一定防护意识的程序来说,很多重要的部分是会采用C/C++写的,用Logify很有可能出现遗漏

logify是用来最开始分析程序框架的,包括之后截取objc_msgSend。具体的功能实现确实得配合调试器分析汇编。

话说,我的代码显示总是有问题。用引用功能只显示第一行,用代码功能会加入无用的html标签。

你的代码是从别的网站上粘过来的吗?如果是的话,很可能粘过来时就已经带有格式了,估计是跟discuz冲突了

不是,我自己写的,换了不同的换行方式,使用代码格式排版会在每一行上加

支持大神,COC 我也喜爱