iOS逆向 - 微信的越狱检测分析

作者: ck2016 | 来源:发表于2017-04-08 14:40 被阅读2299次

嘿嘿,不要搞坏事

微信一启动会对当前的设备做N多的检测。比如
检测 bundleID,发现不是 "com.tencent.xin" 有可能报非法客户端。
检测 uuid,多个客户端有相同的 uuid,可能报非法多开。
检测 jailbroken,越狱机上有些功能不开放的。
还有下面这段信息会上传到后台。

+ (id) [KSSystemInfo systemInfo]  方法的返回值
{
    CFBundleExecutable = WeChat;
    CFBundleExecutablePath = "/var/mobile/Containers/Bundle/Application/DE497A13-E76F-42B8-B476-A9934B486EF4/WeChat.app/WeChat";
    CFBundleIdentifier = "com.tencent.xin";
    CFBundleName = WeChat;
    "app_uuid" = "AAAAA633-1E42-32DE-B943-2C16A47C7A3E";
    "cpu_arch" = arm64;
    "device_app_hash" = 9eb422144a96af8f91XXXXxxxxxdaf0d4742321b;
    jailbroken = 0;
    machine = "iPhone6,2";
    memory = { size = 1048576000; };
    "system_name" = "iPhone OS";
    "system_version" = "9.2.1";
    ... 
    后面省略一千个字段
    ...
}

一启动微信会上传一堆当前运行环境的信息上去,判断你是不是多开了,非法了,越狱了等等。

微信怎么检测是否越狱

打开 hopper,全局搜 jail(越狱的单词前半段),找到这段代码

adrp 取了虚拟内存地址 #0x102da2000 的绝对地址,又加上了 #0xd61,hopper 告诉我们这个地址里面放了 "MobileSubstrate" 字符串常量。
"MobileSubstrate" 一看就是越狱后用来注入代码的一个库。

把字符串地址放到 x0 寄存器中,调用了 sub_100436a20。

sub_ 开头的一看就是 c 语言的函数。进去里面看看

这段代码大概就是一启动的时候,调用 _dyld_image_count() 获得加载的动态库的数量,_dyld_get_image_name() 获得名字,然后遍历他们的名字,看看有没有 “MobileSubstrate” 关键字,有的话就是越狱的了,像这样。

#import <mach-o/dyld.h>  

int count = _dyld_image_count();
for (int i=0; i<count; i++) {
    printf("%s", _dyld_get_image_name(i));
    // 如果 _dyld_get_image_name() 里面包含 MobileSubstrate 就是越狱了
}

微信是调用 + [KSSystemInfo isJailbroken] 来判断是否越狱的,那怎么绕过越狱检测就很简单了。

然而!

我发现微信里面还有一个 JailBreakHelper 类,看名字就是越狱检测助手,难道微信有2套检测机制?

继续往下看 - [JailBreakHelper IsJailBreak] 方法的代码,还原里面一个数组的代码大概是

NSArray *paths = @[
    @"/etc/ssh/sshd_config",
    @"/usr/libexec/ssh-keysign",
    @"/usr/sbin/sshd",
    @"/bin/sh",
    @"/bin/bash",
    @"/etc/apt",
    @"/Applications/Cydia.app/",
    @"/Library/MobileSubstrate/MobileSubstrate.dylib"];

然后检测手机里是否有 paths 里面的路径,有的话就是越狱了。
怎么绕过的话,你懂的,嘿嘿。

参考文献:支付宝大神的 iOS安全攻防(二十):越狱检测的攻与防

相关文章

网友评论

  • 呆呆滴木木菇凉:不止这两处
    sailorly:除了这两处,还有哪些地方呀
  • 1e8e1c7c4281:怎样让微信不检测越狱,我现在用不了指纹很苦恼
    1e8e1c7c4281:@ck2016 要是有详细教程就好了
    ck2016:@浅笑lang 好久没弄了
  • Tatinic:谢谢分享,我还屁颠屁颠的改微信运动步数呢……
    ck2016:@Tatinic 我被封了3,4个号
    Tatinic:@ck2016 我知道呀,只是不知道微信会封号:stuck_out_tongue_winking_eye:
    ck2016:@Tatinic 网上有方法啊,就改一个方法返回你的步数就行
  • 7bbb72f26a5c:KSSystemInfo应该是闪退的时候上传的,有个类叫KSCrash
    7bbb72f26a5c:@ck2016 试试 KSCrash +(id)sharedInstance { return nil; }
    ck2016:@陈煜钏 一启动也会上传的,你打log看看
  • 0d2758e4122b:为什么需要看看里面的数组数据,直接%hook - (_Bool)IsJailBreak {
    return NO}应该就直接可以了吧
    ck2016:@W4 对,就想看看微信是怎么判断越狱的

本文标题:iOS逆向 - 微信的越狱检测分析

本文链接:https://www.haomeiwen.com/subject/cvzcattx.html