iOS安全:iOS APP注入动态库重打包(非越狱)

 原创    2019-04-21

从AppStore直接获取的ipa重打包即使成功安装也是无法运行的,砸壳后的ipa如何注入动态库后在非越狱手机上运行?

参考:https://github.com/TKkk-iOSer/TKTweakDemo

在进行iOS APP重打包之前,请确保已经获取了砸壳后的ipa,砸壳工具请参考:

注意:从AppStore直接获取的ipa重打包即使成功安装也是无法运行的。

我们的目的是在一款APP中注入动态库后重新打包在非越狱手机上运行。

theos制作注入动态库

使用theos新建tweak工程,tweak.xm编写针对指定APP的hook代码后,比如

%hook AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    BOOL ret = %orig;

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documents = [paths objectAtIndex:0];

    UIAlertView *view = [[UIAlertView alloc] initWithTitle:nil message:documents delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil];
    [view show];

    return ret;
}

%end

Makefile文件示例:

THEOS_DEVICE_IP=192.168.0.103//越狱手机IP
ARCHS=armv7 arm64
TARGET=iphone:latest:8.0

include /opt/theos/makefiles/common.mk

TWEAK_NAME = onenew
onenew_FILES = Tweak.xm

include /opt/theos/makefiles/tweak.mk

当然,具体的hook代码还需要根据目标APP的实际情况分析后编写,这里只是演示。make后会生成dylib的动态库,假设名称为onenew.dylib。

由于tweak.dylib需要依赖CydiaSubstrate,且在非越狱手机上不存在CydiaSubstrate,需要将onenew.dylib和CydiaSubstrate都放置在APP二进制目录。修改onenew.dylib中LC_LOAD_DYLIB引入CydiaSubstrate的路径,如下

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

成功后onenew.dylib引入CydiaSubstrate的路径由/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate变为@loader_path/libsubstrate.dylib。

查看依赖库:

otool -L onenew.dylib

使用insert_dylib

在mac开发机上打开 insert_dylib 项目,生成insert_dylib可执行文件。

先将目标ipa文件解压,在/Payload/XXX.app目录,将我们编写的onenew.dylib与libsubstrate.dylib(可以从越狱机器上拷贝并重命名也可以直接从原文地址提供的链接下载)拷贝进去,

./insert_dylib @executable_path/onenew.dylib Payload/XXX.app/XXX(二进制文件)

注入成功后将app目录中的XXX二进制删除,将 XXX_patched 改为XXX。

注意:@executable_path/onenew.dylib这里是固定写法,insert_dylib会原样写入到XXX二进制的依赖中。

重打包

使用 ios-app-signer,需要开发者帐号。测试发现,源ipa中即使存在扩展,用这种方式依然可以重打包运行。

相关文章:

iOS 64/32位系统在处理BOOL值时的区别
iOS Appium 自动化测试框架原理简析
由 xpc_connection_send_message_with_reply_sync 超时引发的崩溃
Swift并发编程 - 理解 async 和 await
iOS Sign With Apple 开发实践

发表留言

您的电子邮箱地址不会被公开,必填项已用*标注。发布的留言可能不会立即公开展示,请耐心等待审核通过。