iOS 手机客户端防依附与破解

于春友

在逆向和保护的较量过程中,总会涉及到破解和防护的问题,这就繁衍出了很多破解和防护的方法,这是很无(you)奈(qu)的~

防护实例
  1. 某团 iOS客户端

准备环境:

  1. 已经配置好开发环境的iPhone6 越狱手机
  2. 装有可使用的Tweak环境的MacBook Pro

从某助手下载越狱版的某团App,打开终端并链接手机,顺利拿到了App的目录路径和进程名

$ ssh root@192.168.xxx.yyy
$ ps -e

1xxxx0 ??         xxxxx /var/mobile/Containers/Bundle/Application/xxx/xyz.app/xyz  

下面正常的流程是使用Cycript注入dylib,分析App的布局,查找View对应的ViewController

$ cycript -p xyz.app

然而注入dylib时,挂了...... 好在知道iOS逆向论坛,秉着“小白的问题就不是个问题”的态度,一脸懵逼的逛论坛。虽然不知道能不能解决,但有想法总是好的!顺手点击搜索按钮输入“某团”,然后

防止tweak依附,App有高招;破解App保护,tweak留一手

^_^ 这真的不是个问题!!

破解 RESTRICT/restrict

这篇帖子中介绍:

在iOS系统中三种情况下DYLD_环境变量会被dyld无视,分别是:

  1. 可执行文件被setuidsetgid了;
  2. 可执行文件含有__RESTRICT/__restrict这个section
  3. 可执行文件被签了某个entitlements

那么简单,从已获得路径下使用iFunBox将App的二进制文件移动到桌面,然后拖入 MachOView中,顺着帖子的步骤成功发现Section(__RESTRICT/__restrict)!

先解决问题,再查看原理~

把imeituan这个可执行文件用macvim等二进制编辑器打开,把所有的RESTRICT/restrict字符串给重命名一下

获取macvim:

点击链接下载macvim,打开终端执行cd ~/macvim命令,再执行命令make,最后根据终端中显示的路径在文件夹中找到MacVim.app

帖子中描述替换操作的实际步骤:

  1. 打开 macvim
  2. 将App的二进制文件放入
  3. 使用快捷键cmd + f查找并替换__RESTRICT/__restrict__RRSTRICT/__restrict

因为我们对App的可执行文件进行了静态patch,其md5值已经改变,所以Apple签名失效,正常情况下美团App无法启动。要解决这个问题,很方便,也很惭愧,因为要用到盗版App的利器——AppSync……

Cydia中搜索,你会发现AppSync已经不能用了!

下面是使用谷歌搜索到网友解决不同问题的方法,很杂乱就不放链接了,再次使用利器iFunBox将App的.ipa文件拷贝到桌面,在终端中依次执行如下命令(注意姿势不对.ipa包是无法正常安装的):

// 先解压 .ipa 文件

$ unzip /path/xyz.ipa

// 删除 .app 原有签名

$ rm -rf Payload/xxx.app/_CodeSignature/

// 获取企业证书的描述文件替换到目标 .app

$ cp ~/xxxxx.mobileprovision Payload/xxx.app/embedded.mobileprovision

//获取电脑安装的所有证书

$ security find-identity -v -p codesigning

// 使用企业证书重签名

$ codesign -f -s “iPhone Developer: xxxxxxxxxxx” Payload/xxx.app

// 重新打包

$ zip -r xxx.ipa Payload/

使用Impactor.ipa安装到手机:

  1. 证书和描述文件必须一致
  2. 使用企业账号

终于可以cycript -p xyz命令了!!

关于如何使用__RESTRICT/__restrict参考链接:

https://pewpewthespells.com/blog/blockingcodeinjectiononiosandos_x.html

使用和破解ptrace

使用cycript做静态分析,使用lldb+debugserver做动态分析,使用debugserver命令附加到进程

debugser *:1234 -a "xyz"

又挂了...依旧逛论坛吧......

实战:干掉高德地图7.2.0版iOS客户端的反动态调试保护

发现另一篇帖子,虽然不知能否解决问题,但是多看点也是有好处的...

LLDB附加失败

在ptrace上下断点,找到调用ptrace的地方

运气真的很不错...

将“某团”App拖入hopper中,发现main函数多了sub_100018784()

main:

int EntryPoint(int arg0, int arg1)  
{
    ...
    ...
    sub_100018784();                         // 方法调用 
    r21 = objc_autoreleasePoolPush();
    r22 = [NSStringFromClass([WMBAppDelegate class]) retain];
    UIApplicationMain();
    [r22 release];
    objc_autoreleasePoolPop(r21);
    r0 = r19;
    return r0;
}

sub_100018784():

function sub_100018784  
{
    ...
    ...
    r0 = dlopen(zero_extend_64(0x0), zero_extend_64(0xa));
    (dlsym(r0, "ptrace"))(r31 + 0xffffffffffffffe0 | 0x1f, zero_extend_64(0x0), zero_extend_64(0x0), zero_extend_64(0x0));
    r0 = dlclose(r19);
    return r0;
}

(dlsym(r0, "ptrace")),发现目标,顺着帖子往下做,破解ptrace编写Tweak

#import <substrate.h>
#import <mach-o/dyld.h>
#import <dlfcn.h>
int fake_ptrace(int request, pid_t pid, caddr_t addr, int data)  
{
    return 0;
}
void *(*old_dlsym)(void *handle, const char *symbol);  
void *my_dlsym(void *handle, const char *symbol)  
{
    if(strcmp(symbol,"ptrace") == 0)
    {
        return (void*)fake_ptrace;
    }
    return old_dlsym(handle,symbol);
}
%ctor
{
    MSHookFunction((void*)dlsym,(void*)my_dlsym,(void**)&old_dlsym);
}

将Tweak安装到手机,重新附加进程,顺利进入App内部,就这样绕过了ptrace......

大功告成,现在学习怎么使用ptrace,在应用的main.m文件中粘贴如下代码

ptrace(PT_DENY_ATTACH, 0, 0, 0);

PT_DENY_ATTACH是一个苹果专门声明的常量,在内核级别去阻止调试器

#import <dlfcn.h>
#import <sys/types.h>
typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);  
#if !defined(PT_DENY_ATTACH)  
#define PT_DENY_ATTACH 31  
#endif  // !defined(PT_DENY_ATTACH) 
void disable_gdb()  
{  
    void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);  
    ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");  
    ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);  
    dlclose(handle);  
}  

int main(int argc, charchar *argv[])  
{  
#ifndef DEBUG  
    disable_gdb();  
#endif  
    @autoreleasepool 
    {  
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([WQMainPageAppDelegate class]));  
    }  
}

更加详细的内容参考链接: http://luoxianming.cn/2016/11/15/yueyutools3prevention/

这些措施,也只是延缓了破解时间而已,iPhone就是那么任性,自用就不要越狱了~(^_^)~