pal家族 发表于 2026-6-19 22:34
We are conducting further research into the behavioral detection of this malware. We will contact yo ...
屏幕截图的函数:
- int *__fastcall sub_407C90(int *a1, int *a2, unsigned int *a3)
- {
- HWND DesktopWindow; // eax
- HDC DC; // esi
- double v5; // st7
- unsigned int v6; // ebx
- unsigned int *v7; // eax
- unsigned int *v8; // esi
- int *v10; // eax
- unsigned int *v11; // ecx
- int v12; // [esp-8h] [ebp-84h]
- int v13; // [esp+Ch] [ebp-70h]
- int v14; // [esp+10h] [ebp-6Ch]
- int ySrc; // [esp+18h] [ebp-64h]
- _BYTE v17[12]; // [esp+1Ch] [ebp-60h] BYREF
- int xSrc; // [esp+30h] [ebp-4Ch]
- int *v19; // [esp+34h] [ebp-48h]
- HDC hdc; // [esp+38h] [ebp-44h]
- HBITMAP hbm; // [esp+3Ch] [ebp-40h]
- HDC hdcDest; // [esp+40h] [ebp-3Ch]
- LPVOID lpvBits; // [esp+44h] [ebp-38h]
- tagBITMAPINFO bmi; // [esp+4Ch] [ebp-30h] BYREF
- v19 = a2;
- DesktopWindow = GetDesktopWindow();
- hdc = GetDC(DesktopWindow);
- hdcDest = CreateCompatibleDC(hdc);
- DC = GetDC(0);
- hbm = (HBITMAP)GetDeviceCaps(DC, 8);
- *(float *)&lpvBits = (double)GetDeviceCaps(DC, 118) / (double)(int)hbm;
- ReleaseDC(0, DC);
- v14 = (int)((double)GetSystemMetrics(78) * *(float *)&lpvBits);
- v13 = (int)((double)GetSystemMetrics(79) * *(float *)&lpvBits);
- xSrc = (int)((double)GetSystemMetrics(76) * *(float *)&lpvBits);
- ySrc = (int)((double)GetSystemMetrics(77) * *(float *)&lpvBits);
- hbm = CreateCompatibleBitmap(hdc, v14, v13);
- SelectObject(hdcDest, hbm);
- SetStretchBltMode(hdcDest, 3);
- v12 = (int)((double)GetSystemMetrics(79) * *(float *)&lpvBits);
- v5 = (double)GetSystemMetrics(78) * *(float *)&lpvBits;
- StretchBlt(hdcDest, 0, 0, v14, v13, hdc, xSrc, ySrc, (int)v5, v12, 0xCC0020u);
- bmi.bmiHeader.biWidth = v14;
- v6 = 4 * v13 * ((32 * v14 + 31) / 32);
- memset(&bmi.bmiHeader.biCompression, 0, 24);
- bmi.bmiHeader.biSize = 40;
- bmi.bmiHeader.biHeight = v13;
- *(_DWORD *)&bmi.bmiHeader.biPlanes = 2097153;
- *(_QWORD *)&v17[2] = v6 + 54;
- *(_WORD *)v17 = 19778;
- strcpy(&v17[10], "6");
- *(float *)&lpvBits = COERCE_FLOAT(operator new[](v6));
- memset(lpvBits, 0, v6);
- GetDIBits(hdcDest, hbm, 0, v13, lpvBits, &bmi, 0);
- xSrc = (int)operator new[](v6 + 54);
- memset((void *)xSrc, 0, v6 + 54);
- *(_DWORD *)xSrc = *(_DWORD *)v17;
- *(_QWORD *)(xSrc + 4) = *(_QWORD *)&v17[4];
- *(_WORD *)(xSrc + 12) = 0;
- qmemcpy((void *)(xSrc + 14), &bmi, 0x28u);
- memcpy_0((void *)(xSrc + 54), lpvBits, v6);
- v7 = (unsigned int *)operator new(0x1Cu);
- v8 = 0;
- if ( v7 )
- {
- v7[4] = 0;
- v7[5] = 15;
- *(_BYTE *)v7 = 0;
- v8 = v7;
- }
- if ( sub_407A80(xSrc) )
- {
- *a3 = v8[4];
- *a1 = v14;
- *v19 = v13;
- v10 = (int *)operator new[](*a3);
- v19 = v10;
- if ( v8[5] < 0x10 )
- v11 = v8;
- else
- v11 = (unsigned int *)*v8;
- memcpy_0(v10, v11, *a3);
- DeleteObject(hbm);
- DeleteObject(hdcDest);
- ReleaseDC(0, hdc);
- operator delete[]((void *)xSrc);
- if ( *(float *)&lpvBits != 0.0 )
- operator delete[](lpvBits);
- if ( v8[5] >= 0x10 )
- operator delete((void *)*v8);
- v8[5] = 15;
- v8[4] = 0;
- *(_BYTE *)v8 = 0;
- operator delete(v8);
- return v19;
- }
- else
- {
- DeleteObject(hbm);
- DeleteObject(hdcDest);
- ReleaseDC(0, hdc);
- operator delete[]((void *)xSrc);
- if ( *(float *)&lpvBits != 0.0 )
- operator delete[](lpvBits);
- if ( v8 )
- {
- if ( v8[5] >= 0x10 )
- operator delete((void *)*v8);
- v8[5] = 15;
- v8[4] = 0;
- *(_BYTE *)v8 = 0;
- operator delete(v8);
- }
- return 0;
- }
- }
复制代码
调用Windows GDI截的图 |