这篇文章启发,想把前几天写的保存朋友圈视频的小玩意,通过JSPatch实现一遍
1.对微信自定义的WCActionSheet的初始化方法去hook,添加一项保存视频的功能
2.对WCActionSheet的代理方法进行hook,找到点击代理方法
至于怎么获取WCActionSheet里面有哪些方法,方法参数是什么。
如果你没有越狱的手机的话,也可以去PP助手上下一个越狱版的微信,然后用class-dump出头文件来看看
具体 *** 作可以去参考下面几篇文章
iOS冰与火之歌番外篇 - App Hook答疑以及iOS 9砸壳
iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook
一步一步实现iOS微信自动抢红包(非越狱)
在此特别感谢蒸米、east520 、dskcpp
开始吧!!!!!
通过iOSOpendev来创建一个Cocoa Touch Library项目
这个具体就可以参考上面那个抢红包的博客了
command+b 编译一下,可以在Product下面看到你编译成功的dylib了 copy出来
把PP助手上下的越狱版的微信解压后在Payload/WeChat.app/WeChat复制出来
通过yolo 把dylib注入到WeChat里面
然后把注入后的WeChat和xxx.dylib复制回Payload/WeChat.app/ 替换掉原来的WeChat
然后就是重新签名打包安装了,这块 *** 作参考刚上面说的几篇博客
不过这个插件还有点小问题
bug:
在重写WCActionSheet的
initWithTitle:delegate:cancelButtonTitle:destructiveButtonTitle:otherButtonTitles的时候
不知道为什么在arm64的情况下 点击朋友圈切换封面的时候会导致微信崩溃报错误
<Error>: unable to find offset 0x9b213a5c in shared cache for arch 'arm64'
IF判断全部注释,也一样会崩。这个问题我也不是很清楚,毕竟我也没有微信源码
下面这种情况也会崩
但是把后面的那句log去掉就不会崩
js文件的代码放在didFinishLaunchingWithOptions基础原理
能做到通过JS调用和改写OC方法最根本的原因是 Objective-C 是动态语言,OC上所有方法的调用/类的生成都通过 Objective-C Runtime 在运行时进行,我们可以通过类名/方法名反射得到相应的类和方法:
Class class = NSClassFromString("UIViewController")
id viewController = [[class alloc] init]
SEL selector = NSSelectorFromString("viewDidLoad")
[viewController performSelector:selector]
也可以替换某个类的方法为新的实现:
static void newViewDidLoad(id slf, SEL sel) {}
class_replaceMethod(class, selector, newViewDidLoad, @"")
还可以新注册一个类,为类添加方法:
Class cls = objc_allocateClassPair(superCls, "JPObject", 0)
objc_registerClassPair(cls)
class_addMethod(cls, selector, implement, typedesc)
对于 Objective-C 对象模型和动态消息发送的原理已有很多文章阐述得很详细,例如这篇,这里就不详细阐述了。理论上你可以在运行时通过类名/方法名调用到任何OC方法,替换任何类的实现以及新增任意类。所以 JSPatch 的原理就是:JS传递字符串给OC,OC通过 Runtime 接口调用和替换OC方法。这是最基础的原理,实际实现过程还有很多怪要打,接下来看看具体是怎样实现的。
方法调用
require('UIView')
var view = UIView.alloc().init()
view.setBackgroundColor(require('UIColor').grayColor())
view.setAlpha(0.5)
首先说一下JsPatch实现的内部原理:JsPatch能做到通过JS调用和改写OC方法最根本的原因是 Objective-C 是动态语言,OC上所有方法的调用/类的生成都通过 Objective-C Runtime 在运行时进行,我们可以通过类名和方法名反射得到相应的类和方法,也可以替换某个类的方法为新的实现,还可以新注册一个类,为类添加方法。这里就不详细介绍runtime了,相关的资料我会在后续的博客里介绍,大家再等等吧。所以 JSPatch 的原理就是:JS传递字符串给OC,OC通过 Runtime 接口调用和替换OC方法。这个很容易理解,JS的作用只是一个信使的作用,具体实现还是得靠我们OC,所以说OC还是世界上最美的语言,哈哈。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)