在辞职的ipa中注入ObjectiveC-Swift钩子,主要用于在Swift中而不是在Objective C中编写钩子

红心

我试图在非越狱设备上挂钩目标二进制文件的功能。

它实际上可以在Objective C中使用。我只需像往常一样(insert_dylib)将自己的dylib添加到ipa的二进制文件中,然后进行处理即可。

现在,当我钩住函数时,我想将数据传递给Swift并使用Swift处理数据。

我使用标准教程将Swift导入到ObjC中,这没有任何问题。

如果我将库注入到ipa中,则只要不调用我的Swift函数,ipa就可以正常工作。调用时,该应用程序冻结。(它不打印该功能启动后将立即打印的日志)。

我的感觉是该库没有“连接到swift运行时”,也许应该调用一些swift初始化?

请注意,该钩子应用程序已经使用了swift。实际上,otool -L显示:

@rpath/libswiftCore.dylib (compatibility version 1.0.0, current version 1200.2.40)
@rpath/libswiftAVFoundation.dylib (compatibility version 1.0.0, current version 1995.38.2, weak)
@rpath/libswiftAccelerate.dylib (compatibility version 1.0.0, current version 10.40.1, weak)
@rpath/libswiftAssetsLibrary.dylib (compatibility version 1.0.0, current version 310.2.210, weak)
@rpath/libswiftCloudKit.dylib (compatibility version 1.0.0, current version 962.0.0)

(和其他libswift *)

相比之下,我的库现在在swift代码中只有一个普通的@objc公共静态类和@objc公共静态函数(它不使用花哨的库,它是一个空函数)。

因此,我尝试了各种方法:

  1. 使用optool卸载-p ... -t ...(https://github.com/alexzielenski/optool从mylib.dylib中删除对libswift * .dylib的引用,希望mylib.dylib使用已加载的通过应用程序

  2. 将Xcode.app/..../iphoneos/swift-5.0/libswift*.dylib中的libswift * .dylib库复制到myapp.app/Frameworks/文件夹中,然后

  3. 使用install_name_tool -change将mylib.dylib的/usr/lib/libswift*..dylib路径(由otool -L显示)更改为@ rpath / Framerworks / libswift ... dylib

但没有任何效果。实际上,2.和3似乎可以工作,但是会崩溃:

Thread 0 Crashed:
0 libsystem_kernel.dylib 0x00000001a81c1ec4 __pthread_kill + 8
1 libsystem_c.dylib 0x00000001a8031844 abort + 100
2 libswiftCore.dylib 0x0000000104df0028 swift_vasprintf(char**, char const*, char*) + 0
3 libswiftCore.dylib 0x0000000104de81c8 swift::nameForMetadata(swift::TargetMetadata<swift::InProcess> const*, bool) + 0
4 cy-bVKQhY.dylib 0x0000000104aa61b8 ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 428
5 cy-bVKQhY.dylib 0x0000000104aa658c ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) + 52

任何提示,链接?非常感谢你。

最后的注意事项:当我构建一个独立的测试应用程序并通过一个模拟类使用我的库时,一切正常。因此,可以从ObjC导入和使用Swift代码。当注入第三方ipa时,它不起作用。

红心

我找到了一个解决方案:我的库是作为另一个项目的子目标构建的。这样生成的.dylib并不真正适合其他二进制文件。因此,我为此库创建了另一个框架项目,注入了库,并且无需其他步骤即可工作(例如,optool,install_name_tool等)。

导致我采取正确方法的提示是这次崩溃:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x00000d5000006840
VM Region Info: 0xd5000006840 is not in any region.  Bytes after previous region: 14625974282305  

并使用lldb进行一些调试。一切正常,但是当执行objc_msgSend时,它以这种方式崩溃(在子帧中)。奇怪的是,它试图访问二进制存储区域之外的地址。所以我认为图书馆的建设过程有些奇怪。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章