一个用Theos编译dylib非越狱注入的暗坑

正好看到有同学提问

一来呢
使用theos编译出的dylib,一来默认的是老的对齐iOS9 AArch64会挂,新版theos没试,也许新的模版解决了??

然后
theos编译会插入一个LC_LOAD_DYLIB用于确保dyld动态加载了libsubstrate

例如

越狱情况下并没有什么问题,非越狱下很显然没有这个文件,导致dyld抛出异常,crash app

解决方案也很简单,将这个LC的类型从LC_LOAD_DYLIB修改成LC_LOAD_WEAK_DYLIB
(弱加载,dyld不会因为弱加载的库不存在终止加载过程)

然后手动注入一个新的LC_LOAD_DYLIB,指向proper signed libSubstrate

很遗憾,就做了些微小的工作,谢谢大家

EDIT:

Theos现在提供了更简单的方案,参见http://bbs.iosre.com/t/theos-dylib/4327/3

1 个赞

此处应有dyld源码相关部分解析,theos的patch

但我懒得写: )

Theos编译的dylib不是依赖substrate的么?在非越狱机上也可以用吗?

我只是举个例子:) 重点在改原来的LC那里。

很遗憾,就做了一些微小的工作

我现在的做法是用Theos当编译环境,手动打Patch脚本重签名。上次他们看到利用mach里的某个嘘~~~API在const里设置TEXT到RW,调用MS后写回,他们说不越狱成功了,我没试验。

I don’t even

these编译的dylib依赖了 libsubstrate,所以 需要lib substrate拷贝一份 重签 当然 dylib引用lib substrate的路径也需要改

可用,亲测

不行,确实是依赖substrate的框架

想问问大神,如何将LC_LOAD_DYLIB改成LC_LOAD_WEAK_DYLIB?用二进制改吗?LC_LOAD_WEAK_DYLIB的编码是多少。。。

MachOView或者自己写Parser。值翻头文件。这个问题目前有更简单的解决方案了

通过头文件找到了,谢谢!

install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/libsubstrate.dylib tweak.dylib

1 个赞

dylib内调用的其它资源文件路径怎么修改,\Library\PreferenceLoader\Preferences。求教,非常感谢

写在app本身的沙盒里啊。或者动态释放