Parallels Desktop Disassember

下面的代码可否通过跳过日期验证函数来破解试用期的限制呢,求大神指点迷津,万分感激。 对应的程序路径/Applications/Parallels Desktop.app/Contents/MacOS/Parallels Service.app/Contents/MacOS/prl_disp_service

        ; ================ B E G I N N I N G   O F   P R O C E D U R E ================

        ; Variables:
        ;    var_30: -48
        ;    var_38: -56
        ;    var_40: -64


                     sub_1001df4e0:
00000001001df4e0         push       rbp                                         ; CODE XREF=sub_10004ef30+26
00000001001df4e1         mov        rbp, rsp
00000001001df4e4         push       r15
00000001001df4e6         push       r14
00000001001df4e8         push       r12
00000001001df4ea         push       rbx
00000001001df4eb         sub        rsp, 0x20
00000001001df4ef         mov        r14, rsi
00000001001df4f2         mov        r12, rdi
00000001001df4f5         call       imp___stubs___ZNK7QObject6threadEv          ; QObject::thread() const
00000001001df4fa         cmp        rax, r14
00000001001df4fd         je         loc_1001df561

00000001001df4ff         mov        rdi, r12
00000001001df502         call       imp___stubs___ZNK7QObject6threadEv          ; QObject::thread() const
00000001001df507         mov        r15, rax
00000001001df50a         call       imp___stubs___ZN7QThread13currentThreadEv   ; QThread::currentThread()
00000001001df50f         cmp        r15, rax
00000001001df512         je         loc_1001df556

00000001001df514         lea        rax, qword [0x100b8a4b9]                    ; "runAsync"
00000001001df51b         mov        qword [rsp+0x40+var_38], rax
00000001001df520         mov        dword [rsp+0x40+var_40], 0x39               ; argument #7 for method sub_100a3cde0
00000001001df527         lea        rdi, qword [0x100bbcfb8]                    ; "", argument #1 for method sub_100a3cde0
00000001001df52e         lea        rsi, qword [0x100b78223]                    ; "disp", argument #2 for method sub_100a3cde0
00000001001df535         lea        rcx, qword [0x100b78b0e]                    ; "ASSERT( %s ) occured in %s:%d [%s]", argument #4 for method sub_100a3cde0
00000001001df53c         lea        r8, qword [0x100b8a48a]                     ; "pRequest->thread() == QThread::currentThread()", argument #5 for method sub_100a3cde0
00000001001df543         lea        r9, qword [0x100b8a464]                     ; "CDspAsyncRequest.cpp", argument #6 for method sub_100a3cde0
00000001001df54a         mov        edx, 0x0                                    ; argument #3 for method sub_100a3cde0
00000001001df54f         xor        eax, eax
00000001001df551         call       sub_100a3cde0

                     loc_1001df556:
00000001001df556         mov        rdi, r12                                    ; CODE XREF=sub_1001df4e0+50
00000001001df559         mov        rsi, r14
00000001001df55c         call       imp___stubs___ZN7QObject12moveToThreadEP7QThread ; QObject::moveToThread(QThread*)

                     loc_1001df561:
00000001001df561         call       imp___stubs___ZN7QThread13currentThreadEv   ; QThread::currentThread(), CODE XREF=sub_1001df4e0+29
00000001001df566         mov        rbx, rax
00000001001df569         mov        rdi, r12
00000001001df56c         call       imp___stubs___ZNK7QObject6threadEv          ; QObject::thread() const
00000001001df571         cmp        rbx, rax
00000001001df574         je         loc_1001df58a

00000001001df576         mov        rdi, r12
00000001001df579         add        rsp, 0x20
00000001001df57d         pop        rbx
00000001001df57e         pop        r12
00000001001df580         pop        r14
00000001001df582         pop        r15
00000001001df584         pop        rbp
00000001001df585         jmp        sub_1003c2b40
                        ; endp

                     loc_1001df58a:
00000001001df58a         movaps     xmm0, xmmword [0x100c43990]                 ; CODE XREF=sub_1001df4e0+148
00000001001df591         movaps     xmmword [rbp+var_30], xmm0
00000001001df595         lea        rbx, qword [rbp+var_30]
00000001001df599         mov        rdi, rbx
00000001001df59c         call       imp___stubs___ZN13QElapsedTimer5startEv     ; QElapsedTimer::start()
00000001001df5a1         mov        rax, qword [r12]
00000001001df5a5         mov        rdi, r12
00000001001df5a8         call       qword [rax+0x60]
00000001001df5ab         mov        esi, 0x4e20
00000001001df5b0         mov        rdi, rbx
00000001001df5b3         call       imp___stubs___ZNK13QElapsedTimer10hasExpiredEx ; QElapsedTimer::hasExpired(long long) const
00000001001df5b8         test       al, al
00000001001df5ba         je         loc_1001df5e9

00000001001df5bc         lea        rdi, qword [rbp+var_30]
00000001001df5c0         call       imp___stubs___ZNK13QElapsedTimer7elapsedEv  ; QElapsedTimer::elapsed() const
00000001001df5c5         mov        rbx, rax
00000001001df5c8         lea        rdi, qword [0x100bbcfb8]                    ; "", argument #1 for method sub_100a3cde0
00000001001df5cf         lea        rsi, qword [0x100b78223]                    ; "disp", argument #2 for method sub_100a3cde0
00000001001df5d6         lea        rcx, qword [0x100b8a4c2]                    ; "Request took too much time in the runner thread: %llu", argument #4 for method sub_100a3cde0
00000001001df5dd         xor        edx, edx                                    ; argument #3 for method sub_100a3cde0
00000001001df5df         xor        eax, eax
00000001001df5e1         mov        r8, rbx                                     ; argument #5 for method sub_100a3cde0
00000001001df5e4         call       sub_100a3cde0

                     loc_1001df5e9:
00000001001df5e9         add        rsp, 0x20                                   ; CODE XREF=sub_1001df4e0+218
00000001001df5ed         pop        rbx
00000001001df5ee         pop        r12
00000001001df5f0         pop        r14
00000001001df5f2         pop        r15
00000001001df5f4         pop        rbp
00000001001df5f5         ret
                        ; endp
00000001001df5f6         nop        word [cs




 

参考过程sub_1001df4e0的伪代码如下,可以分析程序处理流程。

void sub_1001df4e0(int arg0, int arg1) {
    r14 = arg1;
    r12 = arg0;
    if (QObject::thread(arg0, arg1) != r14) {
            if (QObject::thread(r12) != QThread::currentThread()) {
                    stack[2040] = "runAsync";
                    r9 = "CDspAsyncRequest.cpp";
                    LODWORD(rax) = 0x0;
                    rax = sub_100a3cde0("", "disp", 0x0, "ASSERT( %s ) occured in %s:%d [%s]", "pRequest->thread() == QThread::currentThread()", r9, 0x39);
            }
            rax = QObject::moveToThread(r12, r14);
    }
    if (QThread::currentThread() != QObject::thread(r12)) {
            rdi = r12;
            rbx = stack[2043];
            r12 = stack[2044];
            r14 = stack[2045];
            r15 = stack[2046];
            rsp = rsp + 0x48;
            rbp = stack[2047];
            rax = sub_1003c2b40();
    }
    else {
            var_30 = intrinsic_movaps(var_30, intrinsic_movaps(xmm0, *(int128_t *)0x100c43990));
            rax = QElapsedTimer::start(var_30);
            rax = *r12;
            rax = (*(rax + 0x60))(r12);
            rax = QElapsedTimer::hasExpired(var_30, 0x4e20);
            if (LOBYTE(rax) != 0x0) {
                    LODWORD(rax) = 0x0;
                    rax = sub_100a3cde0("", "disp", 0x0, "Request took too much time in the runner thread: %llu", QElapsedTimer::elapsed(var_30), r9, 0x39);
            }
            rbx = stack[2043];
            r12 = stack[2044];
            r14 = stack[2045];
            r15 = stack[2046];
            rsp = rsp + 0x48;
            rbp = stack[2047];
    }
    return;
}




void sub_1001df4e0(int arg0, int arg1) {
    r14 = arg1;
    r12 = arg0;
    if (QObject::thread(arg0, arg1) != r14) {
            if (QObject::thread(r12) != QThread::currentThread()) {
                    r9 = "CDspAsyncRequest.cpp";
                    sub_100a3cde0("", "disp", 0x0, "ASSERT( %s ) occured in %s:%d [%s]", "pRequest->thread() == QThread::currentThread()", r9, 0x39);
            }
            QObject::moveToThread(r12, r14);
    }
    if (QThread::currentThread() != QObject::thread(r12)) {
            sub_1003c2b40();
    }
    else {
            var_30 = intrinsic_movaps(var_30, intrinsic_movaps(xmm0, *(int128_t *)0x100c43990));
            QElapsedTimer::start(var_30);
            rax = *r12;
            (*(rax + 0x60))(r12);
            if (QElapsedTimer::hasExpired(var_30, 0x4e20) != 0x0) {
                    sub_100a3cde0("", "disp", 0x0, "Request took too much time in the runner thread: %llu", QElapsedTimer::elapsed(var_30), r9, 0x39);
            }
    }
    return;
}



 

找到sub_100a3cde0对应的汇编及伪代码如下:

        ; ================ B E G I N N I N G   O F   P R O C E D U R E ================

        ; Variables:
        ;    arg_0: 16
        ;    var_30: -48
        ;    var_40: -64
        ;    var_48: -72
        ;    var_4C: -76
        ;    var_50: -80
        ;    var_58: -88
        ;    var_60: -96
        ;    var_68: -104
        ;    var_70: -112
        ;    var_78: -120
        ;    var_90: -144
        ;    var_A0: -160
        ;    var_B0: -176
        ;    var_C0: -192
        ;    var_D0: -208
        ;    var_E0: -224
        ;    var_F0: -240
        ;    var_100: -256
        ;    var_108: -264
        ;    var_110: -272
        ;    var_130: -304


                     sub_100a3cde0:
0000000100a3cde0         push       rbp                                         ; CODE XREF=sub_100009e00+259, sub_100009e00+306, sub_100009e00+1215, sub_10000c330+244, sub_10000c330+291, sub_10000cb60+124, sub_10000cc30+45, EntryPoint+128, sub_10000ced0+93, sub_10000ced0+145, sub_10000ced0+197, …
0000000100a3cde1         mov        rbp, rsp
0000000100a3cde4         push       r15
0000000100a3cde6         push       r14
0000000100a3cde8         push       r13
0000000100a3cdea         push       r12
0000000100a3cdec         push       rbx
0000000100a3cded         sub        rsp, 0x108
0000000100a3cdf4         mov        r14, rcx
0000000100a3cdf7         mov        r15d, edx
0000000100a3cdfa         mov        r12, rsi
0000000100a3cdfd         mov        rbx, rdi
0000000100a3ce00         test       al, al
0000000100a3ce02         je         loc_100a3ce3c

0000000100a3ce04         movaps     xmmword [rbp+var_100], xmm0
0000000100a3ce0b         movaps     xmmword [rbp+var_F0], xmm1
0000000100a3ce12         movaps     xmmword [rbp+var_E0], xmm2
0000000100a3ce19         movaps     xmmword [rbp+var_D0], xmm3
0000000100a3ce20         movaps     xmmword [rbp+var_C0], xmm4
0000000100a3ce27         movaps     xmmword [rbp+var_B0], xmm5
0000000100a3ce2e         movaps     xmmword [rbp+var_A0], xmm6
0000000100a3ce35         movaps     xmmword [rbp+var_90], xmm7

                     loc_100a3ce3c:
0000000100a3ce3c         mov        qword [rbp+var_108], r9                     ; CODE XREF=sub_100a3cde0+34
0000000100a3ce43         mov        qword [rbp+var_110], r8
0000000100a3ce4a         mov        rax, qword [___stack_chk_guard_100cde268]
0000000100a3ce51         mov        rax, qword [rax]
0000000100a3ce54         mov        qword [rbp+var_30], rax
0000000100a3ce58         call       imp___stubs____error
0000000100a3ce5d         mov        r13d, dword [rax]
0000000100a3ce60         mov        qword [rbp+var_78], 0x0
0000000100a3ce68         mov        dword [rbp+var_70], 0x0
0000000100a3ce6f         mov        qword [rbp+var_68], 0x0
0000000100a3ce77         mov        qword [rbp+var_60], rbx
0000000100a3ce7b         mov        qword [rbp+var_58], r12
0000000100a3ce7f         lea        rax, qword [rbp+var_130]
0000000100a3ce86         mov        qword [rbp+var_40], rax
0000000100a3ce8a         lea        rax, qword [rbp+arg_0]
0000000100a3ce8e         mov        qword [rbp+var_48], rax
0000000100a3ce92         mov        dword [rbp+var_4C], 0x30
0000000100a3ce99         mov        dword [rbp+var_50], 0x20
0000000100a3cea0         lea        rdi, qword [rbp+var_78]                     ; argument #1 for method sub_100a3d340
0000000100a3cea4         lea        rcx, qword [rbp+var_50]                     ; argument #4 for method sub_100a3d340
0000000100a3cea8         mov        esi, r15d                                   ; argument #2 for method sub_100a3d340
0000000100a3ceab         mov        rdx, r14                                    ; argument #3 for method sub_100a3d340
0000000100a3ceae         call       sub_100a3d340
0000000100a3ceb3         call       imp___stubs____error
0000000100a3ceb8         mov        dword [rax], r13d
0000000100a3cebb         mov        rax, qword [___stack_chk_guard_100cde268]
0000000100a3cec2         mov        rax, qword [rax]
0000000100a3cec5         cmp        rax, qword [rbp+var_30]
0000000100a3cec9         jne        loc_100a3cedd

0000000100a3cecb         add        rsp, 0x108
0000000100a3ced2         pop        rbx
0000000100a3ced3         pop        r12
0000000100a3ced5         pop        r13
0000000100a3ced7         pop        r14
0000000100a3ced9         pop        r15
0000000100a3cedb         pop        rbp
0000000100a3cedc         ret
                        ; endp

                     loc_100a3cedd:
0000000100a3cedd         call       imp___stubs____stack_chk_fail               ; CODE XREF=sub_100a3cde0+233
                        ; endp
0000000100a3cee2         mov        rdi, rax
0000000100a3cee5         call       sub_10000ccc0
0000000100a3ceea         mov        rbx, rax
0000000100a3ceed         call       imp___stubs____error
0000000100a3cef2         mov        dword [rax], r13d
0000000100a3cef5         mov        rdi, rbx
0000000100a3cef8         call       imp___stubs___Unwind_Resume
0000000100a3cefd         mov        rdi, rax
0000000100a3cf00         call       sub_10000ccc0
0000000100a3cf05         nop        wor

int
sub_100a3cf20(int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) { var_58 = arg5; r15 = arg4; r12 = arg3; r13 = arg2; rbx = arg1; r14 = arg0; if (rax != 0x0) { intrinsic_movaps(var_100, xmm0); intrinsic_movaps(var_F0, xmm1); intrinsic_movaps(var_E0, xmm2); intrinsic_movaps(var_D0, xmm3); intrinsic_movaps(var_C0, xmm4); intrinsic_movaps(var_B0, xmm5); intrinsic_movaps(var_A0, xmm6); intrinsic_movaps(var_90, xmm7); } var_30 = *___stack_chk_guard; var_54 = *(int32_t *)__error(); sub_100a3d340(r14, var_58, arg6, 0x30); *(int32_t *)__error() = var_54; rax = *___stack_chk_guard; if (rax != var_30) { rax = __stack_chk_fail(); } return rax; }

 

sub_100a3d340的处理过程如下:

        ; ================ B E G I N N I N G   O F   P R O C E D U R E ================

        ; Variables:
        ;    var_30: -48
        ;    var_32: -50
        ;    var_1030: -4144
        ;    var_1038: -4152
        ;    var_1040: -4160
        ;    var_1048: -4168
        ;    var_1050: -4176
        ;    var_1058: -4184
        ;    var_1090: -4240


                     sub_100a3d340:
0000000100a3d340         push       rbp                                         ; CODE XREF=sub_100a3cde0+206, sub_100a3cf10+4, sub_100a3cf20+189
0000000100a3d341         mov        rbp, rsp
0000000100a3d344         push       r15
0000000100a3d346         push       r14
0000000100a3d348         push       r13
0000000100a3d34a         push       r12
0000000100a3d34c         push       rbx
0000000100a3d34d         sub        rsp, 0x1068
0000000100a3d354         mov        r15, rcx
0000000100a3d357         mov        qword [rbp+var_1040], rdx
0000000100a3d35e         mov        r13d, esi
0000000100a3d361         mov        r12, rdi
0000000100a3d364         mov        rax, qword [___stack_chk_guard_100cde268]
0000000100a3d36b         mov        rax, qword [rax]
0000000100a3d36e         mov        qword [rbp+var_30], rax
0000000100a3d372         mov        eax, r13d
0000000100a3d375         sar        eax, 0x1f
0000000100a3d378         shr        eax, 0x1c
0000000100a3d37b         add        eax, r13d
0000000100a3d37e         and        eax, 0xfffffff0
0000000100a3d381         mov        rcx, qword [r12]
0000000100a3d385         test       rcx, rcx
0000000100a3d388         jne        loc_100a3d393

0000000100a3d38a         jmp        loc_100a3d3be
0000000100a3d38c         nop        dword [rax]

                     loc_100a3d390:
0000000100a3d390         mov        rcx, rdx                                    ; CODE XREF=sub_100a3d340+110

                     loc_100a3d393:
0000000100a3d393         lea        rdx, qword [rcx+1]                          ; CODE XREF=sub_100a3d340+72, sub_100a3d340+120
0000000100a3d397         jmp        loc_100a3d3a3
0000000100a3d399         nop        dword [rax]

                     loc_100a3d3a0:
0000000100a3d3a0         inc        rdx                                         ; CODE XREF=sub_100a3d340+115

                     loc_100a3d3a3:
0000000100a3d3a3         movzx      ebx, byte [rdx-1]                           ; CODE XREF=sub_100a3d340+87
0000000100a3d3a7         test       bl, bl
0000000100a3d3a9         je         loc_100a3d3ba

0000000100a3d3ab         cmp        bl, 0x2f
0000000100a3d3ae         je         loc_100a3d390

0000000100a3d3b0         cmp        bl, 0x5c
0000000100a3d3b3         jne        loc_100a3d3a0

0000000100a3d3b5         mov        rcx, rdx
0000000100a3d3b8         jmp        loc_100a3d393

                     loc_100a3d3ba:
0000000100a3d3ba         mov        qword [r12], rcx                            ; CODE XREF=sub_100a3d340+105

                     loc_100a3d3be:
0000000100a3d3be         sub        r13d, eax                                   ; CODE XREF=sub_100a3d340+74
0000000100a3d3c1         mov        rax, qword [r12+0x10]
0000000100a3d3c6         test       rax, rax
0000000100a3d3c9         jne        loc_100a3d3d3

0000000100a3d3cb         jmp        loc_100a3d3f7
0000000100a3d3cd         nop        dword [rax]

 

伪代码如下:

void sub_100a3d340(int arg0, int arg1, int arg2, int arg3) {
    r15 = arg3;
    var_1040 = arg2;
    r13 = arg1;
    r12 = arg0;
    var_30 = *___stack_chk_guard;
    rax = (SAR(r13, 0x1f) >> 0x1c) + r13 & 0xfffffff0;
    rcx = *r12;
    if (rcx != 0x0) goto loc_100a3d393;

loc_100a3d3be:
    r13 = r13 - rax;
    rax = *(r12 + 0x10);
    if (rax != 0x0) goto loc_100a3d3d3;

loc_100a3d3f7:
    gettimeofday(var_1058, 0x0);
    rbx = sign_extend_64(strftime(var_1030, 0x80, "%m-%d %H:%M:%S", localtime_r(var_1058, var_1090)));
    r14 = rbp + sign_extend_64(rbx + sprintf(rbp + rbx + 0xffffffffffffefd0, ".%03d ", (SAR(sign_extend_64(var_1050) * 0x10624dd3, 0x26)) + (sign_extend_64(var_1050) * 0x10624dd3 >> 0x3f))) + 0xffffffffffffefd0;
    var_1038 = r15;
    if (r13 > 0x4) goto loc_100a3d4af;

loc_100a3d48f:
    switch (sign_extend_64(*(int32_t *)(0x100a3d644 + r13 * 0x4)) + 0x100a3d644) {
        case 0:
            *(int8_t *)(r14 + 0x2) = 0x0;
            *(int16_t *)r14 = 0x2046;
            break;
        case 1:
            *(int8_t *)(r14 + 0x2) = 0x0;
            *(int16_t *)r14 = 0x2057;
            break;
        case 2:
            *(int8_t *)(r14 + 0x2) = 0x0;
            *(int16_t *)r14 = 0x2049;
            break;
        case 3:
            *(int8_t *)(r14 + 0x2) = 0x0;
            *(int16_t *)r14 = 0x2044;
            break;
        case 4:
            *(int8_t *)(r14 + 0x2) = 0x0;
            *(int16_t *)r14 = 0x2054;
            break;
    }
    r14 = r14 + 0x2;
    goto loc_100a3d500;

loc_100a3d500:
    rbx = sign_extend_64(sprintf(r14, "/%s:%u:%u/ ", *(r12 + 0x20), getpid(), pthread_mach_thread_np(pthread_self()))) + r14;
    rax = *(int8_t *)*(r12 + 0x18);
    if (rax != 0x0) {
            COND = rax != 0x5b;
            rax = "[%s] ";
            rsi = "%s ";
            if (COND) {
                    rsi = rax;
            }
            rbx = rbx + sign_extend_32(sprintf(rbx, rsi));
    }
    r14 = var_1038;
    rcx = *r12;
    if (rcx != 0x0) {
            rdx = *(r12 + 0x10);
            if (rdx != 0x0) {
                    rbx = rbx + sign_extend_32(sprintf(rbx, "{%s @ %s:%i} ", rdx, rcx, *(int32_t *)(r12 + 0x8)));
            }
    }
    vsnprintf(rbx, var_30 - rbx, var_1040, r14);
    *(int16_t *)(rbx + strlen(rbx)) = 0xa;
    r14 = var_1030;
    do {
            r15 = *0x101075120;
            *(int32_t *)r15 = lock intrinsic_xadd(*(int32_t *)r15, 0x1);
            rax = strlen(r14);
            sub_100a3d660(r14, rax);
            *(int32_t *)r15 = lock intrinsic_xadd(*(int32_t *)r15, 0xffffffff);
    } while (sub_100a3d660 != sub_100a3d660);
    if (*___stack_chk_guard != var_30) {
            __stack_chk_fail();
    }
    return;

loc_100a3d4af:
    r14 = r14 + sign_extend_32(sprintf(r14, "O(%u) ", r13));
    goto loc_100a3d500;

loc_100a3d3d3:
    rcx = rax + 0x1;
    goto loc_100a3d3e3;

loc_100a3d3e3:
    rdx = *(int8_t *)(rcx + 0xffffffffffffffff) & 0xff;
    if (rdx == 0x0) goto loc_100a3d3f2;

loc_100a3d3eb:
    if (rdx != 0x3a) goto loc_100a3d3e0;

loc_100a3d3f0:
    sub_100a3d3d0();
    return;

loc_100a3d3e0:
    rcx = rcx + 0x1;
    goto loc_100a3d3e3;

loc_100a3d3f2:
    *(r12 + 0x10) = rax;
    goto loc_100a3d3f7;

loc_100a3d393:
    rdx = rcx + 0x1;
    goto loc_100a3d3a3;

loc_100a3d3a3:
    rbx = *(int8_t *)(rdx + 0xffffffffffffffff) & 0xff;
    if (rbx == 0x0) goto loc_100a3d3ba;

loc_100a3d3ab:
    if (rbx == 0x2f) goto loc_100a3d390;

loc_100a3d3b0:
    if (rbx != 0x5c) goto loc_100a3d3a0;

loc_100a3d3b5:
    rcx = rdx;
    goto loc_100a3d393;

loc_100a3d3a0:
    rdx = rdx + 0x1;
    goto loc_100a3d3a3;

loc_100a3d390:
    rcx = rdx;
    goto loc_100a3d393;

loc_100a3d3ba:
    *r12 = rcx;
    goto loc_100a3d3be;
}

 

loc_100a3d3f7的处理代码如下:

0000000100a3d3f7         lea        rdi, qword [rbp+var_1058]                   ; argument "tp" for method imp___stubs__gettimeofday, CODE XREF=sub_100a3d340+139
0000000100a3d3fe         xor        esi, esi                                    ; argument "tzp" for method imp___stubs__gettimeofday
0000000100a3d400         call       imp___stubs__gettimeofday
0000000100a3d405         mov        rax, qword [rbp+var_1058]
0000000100a3d40c         mov        qword [rbp+var_1048], rax
0000000100a3d413         lea        rdi, qword [rbp+var_1048]                   ; argument "clock" for method imp___stubs__localtime_r
0000000100a3d41a         lea        rsi, qword [rbp+var_1090]                   ; argument "result" for method imp___stubs__localtime_r
0000000100a3d421         call       imp___stubs__localtime_r
0000000100a3d426         lea        rdx, qword [0x100c3fe4b]                    ; "%m-%d %H:%M:%S", argument "format" for method imp___stubs__strftime
0000000100a3d42d         lea        rdi, qword [rbp+var_1030]                   ; argument "s" for method imp___stubs__strftime
0000000100a3d434         mov        esi, 0x80                                   ; argument "maxsize" for method imp___stubs__strftime
0000000100a3d439         mov        rcx, rax                                    ; argument "timeptr" for method imp___stubs__strftime
0000000100a3d43c         call       imp___stubs__strftime
0000000100a3d441         movsxd     rbx, eax
0000000100a3d444         lea        rdi, qword [rbp+rbx+var_1030]               ; argument "str" for method imp___stubs__sprintf
0000000100a3d44c         movsxd     rax, dword [rbp+var_1050]
0000000100a3d453         imul       rdx, rax, 0x10624dd3
0000000100a3d45a         mov        rax, rdx
0000000100a3d45d         shr        rax, 0x3f
0000000100a3d461         sar        rdx, 0x26
0000000100a3d465         add        edx, eax
0000000100a3d467         lea        rsi, qword [0x100c3fe5a]                    ; ".%03d ", argument "format" for method imp___stubs__sprintf
0000000100a3d46e         xor        eax, eax
0000000100a3d470         call       imp___stubs__sprintf
0000000100a3d475         add        ebx, eax
0000000100a3d477         movsxd     rax, ebx
0000000100a3d47a         lea        r14, qword [rbp+rax+var_1030]
0000000100a3d482         cmp        r13d, 0x4
0000000100a3d486         mov        qword [rbp+var_1038], r15
0000000100a3d48d         ja         loc_100a3d4af

 

 将0000000100a3d48d         ja         loc_100a3d4af的ja(大于跳转)NOP掉是否可行呢?看来得等到软件过期那天再验证一下。

系统时间像后改了14以后,测试了下不行,还是提示过期,看来上述操作智能仅供参考啊。

可以使用将系统时间提前的办法,但比较麻烦。

 

posted @ 2019-04-05 10:52  heycomputer  阅读(525)  评论(0)    收藏  举报