JSPatch给微信朋友圈加上视频保存功能

JSPatch给微信朋友圈加上视频保存功能,第1张

受 玩转 Hook 新思路:JSPatch

这篇文章启发,想把前几天写的保存朋友圈视频的小玩意,通过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还是世界上最美的语言,哈哈。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11608467.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存