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以后,测试了下不行,还是提示过期,看来上述操作智能仅供参考啊。
可以使用将系统时间提前的办法,但比较麻烦。


浙公网安备 33010602011771号