• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Детальный обзор одного крипт сервиса.

TrueMind

RAM
Пользователь
Регистрация
06.10.2013
Сообщения
124
Реакции
1
Детальный обзор одного крипт сервиса.

Крипт сервисов в последние время стало ну ооочень много, некоторые из них откровенное *Гуан, некоторые весьма интересны и неординарны в использовании техник сокрытия, обхода эмуляторов, обфускации и т.д. Чтож, давайте посмотрим, что нам может предложить новый сервис ТСа.

Картинки имеют свойство удаляться с файловых хостингов, в связи с этим заливаю их архивом:
http://www.sendspace.com/file/wpd4lw
psw: xss.pro/

ТС прислал 3 криптованных семпла, собстенно цитирую:
Здравствуйте! Высылаю 3 криптованных калькулятора. Хочу сказать сразу - ехе не чист, присутствуют детекты, именно по этой причине я создал тему о предварительном наборе клиентов, т.к. в данный момент наши программисты работают над отладкой и чисткой. Как работы по криптеру будут завершены, будет начата работа с клиентами.
5319325.png

Одинаковый размер у всех трех файлов, подумал я, весьма странно.
К тому же стало интересно, что же это за файлы ТС залил в комплекте (._calc_1.exe етц).
5370524.png

Видимо это файлы аттрибутов для файлов под мак ось, я не сторонник мака, так что хз.

Чтож, всё это мелочи, полезли внутрь...
Общие сведенья о PE файле:

Код:
; Input MD5   : 22EA76FEAF0FDC5C3BBDF7F073C8D60C
; Input CRC32 : 5884E112

; File Name   : calc_2.exe
; Format      : Portable executable for 80386 (PE)
; Imagebase   : 400000
; Section 1. (virtual address 00001000)
; Virtual size                  : 000111D4 (  70100.)
; Section size in file          : 00011200 (  70144.)
; Offset to raw data for section: 00000400
; Flags 60000020: Text Executable Readable
; Alignment     : default
; OS type         :  MS Windows
; Application type:  Executable 32bit

PE снифер говорит нам, что это: (E8) Microsoft Visual C++ 9.0 - Visual Studio 2008, ладно.
PE заголовки в порядке.
Присутствует runtime код.
В файлах так же присутствуют дебаг символы)

Что на счет энтропии?
А вот что: Файл 1:
7GtWU5dP.jpg

O26NV26T.jpg

Файл 2:
QVRuS4fk.jpg


Секции:
tKK3ediC.jpg

Секции стандартного студийного компилера.

Рерурсы:
ovs3Xqe7.jpg

Как мы можем видеть, во всех файлах присутствует одинаковое колличество ресурсов.
Ресурсы диалогов #100:
ePWm0u2H.jpg

ePWm0u2H.jpg

SZ4mTZUV.jpg

Я тащусь от этой рандомизации:)
PKPXGsEq.jpg

PKPXGsEq.jpg

qG6vOeQW.jpg

Тут благо немного получше. Контролы выглядят по крайней мере рандомными.
Почему статично только 2 диалога во всех трех файлах мне осталось не ясно.
Ресурсы Strings:
Код:
101	&About NQUEdn...
Код:
101	&About CEcuqb...
Код:
101	&About pFjZGpOI...
VersionInfo:
QzhvBOHv.jpg

dr3t4GGG.jpg

QzhvBOHv.jpg

Что за TO DO: <...> мне так же не ясно...
FileType: DLL ? (РукаЛицо)

Манифест стандартный из под студии.

Код:
сэмпл 1: (Мэйн хекс рейз походу разобрал криво...)
Код:
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd);

//----- (00401507) --------------------------------------------------------
signed int __usercall sub_401507<eax>(int a1<ecx>, int a2<ebx>)
{
  __asm { lahf }
  loc_40B3E7((a1 + 13090743) & 0xC6405C08, dword_408D13, a2 & 0xC7477D);
  return 13068065;
}
// 408D13: using guessed type int dword_408D13;

//----- (0040163B) --------------------------------------------------------
int __cdecl sub_40163B()
{
  sub_404C8F(0, -402653184);
  return dword_40CF2C;
}
// 4010C6: using guessed type int dword_4010C6;
// 40CF2C: using guessed type int dword_40CF2C;

//----- (00401792) --------------------------------------------------------
signed __int64 __cdecl sub_401792()
{
  int v1; // edx@1

  __asm { lahf }
  v1 = *(int *)((char *)&dword_4010C6 + 1);
  loc_409F7E(dword_401CE1, v1 & 0xC74721, (dword_40C100 & 0x10844300) + 199, dword_40C100 & 0xD0846300);
  return 5784751804415738055i64;
}
// 4010C6: using guessed type int dword_4010C6;
// 401CE1: using guessed type int dword_401CE1;
// 40C100: using guessed type int dword_40C100;

//----- (00401913) --------------------------------------------------------
signed int __cdecl sub_401913()
{
  _AL = 0;
  __asm
  {
    lahf
    daa
  }
  ((void (__thiscall *)(signed int))dword_401C6D)(193);
  return 13067273;
}
// 401C6D: using guessed type int dword_401C6D;

//----- (00401A98) --------------------------------------------------------
unsigned __int64 __cdecl sub_401A98()
{
  unsigned int v7; // edx@1

  __asm { das }
  _CF = 0;
  _OF = 0;
  _ZF = 0;
  _SF = 0;
  __asm
  {
    lahf
    pushf
  }
  sub_406E16();
  return __PAIR__(v7, 199) + 4294967296i64;
}
// 4010C6: using guessed type int dword_4010C6;

//----- (00401FF2) --------------------------------------------------------
signed int __fastcall sub_401FF2(int a1, int a2)
{
  __asm
  {
    lahf
    lahf
    lahf
  }
  _AL = *(_BYTE *)WinMain + 1;
  __asm { daa }
  loc_407ED1(
    dword_40E700 & 0x73B475DB,
    49793,
    (unsigned __int8)(*(_BYTE *)WinMain & 0xC4) + 1130655594,
    *(_DWORD *)WinMain,
    a2);
  return -952930975;
}
// 4010C6: using guessed type int dword_4010C6;
// 40E700: using guessed type int dword_40E700;
сэмпл 3:
Код:
//----- (00401000) --------------------------------------------------------
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
  int v4; // eax@1
  int result; // eax@3

  v4 = dword_40F7D2;
  do
    v4 += 704619264;
  while ( !(v4 & 0x5900) );
  UnregisterClassA((LPCSTR)0xF43, 0);
  result = GetLastError() + 3907;
  if ( result == 5318 )
  {
    __asm
    {
      bsf     ecx, eax
      bsr     ebx, ecx
    }
    result = loc_40A58A(_ECX + 1669017712, dword_40C0DA);
  }
  return result;
}
// 401000: inconsistent function type and number of purged bytes
// 40C0DA: using guessed type int dword_40C0DA;
// 40F7D2: using guessed type int dword_40F7D2;

//----- (00401197) --------------------------------------------------------
signed __int64 __cdecl sub_401197()
{
  GetCommandLineA();
  GetCommandLineA();
  GetCommandLineA();
  GetCommandLineA();
  sub_402106(911868094);
  return 6870362844659698074i64;
}
// 4084B1: using guessed type int dword_4084B1;
// 40C0B2: using guessed type int dword_40C0B2;
// 40CDFF: using guessed type int dword_40CDFF;

//----- (004014E0) --------------------------------------------------------
int __fastcall sub_4014E0(int a1, int a2)
{
  return loc_40B67F(0, a2 + 1863229588 - dword_409DF3 - 2054750208, *(_DWORD *)WinMain);
}
// 409DF3: using guessed type int dword_409DF3;

//----- (00401697) --------------------------------------------------------
int __cdecl sub_401697()
{
  return loc_409353(dword_40F837 + 1298189679, 1961662519);
}
// 4010B9: using guessed type int __cdecl loc_4010B9(int hInstance, int hPrevInstance, int lpCmdLine, int nShowCmd);
// 40F837: using guessed type int dword_40F837;

//----- (004017F7) --------------------------------------------------------
int __cdecl sub_4017F7()
{
  return dword_408537 & loc_40B9BE(1464940494);
}
// 4010B9: using guessed type int __cdecl loc_4010B9(int hInstance, int hPrevInstance, int lpCmdLine, int nShowCmd);
// 408537: using guessed type int dword_408537;

//----- (0040193A) --------------------------------------------------------
int __cdecl sub_40193A()
{
  int result; // eax@2

  if ( dword_421C70 == -1957299846 )
    result = 302994629;
  else
    result = loc_40A739(-329026324, dword_40BF5C & 0xBE);
  return result;
}
сэмпл 2:
Код:
//----- (00401000) --------------------------------------------------------
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
  int v4; // eax@0
  int result; // eax@2

  do
    v4 += 704619264;
  while ( !(v4 & 0x5900) );
  UnregisterClassA((LPCSTR)0xA92, 0);
  result = GetLastError() + 2706;
  if ( result == 4117 )
  {
    _EAX = 4272184;
    dword_421C70 = (int)((char *)GetProcAddress - 4065);
    __asm { lahf }
    result = loc_4065DB(2147483647, (unsigned __int64)(64429i64 * _EAX) >> 32);
  }
  return result;
}
// 401000: inconsistent function type and number of purged bytes
// 40C152: using guessed type int loc_40C152();
// 421C70: using guessed type int dword_421C70;

//----- (004011FF) --------------------------------------------------------
int __cdecl sub_4011FF()
{
  __int16 v2; // cx@1
  int (__thiscall *v3)(_DWORD); // edx@1

  GetCommandLineA();
  GetCommandLineA();
  GetCommandLineA();
  _AL = 0;
  __asm { das }
  sub_4038A2();
  return v3(v2 & 0xFBB2);
}
// 4010F7: using guessed type int __cdecl loc_4010F7(int hInstance, int hPrevInstance, int lpCmdLine, int nShowCmd);

Как мы можем видеть, активно используются флаги:
Код:
_CF = 0;
  _OF = 0;
  _ZF = 0;
  _SF = 0;

А так же инлайновые вставки кода ассемблера:
Код:
__asm
  {
    lahf
    daa
  }

__asm
    {
      bsf     ecx, eax
      bsr     ebx, ecx
    }

 __asm
  {
    lahf
    lahf
    lahf
  }

  __asm { das }
Опкоды как вы видите не слишком характерны студийному компилеру. Вероятно призваны остановить эмуляторы некоторых АВ продуктов.

Антиэмуляция с помощью GetLastError:
Код:
UnregisterClassA((LPCSTR)0xA92, 0);
  result = GetLastError() + 2706;
  if ( result == 4117 )
  {
    _EAX = 4272184;
    dword_421C70 = (int)((char *)GetProcAddress - 4065);
    __asm { lahf }
    result = loc_4065DB(2147483647, (unsigned __int64)(64429i64 * _EAX) >> 32);
  }

Рандомные апи:
Код:
GetCommandLineA();
  GetCommandLineA();
  GetCommandLineA();
Если их так можно назвать.

И так, судя по коду можно сделать вывод что код не статичный (если стабы собирали не вручную), хоть и генератор кода находится в зачаточном состоянии и использует опкоды и комбинации кода не характерные стандартному компилеру, что не может не отразиться на увеличении баллов у эвристика АВ.

Добавлено в [time]1399118502[/time]

Добавлено в [time]1399118878[/time]
 
А давай-ка диффнем, подумал я:)
lXIQdFeW.jpg


Primary Unmatched Functions:
Код:
00401792	sub_401792	Normal	1	0	85	1	1
00401913	sub_401913	Normal	1	0	80	0	0
004021C7	sub_4021C7	Normal	3	3	91	1	1
00404757	sub_404757	Normal	1	0	103	0	1
00404B04	sub_404B04	Normal	1	0	87	0	1
00407A6B	sub_407A6B	Normal	1	0	22	1	0
00409326	sub_409326	Normal	3	3	84	0	1
00409F7E	sub_409F7E	Normal	3	3	27	1	0
0040B714	sub_40B714	Normal	1	0	71	1	1
0040F260	sub_40F260	Normal	34	54	143	1	0
0040F91A	___sbh_free_block	Normal	35	50	167	1	0
0040C582	?__CxxUnhandledExceptionFilter@@YGJPAU_EXCEPTION_POINTERS@@@Z	Library	8	12	22	0	1
0040C677	__unlockexit	Library	1	0	4	1	1
0040C680	__initterm	Library	6	7	16	2	0
0040E0A8	__onexit	Library	1	0	11	0	4
0040E0DE	$LN7_0	Library	1	0	5	1	2
0040E810	main_loop	Library	10	11	34	0	0
0040F2E4	sub_40F2E4	Library	13	19	51	0	0
0040F424	sub_40F424	Library	12	19	56	0	0
0040F70E	___addlocaleref	Library	17	25	58	0	1
00410496	__seh_longjmp_unwind4@4	Library	1	0	10	0	1
004106B5	toend	Library	1	0	2	0	0
00411378	sub_411378	Library	7	9	45	0	1
00411770	sub_411770	Library	45	70	246	0	2

Импорт:
Файл 1:
Код:
SendMessageA,x,-,-,.rdata:0x00020598,user32.dll
CallWindowProcA,x,-,-,.rdata:0x000204FE,user32.dll
GetCommandLineA,x,-,-,.rdata:0x000205DE,kernel32.dll
GetStartupInfoA,x,-,-,.rdata:0x000205F0,kernel32.dll
SetUnhandledExceptionFilter,x,-,-,.rdata:0x00020602,kernel32.dll
GetModuleHandleW,x,-,-,.rdata:0x00020620,kernel32.dll
Sleep,x,-,-,.rdata:0x00020634,kernel32.dll
GetProcAddress,x,-,-,.rdata:0x0002063C,kernel32.dll
ExitProcess,x,-,-,.rdata:0x0002064E,kernel32.dll
WriteFile,x,-,-,.rdata:0x0002065C,kernel32.dll
GetModuleFileNameA,x,-,-,.rdata:0x00020678,kernel32.dll
GetEnvironmentStrings,x,-,-,.rdata:0x000206A8,kernel32.dll
GetEnvironmentStringsW,x,-,-,.rdata:0x00020700,kernel32.dll
GetFileType,x,-,-,.rdata:0x0002072C,kernel32.dll
TlsGetValue,x,-,-,.rdata:0x00020752,kernel32.dll
TlsSetValue,x,-,-,.rdata:0x0002076C,kernel32.dll
SetLastError,x,-,-,.rdata:0x0002079C,kernel32.dll
GetCurrentThreadId,x,-,-,.rdata:0x000207AC,kernel32.dll
HeapCreate,x,-,-,.rdata:0x000207DA,kernel32.dll
VirtualFree,x,-,-,.rdata:0x000207E8,kernel32.dll
QueryPerformanceCounter,x,-,-,.rdata:0x00020802,kernel32.dll
GetTickCount,x,-,x,.rdata:0x0002081C,kernel32.dll
GetCurrentProcessId,x,-,-,.rdata:0x0002082C,kernel32.dll
TerminateProcess,x,-,x,.rdata:0x0002088C,kernel32.dll
GetCurrentProcess,x,-,-,.rdata:0x000208A0,kernel32.dll
UnhandledExceptionFilter,x,-,x,.rdata:0x000208B4,kernel32.dll
IsDebuggerPresent,x,-,x,.rdata:0x000208D0,kernel32.dll
LoadLibraryA,x,-,-,.rdata:0x000208E4,kernel32.dll
VirtualAlloc,x,-,-,.rdata:0x0002095C,kernel32.dll
ReleaseDC,-,-,-,.rdata:0x000205B0,user32.dll
GetDC,-,-,-,.rdata:0x000205A8,user32.dll
UnregisterClassA,-,-,-,.rdata:0x00020584,user32.dll
GetClientRect,-,-,-,.rdata:0x00020574,user32.dll
PtInRect,-,-,-,.rdata:0x00020568,user32.dll
ScreenToClient,-,-,-,.rdata:0x00020556,user32.dll
GetCursorPos,-,-,-,.rdata:0x00020546,user32.dll
DefWindowProcA,-,-,-,.rdata:0x00020534,user32.dll
SetWindowLongA,-,-,-,.rdata:0x00020522,user32.dll
GetWindowLongA,-,-,-,.rdata:0x00020510,user32.dll
DispatchMessageA,-,-,-,.rdata:0x000204EA,user32.dll
TranslateMessage,-,-,-,.rdata:0x000204D6,user32.dll
BeginPaint,-,-,-,.rdata:0x000204C8,user32.dll
GetMessageA,-,-,-,.rdata:0x000204BA,user32.dll
MessageBoxA,-,-,-,.rdata:0x000204AC,user32.dll
SetBkMode,-,-,-,.rdata:0x000205C8,gdi32.dll
GetStringTypeW,-,-,-,.rdata:0x000209EC,kernel32.dll
GetStringTypeA,-,-,-,.rdata:0x000209DA,kernel32.dll
LCMapStringW,-,-,-,.rdata:0x000209CA,kernel32.dll
MultiByteToWideChar,-,-,-,.rdata:0x000209B4,kernel32.dll
LCMapStringA,-,-,-,.rdata:0x000209A4,kernel32.dll
GetLocaleInfoA,-,-,-,.rdata:0x00020992,kernel32.dll
HeapSize,-,-,-,.rdata:0x00020986,kernel32.dll
GetStdHandle,-,-,-,.rdata:0x00020668,kernel32.dll
FreeEnvironmentStringsA,-,-,-,.rdata:0x0002068E,kernel32.dll
FreeEnvironmentStringsW,-,-,-,.rdata:0x000206C0,kernel32.dll
WideCharToMultiByte,-,-,-,.rdata:0x000206DA,kernel32.dll
GetLastError,-,-,-,.rdata:0x000206F0,kernel32.dll
SetHandleCount,-,x,-,.rdata:0x0002071A,kernel32.dll
DeleteCriticalSection,-,-,-,.rdata:0x0002073A,kernel32.dll
TlsAlloc,-,-,-,.rdata:0x00020760,kernel32.dll
TlsFree,-,-,-,.rdata:0x0002077A,kernel32.dll
InterlockedIncrement,-,-,-,.rdata:0x00020784,kernel32.dll
InterlockedDecrement,-,-,-,.rdata:0x000207C2,kernel32.dll
HeapFree,-,-,-,.rdata:0x000207F6,kernel32.dll
GetSystemTimeAsFileTime,-,-,-,.rdata:0x00020842,kernel32.dll
LeaveCriticalSection,-,-,-,.rdata:0x0002085C,kernel32.dll
EnterCriticalSection,-,-,-,.rdata:0x00020874,kernel32.dll
InitializeCriticalSectionAndSpinCount,-,-,-,.rdata:0x000208F4,kernel32.dll
GetCPInfo,-,-,-,.rdata:0x0002091C,kernel32.dll
GetACP,-,-,-,.rdata:0x00020928,kernel32.dll
GetOEMCP,-,-,-,.rdata:0x00020932,kernel32.dll
IsValidCodePage,-,-,-,.rdata:0x0002093E,kernel32.dll
HeapAlloc,-,-,-,.rdata:0x00020950,kernel32.dll
HeapReAlloc,-,-,-,.rdata:0x0002096C,kernel32.dll
RtlUnwind,-,-,-,.rdata:0x0002097A,kernel32.dll
Я был удивлен, но импорт у всех трех файлов оказался статичен.

Заключение:
Ну чтож, зачаточное состояние генерации кода и ресурсов, необычные трюки антиэмуляции, ненормальная энтропия, метод загрузки памяти runpe (класса инжектор) ну и результат с АВ чекера скан4ю (не забываем, что ТС заранее предупредил, что файлы не фуд.) - этим ребятам еще предстоит очень много работы, чтобы поднять сервис на достойный уровень, ну а мы можем пожелать им удачи в этом!

RESULTS: 11/35
AVG Free - OK
ArcaVir - OK
Avast - Win32:Zbot-QAP [Trj]
AntiVir (Avira) - OK
BitDefender - Gen:Variant.Symmi.8108
Clam - OK
COMODO - OK
Dr.Web - OK
eTrust-Vet - OK
F-PROT - OK
F-Secure - Gen:Variant.Symmi.8108
G Data - Gen:Variant.Symmi.8108, Win32:Zbot-QAP [Trj]
IKARUS - Virus.Win32.Injector
Kaspersky - HEUR:trojan.Win32.Generic
McAfee - OK
MS Essentials - OK
ESET NOD32 - Trojan.Win32/Injector.ZIT
Norman - swizzor/Heur.I
Norton - OK
Panda - OK
A-Squared - Gen:Variant.Symmi.8108 (B)
Quick Heal - OK
Solo - OK
Sophos - Mal/Agent-AKF
Trend Micro - OK
VBA32 - OK
Zoner AntiVirus - OK
Ad-Aware - OK
BullGuard - Gen:Variant.Symmi.8108
FortiClient - OK
K7 Ultimate - OK
NANO - OK
Panda CommandLine - OK
Twister - OK
VIPRE - OK

File Name calc_1.exe
File Size: 135168
File MD5: a4acab0a8a24bf3ea27e8be986e8bfd8
File SHA1: 7380f2ac439ce8cce2a8aee05dfc07daa67d3159
Check Time: 2014-05-03 14:52:02

p.s. Как-нибудь я покажу вам работу реального генератора мусорного кода, апишек и ресурсов, но это будет в другой раз. Спасибо за внимание.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх