绕过最新版本Reveal的激活检测


#1

首先,直接运行Reveal发现它弹出了这个弹框。

看到这个页面,这是一个app启动时的页面,一般是写到类下的applicationWillFinishLaunching方法里边。

我们打开Hopper Disassembler然后把Reveal拖入,等待它分析完后。

发现调用了ptrace函数,那我们就先对ptrace函数做下处理。

处理的时候,可以参考https://www.chenghu.me/?p=1350这篇文章,把ptrace函数的传参1F修改为0A。

改完之后,我们就可以使用Hopper Disassembler的动态调试功能,或者Interface Inspector的界面调试。

首先,去找我们之前猜测的applicationWillFinishLaunching方法。

发现调用了 sub_10000e010(self) 这个子程序。

跟过去发现有两处调用了sub_10000e010这个子程序

猜测这就是弹框的地方,直接在sub_10000e010这个子程序的头部retn,然后跑起来。

发现之前的弹窗果然没有了。

但是有了新的问题,点菜单栏和退出的时候会闪退(异常退出)。

通过动态调试发现,它会执行ud2这个命令。

百度一下这个指令:

UD2是一种让CPU产生invalid opcode exception的软件指令. 内核发现CPU出现这个异常, 会立即停止运行.

void sub_100192ff0(int arg0) {
    var_C0 = r13;
    var_50 = arg0;
    *0x1004d5798 = *0x1004d5798 + 0x1;
    *0x1004d57b0 = *0x1004d57b0 + 0x1;
    if (*0x1004bab68 != 0xffffffffffffffff) {
            swift_once(0x1004bab68, sub_100208920);
    }
    *0x1004d57b8 = *0x1004d57b8 + 0x1;
    r14 = sub_100023780();
    sub_100008a80();
    r15 = sub_100208980(r14, sub_100208920);
    if (r15 != 0x0) {
            rbx = sub_100010860();
            sub_100008a70();
            if (rbx != 0x0) {
                    *0x1004d57c0 = *0x1004d57c0 + 0x1;
                    *0x1004d57c8 = *0x1004d57c8 + 0x1;
                    r14 = var_50;
                    [r14 retain];
                    if (*(int8_t *)(rbx + 0x30) == 0x0) {
                            *0x1004d57d0 = *0x1004d57d0 + 0x1;
                            swift_unknownRetain(r15);
                            rbx = sub_1000251e0();
                            swift_unknownRelease(r15);
                            if ((rbx & 0x1) != 0x0) {
                                    swift_unknownRelease(r15);
                                    [r14 release];
                                    *0x1004d57a0 = *0x1004d57a0 + 0x1;
                                    rbx = 0x0;
                            }
                            else {
                                    *0x1004d57d8 = *0x1004d57d8 + 0x1;
                                    swift_unknownRetain(r15);
                                    *0x1004d57e0 = *0x1004d57e0 + 0x1;
                                    *0x1004d57e8 = *0x1004d57e8 + 0x1;
                                    rbx = [sub_1002df34d() retain];
                                    rdx = *0x1004bef18;
                                    if (rdx == 0x0) {
                                            rdx = sub_100008a10();
                                            *0x1004bef18 = rdx;
                                    }
                                    r12 = static (rbx, type metadata for Swift.String);
                                    sub_1001656b0(r12, type metadata for Swift.String, rdx);
                                    xmm0 = intrinsic_movaps(xmm0, var_200);
                                    var_210 = intrinsic_movaps(var_210, xmm0);
                                    var_68 = var_1F0;
                                    rbx = var_1E8;
                                    xmm0 = intrinsic_movaps(xmm0, var_1E0);
                                    var_220 = intrinsic_movaps(var_220, xmm0);
                                    var_78 = var_1D0;
                                    r13 = var_1C8;
                                    xmm0 = intrinsic_movaps(xmm0, var_1C0);
                                    var_230 = intrinsic_movaps(var_230, xmm0);
                                    var_80 = var_1B0;
                                    r14 = var_1A8;
                                    var_90 = var_1A0;
                                    var_29 = var_198;
                                    xmm0 = intrinsic_movaps(xmm0, var_190);
                                    var_240 = intrinsic_movaps(var_240, xmm0);
                                    var_98 = var_180;
                                    var_2A = var_178;
                                    xmm0 = intrinsic_movaps(xmm0, var_170);
                                    var_250 = intrinsic_movaps(var_250, xmm0);
                                    var_A0 = var_160;
                                    var_2B = var_158;
                                    var_2C = var_148;
                                    var_2D = var_138;
                                    xmm0 = intrinsic_movaps(xmm0, var_130);
                                    var_260 = intrinsic_movaps(var_260, xmm0);
                                    var_2E = var_118;
                                    xmm0 = intrinsic_movaps(xmm0, var_110);
                                    var_270 = intrinsic_movaps(var_270, xmm0);
                                    var_2F = var_F8;
                                    var_30 = var_F7;
                                    var_31 = var_F6;
                                    var_32 = var_E8;
                                    var_40 = var_D8;
                                    var_48 = var_C8;
                                    var_58 = var_150;
                                    var_60 = var_140;
                                    var_70 = var_120;
                                    var_88 = var_100;
                                    var_A8 = var_F0;
                                    var_B0 = var_E0;
                                    var_B8 = var_D0;
                                    if (r12 >= 0x0) {
                                            sub_100008a70();
                                    }
                                    else {
                                            swift_unknownRelease(r12 & 0x7fffffffffffffff);
                                    }
                                    xmm0 = intrinsic_movaps(xmm0, var_210);
                                    var_3B0 = intrinsic_movaps(var_3B0, xmm0);
                                    intrinsic_movaps(var_390, intrinsic_movaps(xmm0, var_220));
                                    intrinsic_movaps(var_370, intrinsic_movaps(xmm0, var_230));
                                    intrinsic_movaps(var_340, intrinsic_movaps(xmm0, var_240));
                                    intrinsic_movaps(var_320, intrinsic_movaps(xmm0, var_250));
                                    intrinsic_movaps(var_2E0, intrinsic_movaps(xmm0, var_260));
                                    intrinsic_movaps(var_2C0, intrinsic_movaps(xmm0, var_270));
                                    sub_1000d2370(&var_3B0);
                                    xmm0 = intrinsic_movaps(xmm0, var_200);
                                    xmm1 = intrinsic_movaps(xmm1, var_1F0);
                                    intrinsic_movaps(xmm2, var_1E0);
                                    intrinsic_movaps(xmm3, var_1D0);
                                    intrinsic_movaps(xmm4, var_1C0);
                                    intrinsic_movaps(xmm5, var_1B0);
                                    intrinsic_movaps(xmm6, var_1A0);
                                    intrinsic_movaps(xmm7, var_190);
                                    intrinsic_movaps(xmm8, var_180);
                                    intrinsic_movaps(xmm9, var_170);
                                    var_460 = intrinsic_movaps(var_460, xmm0);
                                    intrinsic_movaps(var_450, xmm1);
                                    intrinsic_movaps(var_440, xmm2);
                                    intrinsic_movaps(var_430, xmm3);
                                    intrinsic_movaps(var_420, xmm4);
                                    intrinsic_movaps(var_410, xmm5);
                                    intrinsic_movaps(var_400, xmm6);
                                    intrinsic_movaps(var_3F0, xmm7);
                                    intrinsic_movaps(var_3E0, xmm8);
                                    intrinsic_movaps(var_3D0, xmm9);
                                    sub_100052670(&var_460);
                                    rax = sub_1000165c0(&var_200, var_1E8);
                                    rcx = *(*(var_1E8 + 0xfffffffffffffff8) + 0x88) + 0xf;
                                    (*(*(var_1E8 + 0xfffffffffffffff8) + 0x30))(rsp - (rcx & 0xfffffffffffffff0), rax, var_1E8, rcx & 0xfffffffffffffff0);
                                    r13 = (*var_1E0)(var_1E8, var_1E0);
                                    (*(*(var_1E8 + 0xfffffffffffffff8) + 0x20))(rsp - (rcx & 0xfffffffffffffff0), var_1E8);
                                    sub_1000108a0(&var_200);
                                    rbx = var_50;
                                    [rbx release];
                                    swift_unknownRelease_n(r15, 0x2);
                                    if ((r13 & 0x1) == 0x0) {
                                            rax = [rbx action];
                                            rbx = 0x1;
                                            if ((rax != 0x0) && ((ObjectiveC.== infix(rax, @selector(openNewDocumentWindowAndInspectDemoApp:)) & 0x1) != 0x0)) {
                                                    *0x1004d57a8 = *0x1004d57a8 + 0x1;
                                                    r14 = sub_10000de70();
                                                    if (r14 != 0x0) {
                                                            rbx = ObjectiveC._convertObjCBoolToBool([r14 sampleApplicationIsLaunching] & 0xff);
                                                            [r14 release];
                                                            rbx = rbx ^ 0x1;
                                                    }
                                                    else {
                                                            rbx = 0x0;
                                                    }
                                            }
                                    }
                                    else {
                                            *0x1004d57a0 = *0x1004d57a0 + 0x1;
                                            rbx = 0x0;
                                    }
                            }
                    }
                    else {
                            swift_unknownRelease(r15);
                            [r14 release];
                            *0x1004d57a0 = *0x1004d57a0 + 0x1;
                            rbx = 0x0;
                    }
            }
            else {
                    swift_unknownRelease(r15);
                    asm { ud2 };
                    loc_1001936d4();
            }
    }
    else {
            sub_100008a70();
            asm { ud2 };
            loc_1001936ca(rdi);
    }
    return;
}

看到了unknownRelease这种关键字,估摸着这软件可能校验什么自己不正常后自己调用ud2指令直接异常。

发现调用这些校验的也是菜单的东西,于是我直接把这个校验子程序的首部retn掉。

发现还有一堆这样的校验子程序,基本上每个菜单下边都有这种检测的调用。全部retn掉,不让它执行异常,然后就可以正常的打开和使用了。


Chrome下论坛帖子图文混排有排版混乱的问题
Chrome下论坛帖子图文混排有排版混乱的问题
#2

请问下 ud2的命令在哪里ret 掉?很多地方都有ud2, 望回复 谢谢!


#3

去动态调试,然后看它在哪崩溃的,就把那个函数的开始ret掉就可以了。


#4

请问是ret掉一次就要produce一次吗?我想的是添加的ret 在ud2指令执行前,应该就是要一次次的。不知道会不会有什么神操作呢?


#5

就是看它在哪崩溃的,把崩溃的子程序全部retn掉,这样就不会执行ud2这个异常指令。


#6

我是用LLDB调试到了崩溃地址(应该是偏移后的基地址),但是如何通过这个这个地址 定位到Hopper中的函数名字,地址转换了一下,没搜到,不知道是我转换的问题还是哪里的问题?


#7

谢谢


#8

LZ的这个只能解决第一次用的时候的激活检测,如果原来Reveal最新版的试用版并且已经试用结束,还有会有弹出框提示试用期已经结束,关闭弹出框就自动退出不能使用了。

在资源文件中找到了ActivationWindowController.nib,分析了一下应该就是试用期结束的这个弹出框,但是反汇编的代码找不到调用这个的地方


#9

搞了大半天发现这个 ActivationWindowController 是一个伪装,没用的


#10

我直接使用的hopper的内置调试。就可以直接定位到hopper上了。


#11

似懂非懂。。:joy:


#12

试了一下,确实可行:grinning:


#13

Personal版还是Commercial版?


#14

请问?怎么在具体的函数位置写入ret代码?


#15

使用hopper 快捷键option+A即可编辑


#17

还有个方法是通过Capstone Engine+Keystone Engine来动态Patch UD2