
现象: 很多人在用微信2, 微信3的话,会造成多个多开APP使用了同一个APP的数据也就是你微信正版软件登陆的是123账号,那么你分身的微信2、微信3…打开后都是123的账号直接登录了,注销登录其中一个,其他多开程序全部也是注销登录状态。很多人尝试改过info,但是还是不行,部分APP还是出现了多开后数据相同

数据共通原因: 得知需要签名不同才能设置不同,但是多开和主体的缓存是独立的
解决方法
不要使用CrackerXI+(砸壳工具)进行砸壳的ipa进行多开电脑使用frida一键砸壳生成的ipa (frida-ios-dump)
安装
iOS端配置:
打开cydia添加源:https://build.frida.re
打开刚刚添加的源,安装frida
安装完成!检查是否工作可以在手机终端运行frida-ps -U查看
mac端配置:
安装Homebrew
安装python:brew install python
安装wget:brew install wget
安装pip:
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
安装usbmuxd:brew install usbmuxd
清理残留:rm ~/get-pip.py
注意:使用brew install xxx如果一直卡在Updating Homebrew…可以control + z结束当前进程,再新开一个终端安装,此时可以跳过更新。
安装frida for mac:
终端执行:
sudo pip install frida
假如报一下错误:
Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
使用以下命令安装:
sudo pip install frida –upgrade –ignore-installed six
配置frida-ios-dump环境
从Github下载工程:
sudo mkdir /opt/dump && cd /opt/dump && sudo git clone https://github.com/AloneMonkey/frida-ios-dump
安装依赖:
sudo pip install -r /opt/dump/frida-ios-dump/requirements.txt --upgrade
修改dump.py参数
vim /opt/dump/frida-ios-dump/dump.py
找到如下几行
User = 'root'
Password = 'alpine'
Host = 'localhost'
Port = 2222
按需修改 如把`Password` 改成自己的
ps:如果不习惯vim 用访达打开/opt/dump/frida-ios-dump/dump.py手动编辑。
设置别名,方便调用
`vim ~/.bash_profile`
在末尾新增下面一段:
`alias dump.py="/opt/dump/frida-ios-dump/dump.py"`
使别名生效:
`source ~/.bash_profile`
砸壳ipa使用
打开终端,设置端口转发
`iproxy 2222 22`
command + n新建一个终端,在新的终端cd到你要存放砸壳后ipa的文件夹中,然后一键砸壳,直接dump.py 应用名称。如下
`dump.py QQ`
执行完毕后你就会发现,在文件夹中多了一个.ipa文件,即为砸壳后得到的ipa的文件。
理论这个套路任何APP都可以多开估计肯定有人问,抖音可不可以啊,SOUL可不可以啊之类的问题还得多问我一句封不封号之类的我估计
解答
1、可以,无视规则(除了联网验证应用权限的这种不敢保证)2、大概率被封号(被封禁至少7天以上,保守估计概率7成以上)3、永封概率1~2成那么怎么办呢?被封号了怎么办呢?可以使用+内核禁用+不安装使用包管理工具(Cydia/Sileo)+命令行dpkg安装deb+多开微信防封插件,反编译一些屏蔽越狱检测的App后发现一些原理如下
抖音系列检测很严格 包括ker fish 等类型的hook 还有签名, 非法模块, 以及非官方dylib检测都有做,想要过汇编语言学一点了……
1、iOS App运行的步骤为:
用户点击App启动
load(各种framework和dylib, 包含MobileLoader加载dylib)main()UIApplicationMainAppDelegateUIWindowViewControllersView...
2、占得先机hook检测函数
对于App厂商而言,App越狱检测可能出现在main或以后的任何环节,
为了掌控一切,占得先机很有必要。
经过实测,发现+[NSObject load]中进行hook居然比dylib的入口函数还快!
static __attribute__((constructor)) void _logosLocalInit() {// TODO:printf("DYLIB START RUNNING.");}
那么,猜想+[NSObject load] hook 可以占得先机。
3、测试
部分代码如下:
+ (void)load{staticdispatch_once_t once;dispatch_once(&once, ^{rebind_symbols((structrebinding[9]){{"fork", replaced_fork, (void*)&original_fork},{"stat", replaced_stat, (void*)&original_stat},{"access", replaced_access, (void*)&original_access},{"fopen", replaced_fopen, (void*)&original_fopen},{"dlopen", replaced_dlopen, (void*)&original_dlopen},{"dladdr", replaced_dladdr, (void*)&original_dladdr},{"dlsym", replaced_dlsym, (void*)&original_dlsym},{"dlopen_preflight", replaced_dlopen_preflight, (void*)&original_dlopen_preflight},{"dyld_get_image_name", replaced_dyld_get_image_name, (void*)&original_dyld_get_image_name}},9);printf("NSObject load RUNNING.");});}
判断手机越狱的几种方式:
-
-
通过手机越狱后增加的越狱文件判断
-
// 通过越狱后增加的越狱文件判断class func isContainJailBreakFiles() -> Bool {let files = ["/Applications/Cydia.app","/Applications/limera1n.app","/Applications/greenpois0n.app","/Applications/blackra1n.app","/Applications/blacksn0w.app","/Applications/redsn0w.app","/Applications/Absinthe.app","/Library/MobileSubstrate/MobileSubstrate.dylib","/bin/bash","/usr/sbin/sshd","/etc/apt","/private/var/lib/apt/"]for file in files {if FileManager.default.fileExists(atPath: file) {return true}}return false
-
-
根据是否能打开cydia判断
-
class func canOpenCydia() -> Bool {if let url = URL(string: "cydia://") {return UIApplication.shared.canOpenURL(url)} else {return false}}
3.根据是否能获取所有应用的名称判断,没有越狱的设备是没有读取所有应用名称的权限的
/// 读取应用列表
class func canGetApplicationList() -> Bool {guard FileManager.default.fileExists(atPath: "/User/Applications/") else {return false}do {let appList = try FileManager.default.contentsOfDirectory(atPath: "/User/Applications/")return !appList.isEmpty} catch {print("get app list error (error)")return false}}
4.根据使用stat方法来判断cydia是否存在来判断
攻击者可能会 hook NSFileManager 的方法,那么,你可以回避 NSFileManager,使用 stat 系列函数检测 Cydia 等工具.
bool checkCydia() {struct stat stat_info;return 0 == stat("/Applications/Cydia.app", &stat_info);}
攻击者可能会利用 Fishhook 原理 hook 了 stat。
那么,你可以看看 stat 是不是出自系统库,有没有被攻击者换掉
bool checkInject() {int ret ;Dl_info dylib_info;char *dylib_name = "/usr/lib/system/libsystem_kernel.dylib";int (*func_stat)(const char *, struct stat *) = stat;if ((ret = dladdr(func_stat, &dylib_info))) {printf("lib :%s", dylib_info.dli_fname);return strcmp(dylib_info.dli_fname, dylib_name) != 0;}return false;}
-
-
检索一下应用程序是否被链接了异常动态库
通常情况下,会包含越狱机的输出结果会包含字符串:
-
Library/MobileSubstrate/MobileSubstrate.dylib
bool checkDylibs() {uint32_t count = _dyld_image_count();for (uint32_t i = 0 ; i < count; ++i) {if (strcmp(_dyld_get_image_name(i), "Library/MobileSubstrate/MobileSubstrate.dylib") == 0) {return true;}}return false;}
-
通过检测当前程序运行的环境变量
攻击者可能会给 MobileSubstrate 改名,但是原理都是通过 DYLD_INSERT_LIBRARIES注入动态库。
bool checkEnv() {char *env = getenv("DYLD_INSERT_LIBRARIES");return env != nil;}

