现象: 很多人在用微信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()
UIApplicationMain
AppDelegate
UIWindow
ViewControllers
View...
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;
}