PatchGuard自效驗粗略分析
花了幾天時間,只是粗略除錯分析,patchguard實在是太大了,貧道無能 ,水平有限可能有不實之處。
有時間應該還會繼續除錯,研究吧。此處感謝 大表哥 這麼多的無私幫助。
//ed nt!Kd_SXS_Mask 0 //ed nt!Kd_FUSION_Mask 0 //....... //Win10PG 負責解密PG執行的程式碼如果改了直接109 //PG context裡面會清理Dr暫存器 // sidt fword ptr [rbp+4E0h] INITKDBG:00000001402DC129 lidt fword ptr [rbp+378h] INITKDBG:00000001402DC130 mov dr7, rax INITKDBG:00000001402DC133 lidt fword ptr [rbp+4E0h]
除錯pgcontext用VT禁用Noimage記憶體寫入DR和呼叫lidt指令,然後用硬體斷點暫存器來除錯。pg裡面有些地方跟蹤很容易掛掉,暫且不提。
關於自效驗如下:
演算法有很多,貼一個,大概都是這種:
mov rax, [r9] ; Vu=*ULONG_PTR *Pg[0] INITKDBG:00000001402DC29C mov ecx, r11d ; 可能計算的範圍? INITKDBG:00000001402DC29F xor rax, r8 ; Vu=^ Vu2 INITKDBG:00000001402DC2A2 mov r8, [r9+8] ; Vu2=*ULONG_PTR *Pg[1] INITKDBG:00000001402DC2A6 rol rax, cl ; rol(Vu,cl) INITKDBG:00000001402DC2A9 add r9, 10h ; p=+0x10 INITKDBG:00000001402DC2AD xor r8, rax ; Vu2 ^count INITKDBG:00000001402DC2B0 rol r8, cl ; rol( Vu2 ,cl) INITKDBG:00000001402DC2B3 sub rdx, r12 ; 是否計算完畢? INITKDBG:00000001402DC2B6 jnz short cpg ; Vu=*ULONG_PTR *Pg[0]
我只跟到4處 sign
第一 pg解密呼叫處,此處在pg執行體頭部,進行效驗,計算得出的key與PatchGuard_CmpAppendDllSectionSign 對比。如果失敗,開頭就會進入藍屏流程了。
第二處是效驗pg_Exec上方逆效驗,也會對比sign,失敗進行奇葩操作(658h)。
第三處是正向計算pg_exec 下方效驗,也會對比sign 失敗進行奇葩操作(8B8h)
第四處、具體沒看,存在奇葩(828h)
Pg 17134 1804 自效驗pgcontext偏移:828h(101) 8B8h(109) 658h(101)
還有一處效驗沒有跟,它會呼叫KiDispatchCallout,暫時的解決辦法是寫 c3 (C0000005)
像這種執行時 自效驗 pgcontext裡面非常的多。
效驗一 PgEntry:
演算法在上方,很多,不貼了。
mov [rdi+0C4h], esi INITKDBG:00000001402F246A cmp [rdi+8B8h], r8 ; //對比 sign 正確跳走 不正常給把錯誤碼賦值 INITKDBG:00000001402F2471 jz short loc_1402F24DD INITKDBG:00000001402F2473 mov rax, [rdi+588h] INITKDBG:00000001402F247A mov ecx, [rdi+684h] INITKDBG:00000001402F2480 mov [rax], rdi INITKDBG:00000001402F2483 mov [rax+10h], ecx INITKDBG:00000001402F2486 mov eax, [rdi+790h] INITKDBG:00000001402F248C mov rdx, [rdi+8B8h] INITKDBG:00000001402F2493 test eax, eax INITKDBG:00000001402F2495 jnz short loc_1402F24DD ; 進入藍屏流程 INITKDBG:00000001402F2497 mov rax, [rdi+588h] INITKDBG:00000001402F249E mov rcx, r8 INITKDBG:00000001402F24A1 xor rcx, rdx INITKDBG:00000001402F24A4 mov [rax+18h], rcx INITKDBG:00000001402F24A8 mov eax, [rdi+790h] INITKDBG:00000001402F24AE test eax, eax INITKDBG:00000001402F24B0 jnz short loc_1402F24DD ; //進入藍屏流程 INITKDBG:00000001402F24B2 lea rax, [rdi+r9] INITKDBG:00000001402F24B6 mov [rdi+7A0h], r15 INITKDBG:00000001402F24BD mov [rdi+798h], rax INITKDBG:00000001402F24C4 mov qword ptr [rdi+7A8h], 109h INITKDBG:00000001402F24CF mov [rdi+7B0h], r8 INITKDBG:00000001402F24D6 mov [rdi+790h], r12d //////這裡判斷是否存在藍屏程式碼 INITKDBG:00000001402F2853 CheCkKdebugCode: ; CODE XREF: INITKDBG:00000001402F2508j INITKDBG:00000001402F2853 cmp [rdi+790h], r15d ; //是否在藍屏程式碼 INITKDBG:00000001402F285A jz loc_1402F2B37
最後會執行執行到《
//這裡貼點1804的程式碼
》這裡
第一個效驗,不通過寫入一個藍屏程式碼109 後面判斷是否存在藍屏程式碼,然後就開始了善後工作,會清理一堆不知所謂的東西 。
然後關閉防寫,給dbgprin寫c3在恢復,最後的 imcall處無實際意義,最終呼叫 Sdbpcheck->清棧->KeBugCheckEx.
sdbpcheck不能Fuck jmp得封裝層 無法返回原有上下文,ret法也不行,回來沒有正常得可執行程式碼了 。
14393到是可以返回,但是依然要修改返回後的 int3 和下面跟的一個imcall 。實際情況還並不明朗。
結論:至少 1804 fuck sdbpcheckdll已死。
這裡貼點1804的程式碼:
mov rax, [rdi+218h] INITKDBG:00000001402F2A6E mov byte ptr [rax], 0C3h ; //把dbgprint寫c3 恢復防寫位 INITKDBG:00000001402F2A71 mov cr0, r12 INITKDBG:00000001402F2A75 mov r12, [rbp+40h] INITKDBG:00000001402F2A79 INITKDBG:00000001402F2A79 loc_1402F2A79: ; CODE XREF: INITKDBG:00000001402F28EBj INITKDBG:00000001402F2A79 mov ecx, [rdi+7C0h] INITKDBG:00000001402F2A7F test ecx, ecx ; //跳走了 INITKDBG:00000001402F2A81 jz FirstCodeVildCheck ; //sdbpcheck藍屏 INITKDBG:00000001402F2A87 mov rax, cr8 INITKDBG:00000001402F2A8B cmp al, r11b INITKDBG:00000001402F2A8E jnb short loc_1402F2A9E INITKDBG:00000001402F2A90 mov rax, cr8 INITKDBG:00000001402F2A94 mov cr8, r11 INITKDBG:00000001402F2A98 mov ecx, [rdi+7C0h] INITKDBG:00000001402F2A9E INITKDBG:00000001402F2A9E loc_1402F2A9E: ; CODE XREF: INITKDBG:00000001402F2A8Ej INITKDBG:00000001402F2A9E test ecx, ecx INITKDBG:00000001402F2AA0 jz FirstCodeVildCheck ; //sdbpcheck藍屏 INITKDBG:00000001402F2AA6 sub ecx, 1 INITKDBG:00000001402F2AA9 jz FirstCodeVildCheck3 INITKDBG:00000001402F2AAF sub ecx, 1 //// //FirstCodeVildCheck: ; CODE XREF: INITKDBG:00000001402F2A81j INITKDBG:00000001402F2CDE ; INITKDBG:00000001402F2AA0j ... INITKDBG:00000001402F2CDE and qword ptr [r15+610h], 0 ; //sdbpcheck藍屏 INITKDBG:00000001402F2CE6 and qword ptr [r15+690h], 0 INITKDBG:00000001402F2CEE mov rcx, [rdi+158h] INITKDBG:00000001402F2CF5 call KeGuardCheckICall INITKDBG:00000001402F2CFA mov rax, [rdi+158h] INITKDBG:00000001402F2D01 mov r9, rbx INITKDBG:00000001402F2D04 mov [rsp+30h], r14 INITKDBG:00000001402F2D09 mov r8, rsi INITKDBG:00000001402F2D0C mov [rsp+28h], rax INITKDBG:00000001402F2D11 mov rdx, r12 INITKDBG:00000001402F2D14 mov ecx, 109h INITKDBG:00000001402F2D19 mov [rsp+20h], r13 INITKDBG:00000001402F2D1E call SdbpCheckDll INITKDBG:00000001402F2D1E ; --------------------------------------------------------------------------- INITKDBG:00000001402F2D23 db 0Dh dup(0CCh) INITKDBG:00000001402F2D30 qword_1402F2D30 dq 5541544157565340h, 70EC834857415641h, 8E8898B48D98B48h
關於 FsRtlMdlReadCompleteDevEx:
這個裡面的效驗處有很多。
想到了個不知道是否可行的Patch。
自效驗方法:我貼一點程式碼 =就是擼掉 藍屏程式碼賦值的地方,把flag這些都Nop掉。
入口處效驗和藍屏
14393 lea rax, [rdi+r8] ; //賦值 INITKDBG:0000000140249923 mov [rdi+658h], rsi ; 藍屏引數 INITKDBG:000000014024992A mov [rdi+650h], rax ; //藍屏引數 INITKDBG:0000000140249931 mov qword ptr [rdi+660h], 109h ; //藍屏程式碼 INITKDBG:000000014024993C mov [rdi+668h], rdx ; //效驗和 INITKDBG:0000000140249943 mov dword ptr [rdi+648h], 1 ; //是否啟用了? 1804 lea rax, [rdi+r9] INITKDBG:00000001402F24B6 mov [rdi+7A0h], r15 INITKDBG:00000001402F24BD mov [rdi+798h], rax INITKDBG:00000001402F24C4 mov qword ptr [rdi+7A8h], 109h INITKDBG:00000001402F24CF mov [rdi+7B0h], r8 INITKDBG:00000001402F24D6 mov [rdi+790h], r12d
第二處效驗FsRtlMdlReadCompleteDevEx效驗和藍屏。
14393 lea rax, [r12+rsi] INITKDBG:0000000140239303 mov [r12+650h], rax INITKDBG:000000014023930B xor eax, eax INITKDBG:000000014023930D mov [r12+658h], rax INITKDBG:0000000140239315 mov qword ptr [r12+660h], 101h INITKDBG:0000000140239321 mov [r12+668h], rdx INITKDBG:0000000140239329 mov [r12+648h], r13d 1804 //演算法 loc_1402DC311: ; CODE XREF: INITKDBG:00000001402DC325j INITKDBG:00000001402DC311 xor r8, [r9] INITKDBG:00000001402DC314 mov ecx, r11d INITKDBG:00000001402DC317 rol r8, cl INITKDBG:00000001402DC31A add r9, 8 INITKDBG:00000001402DC31E add r10d, 0FFFFFFF8h INITKDBG:00000001402DC322 sub rdx, rsi INITKDBG:00000001402DC325 jnz short loc_1402DC311 INITKDBG:00000001402DC327 INITKDBG:00000001402DC327 loc_1402DC327: ; CODE XREF: INITKDBG:00000001402DC308j INITKDBG:00000001402DC327 test r10d, r10d INITKDBG:00000001402DC32A jz short loc_1402DC342 INITKDBG:00000001402DC32C INITKDBG:00000001402DC32C loc_1402DC32C: ; CODE XREF: INITKDBG:00000001402DC340j INITKDBG:00000001402DC32C movzx eax, byte ptr [r9] INITKDBG:00000001402DC330 mov ecx, r11d INITKDBG:00000001402DC333 xor r8, rax INITKDBG:00000001402DC336 add r9, rsi INITKDBG:00000001402DC339 rol r8, cl INITKDBG:00000001402DC33C add r10d, 0FFFFFFFFh INITKDBG:00000001402DC340 jnz short loc_1402DC32C INITKDBG:00000001402DC342 INITKDBG:00000001402DC342 loc_1402DC342: ; CODE XREF: INITKDBG:00000001402DC32Aj INITKDBG:00000001402DC342 mov [r12+658h], r14 INITKDBG:00000001402DC34A lea rcx, [rbp+0AB0h] INITKDBG:00000001402DC351 mov edx, r13d INITKDBG:00000001402DC354 mov r9, r15 INITKDBG:00000001402DC357 mov r11d, 0FFFFFFF8h // cmp [r12+658h], r8 ; //658是否是pg的sign 這個位置 從pg 剛剛解密 還未執行時 就和現在是一樣的 INITKDBG:00000001402DC38E jz loc_1402DC414 ; //正常流程肯定會跳下去 INITKDBG:00000001402DC394 mov rax, [r12+588h] ; //TriageImagePageSize INITKDBG:00000001402DC39C mov ecx, [r12+684h] ; //這個00070989 不知道是什麼 INITKDBG:00000001402DC3A4 mov [rax], r12 INITKDBG:00000001402DC3A7 mov [rax+10h], ecx INITKDBG:00000001402DC3AA mov eax, [r12+790h] ; //這裡是0 INITKDBG:00000001402DC3B2 mov rcx, [r12+658h] ; //或許是sign INITKDBG:00000001402DC3BA test eax, eax INITKDBG:00000001402DC3BC jnz short loc_1402DC414 INITKDBG:00000001402DC3BE mov rax, [r12+588h] INITKDBG:00000001402DC3C6 xor rcx, r8 INITKDBG:00000001402DC3C9 mov [rax+18h], rcx ; //不知所謂 INITKDBG:00000001402DC3CD mov eax, [r12+790h] INITKDBG:00000001402DC3D5 test eax, eax INITKDBG:00000001402DC3D7 jnz short loc_1402DC414 INITKDBG:00000001402DC3D9 mov rax, 0A3A03F5891C8B4E8h INITKDBG:00000001402DC3E3 add rax, r12 INITKDBG:00000001402DC3E6 mov [r12+798h], rax ; //藍屏引數 INITKDBG:00000001402DC3EE xor eax, eax INITKDBG:00000001402DC3F0 mov [r12+7A0h], rax ; //清空低4byte 藍屏程式碼 INITKDBG:00000001402DC3F8 mov qword ptr [r12+7A8h], 101h ; //藍屏程式碼 INITKDBG:00000001402DC404 mov [r12+7B0h], r8 ; //效驗和 INITKDBG:00000001402DC40C mov [r12+790h], esi ; //esi為1 INITKDBG:00000001402DC414 第三處: 14393 懶得找了 1804 mov [r12+0C4h], esi INITKDBG:00000001402DC970 cmp [r12+8B8h], r8 INITKDBG:00000001402DC978 jz ExEcOtherSafeCall ; //正常直接 的話 必然相等然後走 INITKDBG:00000001402DC97E mov rax, [r12+588h] INITKDBG:00000001402DC986 mov ecx, [r12+684h] INITKDBG:00000001402DC98E mov [rax], r12 INITKDBG:00000001402DC991 mov [rax+10h], ecx INITKDBG:00000001402DC994 mov eax, [r12+790h] INITKDBG:00000001402DC99C mov rdx, [r12+8B8h] INITKDBG:00000001402DC9A4 test eax, eax INITKDBG:00000001402DC9A6 jnz short ExEcOtherSafeCall ; //這裡的eax 如果不是0啊 出去就藍屏了 各種奇怪的錯誤 INITKDBG:00000001402DC9A8 mov rax, [r12+588h] INITKDBG:00000001402DC9B0 mov rcx, r8 INITKDBG:00000001402DC9B3 xor rcx, rdx INITKDBG:00000001402DC9B6 mov [rax+18h], rcx INITKDBG:00000001402DC9BA mov eax, [r12+790h] INITKDBG:00000001402DC9C2 test eax, eax INITKDBG:00000001402DC9C4 jnz short ExEcOtherSafeCall ; //這裡的eax 如果不是0啊 出去就藍屏了 各種奇怪的錯誤 INITKDBG:00000001402DC9C6 mov rax, 0A3A03F5891C8B4E8h INITKDBG:00000001402DC9D0 add rax, r12 INITKDBG:00000001402DC9D3 mov [r12+798h], rax INITKDBG:00000001402DC9DB xor eax, eax INITKDBG:00000001402DC9DD mov [r12+7A0h], rax INITKDBG:00000001402DC9E5 mov qword ptr [r12+7A8h], 109h INITKDBG:00000001402DC9F1 mov [r12+7B0h], r8 INITKDBG:00000001402DC9F9 mov [r12+790h], r14d INITKDBG:00000001402DCA01 jmp short loc_1402DCA05 ; //判斷 這一處 如果要修改藍屏程式碼 必須也給Nop點 下面的eax必須為0 ExEcOtherSafeCall: ; CODE XREF: INITKDBG:00000001402DC978j INITKDBG:00000001402DCA03 ; INITKDBG:00000001402DC9A6j ... INITKDBG:00000001402DCA03 xor eax, eax ; //這裡的eax 如果不是0啊 出去就藍屏了 各種奇怪的錯誤 INITKDBG:00000001402DCA05
待更新研究.....
struct _PatchGuard_Context_15063{ UCHAR CmpAppendDllSection[0xE8];//other Pg version dynamic ULONG64 ExAcquireResourceSharedLite: ULONG64 ExAcquireResourceExclusiveLite; ULONG64 ExAllocatePoolWithTag; ULONG64 ExFreePool; ULONG64 ExMapHandleToPointer; ULONG64 ExQueueWorkItem; ULONG64 ExReleaseResourceLite; ULONG64 ExUnlockHandleTableEntry; ULONG64 ExAcquirePushLockExclusiveEx; ULONG64 ExReleasePushLockExclusiveEx; ULONG64 ExAcquirePushLockSharedEx; ULONG64 ExReleasePushLockSharedEx; ULONG64 KeAcquireInStackQueuedSpinLockAtDpcLevel; ULONG64 ExAcquireSpinLockSharedAtDpcLevel; ULONG64 KeBugCheckEx; ULONG64 KeDelayExecutionThread; ULONG64 KeEnterCriticalRegionThread; ULONG64 KeLeaveCriticalRegion; ULONG64 KeEnterGuardedRegion; ULONG64 KeLeaveGuardedRegion; ULONG64 KeReleaseInStackQueuedSpinLockFromDpcLevel; ULONG64 ExReleaseSpinLockSharedFromDpcLevel; ULONG64 KeRevertToUserGroupAffinityThread; ULONG64 KeProcessorGroupAffinity; ULONG64 KeInitializeEnumerationContext; ULONG64 KeEnumerateNextProcessor; ULONG64 KeCountSetBitsAffinityEx; ULONG64 KeQueryAffinityProcess; ULONG64 KeQueryAffinityThread; ULONG64 KeSetSystemGroupAffinityThread; ULONG64 KeSetCoalescableTimer; ULONG64 ObfDereferenceObject; ULONG64 ObReferenceObjectByName; ULONG64 RtlImageDirectoryEntryToData; ULONG64 RtlImageNtHeader; ULONG64 RtlLookupFunctionTable; ULONG64 RtlPcToFileHeader; ULONG64 RtlSectionTableFromVirtualAddress; ULONG64 DbgPrint; ULONG64 MmAllocateIndependentPages; ULONG64 MmFreeIndependentPages; ULONG64 MmSetPageProtection; ULONG64 Unknow1; ULONG64 Unknow2; ULONG64 Unknow3; ULONG64 Unknow4; ULONG64 RtlLookupFunctionEntry; ULONG64 KeAcquireSpinLockRaiseToDpc; ULONG64 KeReleaseSpinLock; ULONG64 MmGetSessionById; ULONG64 MmGetNextSession; ULONG64 MmQuitNextSession; ULONG64 MmAttachSession; ULONG64 MmDetachSession; ULONG64 MmGetSessionIdEx; ULONG64 MmIsSessionAddress; ULONG64 MmIsAddressValid; ULONG64 MmSessionGetWin32Callouts; ULONG64 KeInsertQueueApc; ULONG64 KeWaitForSingleObject; ULONG64 Unknow5; ULONG64 ExReferenceCallBackBlock; ULONG64 ExGetCallBackBlockRoutine; ULONG64 ExDereferenceCallBackBlock; ULONG64 KiMarkBugCheckRegions; ULONG64 PspEnumerateCallback; ULONG64 CmpEnumerateCallback; ULONG64 DbgEnumerateCallback; ULONG64 ExpEnumerateCallback; ULONG64 ExpGetNextCallback; ULONG64 EmpCheckErrataList; ULONG64 KiSchedulerApcTerminate; ULONG64 KiSchedulerApc; ULONG64 EmpCheckErrataList; ULONG64 KiSwInterruptDispatch; ULONG64 MmAllocatePagesForMdlEx; ULONG64 MmAllocateMappingAddress; ULONG64 MmMapLockedPagesWithReservedMapping; ULONG64 MmUnmapReservedMapping; ULONG64 KiSwInterruptDispatch+0x12a0; ULONG64 KiSwInterruptDispatch+0x1310; ULONG64 MmAcquireLoadLock; ULONG64 MmReleaseLoadLock; ULONG64 KeEnumerateQueueApc; ULONG64 KeIsApcRunningThread; ULONG64 KiSwInterruptDispatch+0xe70; ULONG64 PsAcquireProcessExitSynchronization; ULONG64 ObDereferenceProcessHandleTable ULONG64 PsGetNextProcess; ULONG64 PsQuitNextProcess; ULONG64 MmIsSessionLeaderProcess; ULONG64 PsInvokeWin32Callout; ULONG64 MmEnumerateAddressSpaceAndReferenceImages; ULONG64 PsGetProcessProtection; ULONG64 PsGetProcessSignatureLevel; ULONG64 PsGetProcessSectionBaseAddress; ULONG64 SeCompareSigningLevels; ULONG64 KeComputeSha256; ULONG64 KeComputeParallelSha256; ULONG64 KeSetEvent; ULONG64 RtlpConvertFunctionEntry; ULONG64 RtlpLookupPrimaryFunctionEntry; ULONG64 RtlIsMultiSessionSku; ULONG64 KiEnumerateCallback; ULONG64 KeStackAttachProcess; ULONG64 KeUnstackDetachProcess; ULONG64 VslVerifyPage; ULONG64 KiGetInterruptObjectAddress; ULONG64 Unknow6; ULONG64 Unknow7; ULONG64 Unknow8; ULONG64 Unknow9; ULONG64 Unknow10; ULONG64 Unknow11; ULONG64 KiEntropyTimingRoutine; ULONG64 KiProcessListHead; ULONG64 KiProcessListLock; ULONG64 Unknow12;//(pG Encrypt?) ULONG64 Unknow13;//(pG Encrypt?) ULONG64 PsActiveProcessHead; ULONG64 PsInvertedFunctionTable; ULONG64 PsLoadedModuleList; ULONG64 PsLoadedModuleResource; ULONG64 PsLoadedModuleSpinLock; ULONG64 PspActiveProcessLock; ULONG64 PspCidTable; ULONG64 ExpUuidLock; ULONG64 AlpcpPortListLock; ULONG64 KeServiceDescriptorTable; ULONG64 KeServiceDescriptorTableShadow; ULONG64 KeServiceDescriptorTableFilter; ULONG64 VfThunksExtended; ULONG64 PsWin32CallBack; ULONG64 TriageImagePageSize; ULONG64 KiTableInformation; ULONG64 HandleTableListHead; ULONG64 SeNullSid; ULONG64 Unknow14; ULONG64 Unknow15;//(fffff780`00000000) ULONG64 Unknow16;//(a9ad6402`bae5207b) ULONG64 SeProtectedMapping; ULONG64 $$0;//???? ULONG64 KiStackProtectNotifyEvent; ULONG64 Unknow17;//??fffff900`00000000 ULONG64 RtlpInvertedFunctionTable; ULONG64 KiIsrThunk; ULONG64 Unknow17; ULONG64 Unknow18; ULONG64 Unknow19; ULONG64 Unknow20; ULONG64 Unknow21; ULONG64 Unknow22; ULONG64 PatchGuard_PgContext;//+0x8B8 KeDebugCheck ULONG64 PatchGuard_CmpAppendDllSecitonSign_Self;//+0x7B0 KeDebugCheck }
原文作者:落筆飛花
原文連結:[原創]PatchGuard自效驗粗略分析-『程式設計技術』-看雪安全論壇
轉載請註明:轉自看雪論壇
看雪閱讀推薦:
1、[原創]《0day安全...(第二版)》第3章第4節開發通用的shellcode在win10系統下測試的問題
2、[原創]一個拼湊起來的CVE-2018-8373的EXP
3、[原創]Xposed________監聽微信登入帳號和密碼
4、[原創]對照Java原始碼學習smali語法,根據smali程式碼反推java程式碼
相關文章
- js 實現 FCS效驗2021-11-09JS
- Spring框架增強-全域性異常處理機制-根據目錄結構自動生成路由字首-引數效驗機制以及自定義效驗2020-12-23Spring框架路由
- 爭位行為在網路遊戲體驗和運營中的效應分析2023-10-17遊戲
- Android開發 - “效驗和”效驗資料在傳輸或儲存過程中是否出錯解析2024-08-28Android儲存過程
- ios+appium 自動化 click 無效2020-07-06iOSAPP
- 使用metabase做分析報表工具分析整體策略績效2022-10-27
- 用動效建立的可用性:動效中的使用者體驗宣言2019-02-21
- Android Studio 設定自動清除無效 import2018-04-24AndroidImport
- Vue與React兩個框架的粗略區別對比2018-12-18VueReact框架
- 入門計算機的粗略學習-Day112020-11-04計算機
- 如何粗略估算一款國產遊戲的銷量?2019-05-08遊戲
- 筆記-資料結構之 Hash(OC的粗略實現)2019-01-29筆記資料結構
- [粗略的速通]BURP靶場API testing通關記錄2024-06-15API
- 什麼是CSRF跨站請求偽造?(from表單效驗csrf-ajdax效驗csrf-Ajax設定csrf-CBV裝飾器驗證csrf)2022-03-20
- 絢麗風車loading動效分析與實現!2019-03-02
- 實驗二-需求分析2024-04-23
- 實驗二:需求分析2024-04-23
- 實驗2:需求分析2024-04-23
- eslint 效驗 switch case語句縮排警告提示處理2020-12-11EsLint
- RPA機器人流程自動化的燈塔效應2020-06-24機器人
- 8個最佳動效網頁設計,告別枯燥體驗!2018-10-24網頁
- IBM:人工智慧之客戶體驗實效(附下載)2018-10-31IBM人工智慧
- 高價效比BlueHost SSD VPS雲主機體驗評測2019-10-16
- 電源紋波偏高導致產品不斷自動重啟經驗案例分析2020-09-25
- 百億級日誌流分析實踐 | 剖析個推後效分析功能實現原理2021-09-23
- Android setVisibility(View.GONE)無效的問題及原因分析2020-04-05AndroidViewGo
- 如何有效實施潛在失效模式與效應分析(FMEA)?2022-06-15模式
- 14 點自動化經驗2024-08-09
- 為信任而生,因信任而存在:摩點遊戲眾籌粗略觀察2019-09-17遊戲
- iview Form 表單校驗時,必傳符號錯位,校驗無效的某個原因2020-09-26ViewORM符號
- springboot 自動配置案例分析2024-07-05Spring Boot
- 極驗滑塊,點選分析2024-08-03
- DPTP實驗部分原始碼分析2020-11-26原始碼
- 日期格式化時註解@DateTimeFormat無效的問題分析2021-05-15ORM
- 自編函式做t檢驗2020-11-11函式
- 深圳量化對沖自動交易系統價效比高開發公司2019-09-26
- Forrester:如何衡量與展示客戶體驗轉型績效(附下載)2022-07-18REST
- 【驗證碼逆向專欄】某多多驗證碼逆向分析2024-11-29