Много споров и подозрений в интеренете по поводу этой программы,
многие говорят что она шпионит за пользователями, даже небезызвесный
Крис Касперски написал статью про неё и называлась она "Некролог на
WebMoney". Очень нелестно высказываются о ней и другие прользователи.
Чтож, лучше один раз увидеть чем сто раз услышать, и исследовать
программу решил и я. Немного забегая вперед могу сказать что не все
так и плохо, как бы там не расписывали другие люди. В том же "некрологе"
программка была расписана как нечто ужасное, но на самом деле это не
более чем преувеличиения. Итак, приступим.
  С сайта вебмани был загружен дистриб проги и успешно установлен на
комп. При установке были включены файловый монитор и монитор реестра,
ничего скрытно она не делает, все что произошло было аккуратно записано
в лог установки и свободно для чтения.
  Следующий этап - осмотр того что нам собственно поставили, а файлов
там не слишком и много:
  - KeeperID.exe     (285 kb)
  - WebMoney.exe     (178 kb)
  - WMClient.dll     (2.8 mb)
  - WMDispatcher.exe ( 73 kb)
- прочие файлы (анинстал, папки с сертификатами и bexth.dll)
  KeeperID и WebMoney запакованы AsProtect ом, но не самой последней
версии, и если это было бы необходимо - можно было распаковать.
Наиболее крупным файлом в поставке был WMClient.dll и именно он
и содержит все основные функции программы, а ехе являлись лишь
хостом для этой длл. Сама длл ничем не запакована. Рассмотрим что же
в действительности делает она.
  Миф 1. "Она получает мой mac-адрес!"
  Да получает, ну и что? Получение идет абсолютно открыто - подгружается
библиотека netapi32 и затем вызывается стандартная функция NetBIOS для
получения информации о мак-адресе, никаких сокрытий тут не ведется, да и
если вы так боитесь своего мак адреса - ну поменяйте его! В настройках
устройства у большинства сетевых плат есть небольшой пунктик позволяющий
поменять адрес на любой другой. К тому же, исследуя протокол обмена
вебмани с сервером не было найдено передачи мак-адреса в числом виде, так
что это всего лишь мифы. Ну а про протокол обмена будет чуть позже.
  Миф 2. "Она получает все о моих PCI девайсах!"
  О боже, Крис Касперски как так можно было заявлять, эти текстовые
строки начинающиеся с pci не относятся к PCI девайсам никаким местом. Ведь
ясно видно что

.rdata:1021ECBC aPci_pursedest db '&pci_pursedest=',0
(цитата из статьи "Некролог...", адреса сохранены)

является частью какого то GET запроса, а не строкой позволяющей получить
или вывести информацию о девайсах. К тому же, если глянуть юрл'ы в самой
программе то можно увидеть такое:

https://merchant.web.../pci/XMLPay.asp
https://merchant.web.../XMLPayTest.asp

Где pci видимо является не сервисом сбора инфы о девайсах images/smilies/smile3.gif, а обычным
интерфейсом для перевода денег с одного счета на другой. Сканер шины
BusHound, ну малоли с девайсами система общается, уж и поговорить нельзя
images/smilies/smile3.gif. В дампе ниче такого нету. К тому же для каждого девайса свои способы
получения сериал номера устройства, и я не думаю что создатели вебмани
угробили столько времени чтобы получить пару сериалов.

  Миф 3. "Она ставит драйвера в мою систему!"
  Да там есть два драйвера - это winio.sys и citio.sys, но они отнюдь
не выворачивают вашу систему наизнанку в поисках ид всяких устройств и
не оставляют скрытых меток на жестком диске. После детального рассмотрения
было выяснено что драйверы устанавливаются во время ввода пароля с
клавиатуры т.е. блокируют клавиатурные шпионы в системе. Стоит ради
интереса заметить что сделано все это очень культурно - через сабклассинг
окон, что позволяет в принципе защитить любое окошко от перехвата инфы.
Так что в этом пункте стоит только похвалить разработчиков за красивое
решение.

  Миф 4. "Она получает списки процессов и модулей!"
  Ну в очередной раз не стоит судить о книге по обложке и стоит
разобратся чтоже она делает с этим списком и когда. Вызывается процедура
сбора инфы по хуку, а сам хук ставится на события мыши и клавиатуры. Но,
если детально рассмотреть все что она с ними делает то все становится
очень безобидно. В начале процедуры идет вызов:

.text:100B555D                 lea     eax, [ebp+PerformanceCount]
.text:100B5560                 push    eax             ; lpPerformanceCount
.text:100B5561                 call    ds:QueryPerformanceCounter

Сразу навевается мысль о неком подобии рандом генератора и используют его
явно не для шифрования, так как это было бы безумием. После этого идет
полоса комманд вычисления с плавающей точкой:

.text:100B55C5                 fild    [ebp+var_18]
.text:100B55C8                 sub     esp, 8          ; double
.text:100B55CB                 fstp    [esp+30h+var_30]
.text:100B55CE                 call    __scalb
.text:100B55D3                 fstp    [ebp+var_20]
.text:100B55D6                 add     esp, 0Ch
.text:100B55D9                 push    2               ; __int32
.text:100B55DB                 mov     eax, dword_10213D04
.text:100B55E0                 sub     eax, dword_10213CFC
.text:100B55E6                 mov     [ebp+var_24], eax
.text:100B55E9                 fild    [ebp+var_24]
.text:100B55EC                 sub     esp, 8          ; double
.text:100B55EF                 fstp    [esp+30h+var_30]
.text:100B55F2                 call    __scalb
.text:100B55F7                 add     esp, 0Ch
.text:100B55FA                 fadd    [ebp+var_20]
.text:100B55FD                 sub     esp, 8          ; x
.text:100B5600                 fstp    [esp+2Ch+var_30+4]
.text:100B5603                 call    _sqrt_
.text:100B5608                 add     esp, 8
.text:100B560B                 fcomp   ds:dbl_101DD7A8
.text:100B5611                 fnstsw  ax
.text:100B5613                 test    ah, 41h
...

Такое баловство также подразумевает некие операции со случайными числами,
практически сразу после этого идет вызов функции, которая в свою очередь
собирает многостардальный дамп процессов и памяти:

.text:100B5639                 mov     ecx, obj_processes
.text:100B563F                 call    GetAllProcesses

  А внутри этой функции нас ожидает приятный сюрприз:

.text:100B5C5C                 mov     ecx, [ebp+procs_buf]
.text:100B5C5F                 call    GetProcsMods
.text:100B5C64                 mov     [ebp+var_4], eax
.text:100B5C67                 mov     edx, [ebp+var_4]
.text:100B5C6A                 push    edx
.text:100B5C6B                 mov     ecx, [ebp+procs_buf]
.text:100B5C6E                 call    CalcMD4OnBuff
.text:100B5C73                 push    Hooks_doRemove
.text:100B5C75                 mov     ecx, [ebp+procs_buf]
.text:100B5C78                 call    Hooks_Control

  Вуаля! Собирает всю инфу о процессах в буфер и считает по ней MD4
хэш, и это сразу ставит все на свои места - запущенные процессы и
организация памяти по сути является в некоторой степени случайным элементом
для каждого компьютера, ну а подсчет хэша по этому добру дает хоть и не
слишком хорошее но всеже случайное число. Так что шпионство за процессами
отменяется, да здравствуют случайные числа images/smilies/smile3.gif Для особых скептиков на
этом расследование не было завершено.
Как уже было сказано, был проведен анализ протокола, и на удивление там
опять не оказалось местечка для конфиденциальных данных, даже намека нету
на них. В этом пункте можно спать спокойно ведь это еще один миф images/smilies/smile3.gif

  Миф 5. "Она использует DeviceIOControl!"
  Чтож, начнем с того зачем вообще эта функция, дабы не лезть со
всякими заявлениями по поводу "низкоуровнего обращения к hdd". Функция
эта действительно предназначена для посылки IO кода некому устройству.
Но обратите внимание, что программа не просто так импортирует эту функцию,
она использует собственные драйвера и та функция как раз отправляет
данные именно этим драйверам, а не жестким дискам
и прочим девайсам. Ну и опять же дабы не быть голословным посмотрим из
каких функций они вызываются:

...
.text:1008DEAA    push    80000000h       ; dwDesiredAccess
.text:1008DEAF    push    offset FileName ; ".citio"
.text:1008DEB4    call    ds:CreateFileA
...
.text:1008DF0E    push    eax             ; lpInBuffer
.text:1008DF0F    push    80002078h       ; dwIoControlCode
.text:1008DF14    mov     ecx, [ebp+hObject]
.text:1008DF17    push    ecx             ; hDevice
.text:1008DF18    call    dsimages/smilies/mosking.gifeviceIoControl
...

  Как видно из сорца идет открытие драйвера и передача буфера ему и к
великому сожалению не явлется шпионской деятельностью images/smilies/smile3.gif Такие же
разочарования нас ждут по адресам 1008E232, 1017C488, 1017C588, 1017C68E,
1017C7B2 и 1017C906. Но это не все места где используется данная функция,
так же она испольуется в 10084FED, 10085367, 100858A1, 10085C28 и 10085CDC.
На первый взгляд выглядят они просто ужасающе - рядом есть два кросс
референса на строку .PhysicalDrive%d и .Scsi%d ну и естественно
первая мысль которая крадется в голову это чтение и запись на диск всякого
компромата в виде меток или чтение инфы о серийных номерах диска! Но если
успокоится и довести дело до конца, что не было сделано в той же статье
"Некролога...", то можно с уверенностью утверждать - ничего плохого наш
муравей не делает. Используется данные не для шпонства за пользователями,
а просто чтобы создать некий HardwareID и потом передать его на сервер
активации приложений. А отправлется это дело на:

https://www.softacti....ivationKey.asp

  И тут же рядом с этим линком видим шаблон запроса:

.rdata:101D7E28 agact db '<GetActivationKey.request><login></login><ProductID></Produc'
.rdata:101D7E28       db 'tID><HardwareID></HardwareID><sign></sign></GetActivationKey'
.rdata:101D7E28       db '.request>',0

  Делаем вывод что это еще один страшный миф о шпионстве вебмани.

  Миф 6. "Неспецифированный протокол"
  Ну это совсем не обоснованый пункт, непонятно вообще откуда он
взялся, если даже просто мимолетно взглянуть на код и на строки, то ясно
можно увидеть обычнейший xml, именно его используют для передачи информации
на сервер и с него. В добавок к этому, дабы не передавать все в открытом
виде используется самый обычный ssl протокол, который себя зарекомендовал.
На каком то форуме даже пробегали ссылки на полные документации их
протолоков, хотя имхо это даже лишнее - все ясно из шаблонов которые
встроены прямо в программу.

  Чтож, с мифами разобрались, но это еще далеко не все, в вебмани
предусмотрен запрос "безопасности", который происходит при проведении
платежа, давайте рассмотрим что же в действительности получает сервер
вебмани из секретных данных пользователя. Выделив шаблон запроса хмл и
написав комментарии - получилось следующее:

<SecurityReport.Request>
  <WMID></WMID>            # wmid - ну кудаж без него
  <Keeper>
    <Version></Version>           # версия самого кипера
    <Language></Language>         # язык кипера
    <Activation></Activation>     # активация, по видимому номер
    <Confirmation></Confirmation> # подтверждение
    <KSP>                         # Инфа о KSP
      <Version></Version>
      <Name></Name>
      <Desc></Desc>
    </KSP>
    <Keys>                        # Инфа о ключах
      <Size></Size>
      <DriveType></DriveType>     # тип устройства, по видимому флеш или хард
    </Keys>
  </Keeper>
  <System>                        # информация о системе
    <VersionInfo>
      <MajorVersion></MajorVersion> # версия винды
      <MinorVersion></MinorVersion>
      <BuildNumber></BuildNumber>   # номер билда винды
      <PlatformId></PlatformId>
      <CSDVersion></CSDVersion>
      <ServicePackMajor></ServicePackMajor>  # инфа о сервис паках
      <ServicePackMinor></ServicePackMinor>
      <SuiteMask></SuiteMask>
      <ProductType></ProductType>            # тип продукта
    </VersionInfo>
    <InternetExplorer>                       # инфа о интеренет эксплорере
      <Version></Version>
      <Build></Build>
      <MinorVersion></MinorVersion>
    </InternetExplorer>
  </System>
  <Sign></Sign>                              # подпись, видимо запрос подписывается
</SecurityReport.Request>

  В таком запросе я не наблюдаю ни отправки списка процессов, ни
номеров жесткого дистка ни прочей нечисти каким либо образом характеризующей
пользователя. Версии как интернет эксплорера практически одинаковые у
всех так и версии и билды винды так же однотипны. Остается лишь одна
загадка в вебмани - как сервер определяет то что кошелек запущен в вмваре.
Частично разгадка известна - функция NetBios используется классом HWIdentor
который в свою очередь используется классами для подключения к вебмани. А
сама функция нетбиос возвращает нам мак-адрес сетевой карты. Для вмваре
используются специфичные номера по которым она безбожно палится. Обойти
это можно применив патч для вмваре который можно найти в интернете, жаль
что для новых версий приходится его переписывать, так как он не работает images/smilies/smile3.gif
  Особенно стоит поблагодарить разработчиков за их внимание к реверсерам
и оставление на протяжении всего ехе всяких полезных строчек с дебаг
информацией, в которой помимо сообщения об ошибке еще указывается и класс
и процедура в который мы сейчас находимся.

by NeoN