Здравствуйте, гость ( Вход | Регистрация )



Гостевой доступ к форуму из Москвы: Телефоны: +7(495)7859696,7376201,7376233,7868796,7390241 Login: demo Password: demo
 
ОтветитьСоздать новую тему
> Трояны, =)
Конан
сообщение Aug 29 2005, 05:12
Сообщение #1


-=White Panthers=-
******

Группа: Новички
Сообщений: 1 092
Регистрация: 27-June 05
Из: M-SIDE! ЮЗАО! Южное Бутово!
Пользователь №: 23
Заходит на форум с полного инета.



Какими пользуетесь вы?


--------------------
ПАДОНКИ ЭТО НАВСЕГДА
Изображение
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Серж
сообщение Sep 1 2005, 14:24
Сообщение #2


Постоянный пользователь
***

Группа: Banned
Сообщений: 160
Регистрация: 31-August 05
Пользователь №: 115
Заходит на форум с гостевика или полного инета.



Я никакими не пользуюсь хотя дискетки с Пинчами, Антиламерами валяются
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Забанен Пожизненно
сообщение Oct 15 2005, 14:04
Сообщение #3


Пользователь
Group Icon

Группа: Moderators
Сообщений: 106
Регистрация: 27-June 05
Из: Хде то не далеко...
Пользователь №: 21
Заходит на форум с полного инета.



Я скоко пытался скачать все битые ссылки =(


--------------------
Изображение
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Конан
сообщение Oct 17 2005, 08:43
Сообщение #4


-=White Panthers=-
******

Группа: Новички
Сообщений: 1 092
Регистрация: 27-June 05
Из: M-SIDE! ЮЗАО! Южное Бутово!
Пользователь №: 23
Заходит на форум с полного инета.



QUOTE(Забанен Пожизненно @ Oct 15 2005, 12:04) *

Я скоко пытался скачать все битые ссылки =(

Да ты чо? =)))))))))))))))))))0
Откуда же ты скачивал?


--------------------
ПАДОНКИ ЭТО НАВСЕГДА
Изображение
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
PINguin
сообщение Oct 17 2005, 14:24
Сообщение #5


PINguin
Group Icon

Группа: Advanced
Сообщений: 957
Регистрация: 21-August 05
Из: Страна Лимония
Пользователь №: 79
Заходит на форум с полного инета.



А по-моему, самый

А по-моему, самый лучший троян- сделанный своими руками smile.gif
WinAPI заодно можно подучить wink.gif


--------------------
Изображение
Изображение
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Oct 18 2005, 13:01
Сообщение #6


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Я на дельфи писал, правда больше 400 килобайт получился (первый блин), зато его антивирусы пропускали smile.gif


--------------------
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
PINguin
сообщение Oct 18 2005, 13:54
Сообщение #7


PINguin
Group Icon

Группа: Advanced
Сообщений: 957
Регистрация: 21-August 05
Из: Страна Лимония
Пользователь №: 79
Заходит на форум с полного инета.



Хех, а ты бы запакавал бы его ASPack'om или UPX-
раза в полтора меньше бы был, и антивири бы тоже не детектили.


--------------------
Изображение
Изображение
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Oct 18 2005, 20:09
Сообщение #8


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



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


--------------------
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
PINguin
сообщение Oct 19 2005, 15:24
Сообщение #9


PINguin
Group Icon

Группа: Advanced
Сообщений: 957
Регистрация: 21-August 05
Из: Страна Лимония
Пользователь №: 79
Заходит на форум с полного инета.



А вот и нифига!
Насчет оригинального УПХ не скажу, а если поставить скрамблер- ничего не произойдет!
По-моему, ASProtect последний тоже антивири не секут.


--------------------
Изображение
Изображение
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
iNcluDe
сообщение Jan 7 2006, 00:08
Сообщение #10


Новичок
*

Группа: Новички
Сообщений: 32
Регистрация: 6-January 06
Пользователь №: 247
Заходит на форум с гостевика.



Раньше пинча юзал, сейчас с троями завязал


--------------------
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Atreidies
сообщение Nov 13 2006, 23:59
Сообщение #11


Гость


Группа: Новички
Сообщений: 17
Регистрация: 28-September 06
Пользователь №: 608
Заходит на форум с гостевика или полного инета.



А я в них почти ничего не понимаю. sad.gif(
А следовало бы уже. Вот хочу типа своих немного сделать.
Пока так..детские трюки, трояна невышло.

Вот ломаю голову над парой вопросов: Как назначить иконку exe
файлу без иконки, поменять иконку exe файлу уже имеющему
иконку. Обьединить два exe файла(или встроить один в другой).
Если поможете буду оч. благодарен!
Я так понимаю затеи с обьединением exe - это и будет типа троян.
(хотябы для начала неплодящийся)
Подскажите как можно сделать плиз!

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

WinAPI- Это типа языка программирования? сложный?
Я пока немного знаю паскаль и коечто из VBScript. в этом
пока не помогло

Попробую узнать чо за Пинчи и антиламеры. Раньше скачаивал у знакомых типа хакеров софта. Мож там че..правда стаарый 1998-2002 года %)
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Frut
сообщение Nov 14 2006, 05:26
Сообщение #12


Заведующий всем
Group Icon

Группа: Administrators
Сообщений: 3 921
Регистрация: 3-January 06
Из: Люберцы
Пользователь №: 240
Заходит на форум с полного инета.



Цитата
Вот ломаю голову над парой вопросов


Зависит от твоего средства разработки.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Atreidies
сообщение Nov 14 2006, 06:30
Сообщение #13


Гость


Группа: Новички
Сообщений: 17
Регистрация: 28-September 06
Пользователь №: 608
Заходит на форум с гостевика или полного инета.



Цитата(Frut @ Nov 14 2006, 06:26) *

Зависит от твоего средства разработки.


Всмысле языка программирования? хм )
Кстати седня в какойто там раз снова пытался найти средства
для обьединения exe. И как ни странно через несколько часов поиска я все же нашёл
пару небитых ссылок smile.gif эх..

Кстати антиламер один или парочку нашёл. насчет скачал уже через стоко часов посика не помню %)
может битая ссылка. Остается вопрос о Пинчах и WinAPI.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
drusha
сообщение Nov 14 2006, 19:06
Сообщение #14


Постоянный пользователь
*****

Группа: Новички
Сообщений: 520
Регистрация: 16-June 06
Пользователь №: 431
Заходит на форум с гостевика.



Цитата(Atreidies @ Nov 14 2006, 00:59) *

Вот ломаю голову над парой вопросов: Как назначить иконку exe
файлу без иконки, поменять иконку exe файлу уже имеющему
иконку.

Если файл Win32, то обычными средствами практически никак. Теоретически можно найти то место где она сидит в самом файле, и каким-нить бинарным редактором (типа DiskEdit из Northon Utility DOSовских времён...) покурочить её. Но только зачем? Точно так же можно влезть в машинный код и засадить туда чё-нить другое... Тогда это станет просто совершенно другая программа. А если есть исходник, то там обычно подлинковывается файл ресурсов. Вот, в нём, окромя всего прочего, сидит эта иконка. Обычно компиляторы полставляют туда иконку по умолчанию...

Если файл DOSовский, то иконка сидит не в нём, а в файле *.PIF с тем же именем, который прилагается к нему. Если своего PIFа у него нет, то используется общий по умолчанию. Её можно поменять, редактируя "свойства" PIF (то бишь, ярлыка).
Цитата(Atreidies @ Nov 14 2006, 00:59) *

Обьединить два exe файла(или встроить один в другой).

А это как это? И что они должны тогда делать? Один распаковывает другой и вызывает? Или оба сразу вызываются?
Цитата(Atreidies @ Nov 14 2006, 00:59) *

Я так понимаю затеи с обьединением exe - это и будет типа троян.

Ага... Выходит, все Setup'ы.EXE и Install'ы.EXE - это такие трояны... Ну, в общем-то, да... Если учесть, что сам Windows - это такой "самый большой вирус".
Цитата(Atreidies @ Nov 14 2006, 00:59) *

(хотябы для начала неплодящийся)

А для конца?
Цитата(Atreidies @ Nov 14 2006, 00:59) *

В основном нужно для дела и для автоматизации на своем и других
компьютерах,

Тогда пиши старые добрые батники.
Цитата(Atreidies @ Nov 14 2006, 00:59) *

но деструктивные функции тоже могут пригодится.

"Убей сибя ап стену" - это такая деструктивная функция?
Цитата(Atreidies @ Nov 14 2006, 00:59) *

WinAPI- Это типа языка программирования? сложный?

Это не язык. Это просто библиотека подпрограмм, которая всегда под рукой. Реализована системными DLL, входящими в состав Windows. Но об этих библиотеках даже знать не надо: они изначально загружены и готовы к употреблению, когда твоя программа только получает управление. Все эти подпрограммы сделана так, что соглашение о вызовах понимается всеми языками (конкретно, по-Паскалевски), а чтобы их понимал компилятор С/С++, то в объявлениях этих используются особые модификаторы и прагмы типа
#ifdef __cplusplus
extern "C" {
#endif
WINAPI функция(параметры);
WINAPI функция(параметры);
#ifdef __cplusplus
}
#endif
а WINAPI - это такой макрос, который расшифровывается как FAR PASCAL... Или STDCALL... А это тоже макросы, которые для разных компиляторов могут быть определены по-своему... Короче, чтобы именно этот компилятор понимал правильно. Но всё это сидит в ашнике WINDOWS.H, и тебе достаточно указать только
#include <windows.h>
Но обычно даже этого не надо. Если юзаешь VCL.H или MFC.H, то там всё это уже сделано. Короче, даже думать не надо. И если ты привык пользоваться ими в Паскале, Бейсике или где-то ещё, то в С/С++/С####, да хоть на Фортране - всё будет точно так же. И имена (кстати, нечувствительные к регистру букв), и порядок следования параметров, и тип, и смысл...

Короче, WinAPI - это куча функций, которые ты можешь промто юзать в программе на любом языке, хоть на Фортране (если найдёшь его версию под среду Win32), хоть на Бейсике. А чё каждая из них делает... Это надо читать руководство... Всё что можно сделать в Windows - делается через API.

На самом деле, когда ты даже просто пишешь по-старому (совместимо со старыми версиями под DOS). Например, в старой Сишной программе, которую ты решил перекомпилить под Windows как консольное Win-32 приложение (которое на вид даже не сразу отличишь от DOS-окна), положим, там написано

f=open(имя, режим);
...
close(f);
то эти функции, реализующие тот стиль (так называемую "стандартную библиотеку С") в Windows-версии реализованы как врапперы (оболочки вызова) для API-функций CreateFile, CloseFile... То есть, на самом деле ты тут пользуешься тем же API. А в стандартной библиотеке под DOS там всё сводилось к вызову прерывания INT 21H...


--------------------
Теперь всё, я сюда больше не приду. Никогда.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Atreidies
сообщение Nov 15 2006, 00:31
Сообщение #15


Гость


Группа: Новички
Сообщений: 17
Регистрация: 28-September 06
Пользователь №: 608
Заходит на форум с гостевика или полного инета.



\\А это как это? И что они должны тогда делать? Один распаковывает другой и вызывает? Или оба сразу вызываются?

Возможно по завершении выполнения главного чтобы запускался второй, или по мере запуска
основных(загрузочных) команд первого вызывался второй. Это несколько предположений.
Или создается некий как бы шапка для етих двух exe, которая запускает их оба. Тоесть такой НАДмодуль.
К сожалению незнаю структуру exe файлаб но оч хочу узнать. Узнал только что в конце вроде содержится информация о длине файла и длине хвоста файла как я понял.
Возможно изза это при редактировании ехе у меня была проблема- я менял имя или
путь вызываемого из ехе другого файла, и если менял общее количество символов(длину)
то ехешник становился бес иконки и выдавал ошибки помойму.


\\..Ага... Выходит, все Setup'ы.EXE и Install'ы.EXE - это такие трояны... Ну, в общем-то, да... Если учесть, что сам Windows - это такой "самый большой вирус".

Погорячился. Троян возможно должен открывать доступ, открывать порты. Такие функции тоже могут пригодится. НУ это я так..немного сравнил с трояном просто.
А если "все Сетупы и Инсталы.ехе...такие трояны" то может можно попробывать обьединить
пару exe фалов создав Сетуп файл??

\\А для конца?
Я имел ввиду тогда что если и назвать это трояном(хотя пложение вроде больше свойтвенно вирусам), то неплодящимся, а не то что цель сделать плодящийся, но знать и уметь Надо.
Для конца естественно знать больше команд и функций, в том числе команды/способы реализации
функции "пложения", встраивания своего кода.

\\Тогда пиши старые добрые батники.
Я так и делаю, но батники есть батники. Кроме них
вот здесь например речь о ехе.
PS: как например сделать запуск батника без выскакивания квадратного дос-окна(окна командной строки)?

\\"Убей сибя ап стену" - это такая деструктивная функция?
К чему этот непонятный сарказм??? Речь идет о познавании функций ехе и троянов.

За ВинАПИ спасибо!! познавательно и понятным языком smile.gif


Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
drusha
сообщение Nov 15 2006, 10:18
Сообщение #16


Постоянный пользователь
*****

Группа: Новички
Сообщений: 520
Регистрация: 16-June 06
Пользователь №: 431
Заходит на форум с гостевика.



Насчёт вызова одной программы из другой.

В WinAPI есть такие функции

CreateProcess - основная версия для Win32

WinExec - устаревшая версия, оставленная для совместимости с Win16, в Win32 похоже на враппер предыдущей функции, которая ноые параметры подставляет по умолчанию (у этой их значительно меньше)

ShellExecuteEx, ShellExecute (вторая - это упрощённый враппер вызова первой, оставленный для совместимости с Win16) - обобщённое "открытие" разных файлов в зависимости от их типа. Например, .EXE, .COM, .CMD, .BAT - запускаются, остальные типы "открываютя" в соответствии с тем, как они зарегистрированы в Windows. Там ещё можно "печатать" файлы, разумеется, если их тип зарегистрирован в Windows, и там конкретно указано, как это делать. Например, для файов типа .DOC вызывается WinWord с какими-то опциями, что тот его молча печатает и потом сразу выходит. Короче, для разных типов файлов вызываются соответствующие приложения, которые их "открывают". Например, для батников и DOSовских EXEшников это COMMAND.COM или CMD.EXE... Ну, в общем, понятно.

spawnl, spawnle, spawnlp, spawnlpe, spawnv, spawnve, spawnvp, spawnvpe, _wspawnl, _wspawnle, _wspawnlp, _wspawnlpe, _wspawnv, _wspawnve, _wspawnvp, _wspawnvpe - группа функций из "стандартной" библиотеки С, которые отличаются способами задания параметров. По сути, все они - врапперы вызова API-функции CreateProcess, но это только в реализации под Win32. (стандартная библиотека - на то и стандартная, что она имеет свои реализации под DOS, LINUX (и другие UNUX), Os/2, Mac OS, Solaris... везде по-своему, но на уровне исходных текстов - совместимо)

Аналогично в языках Паскаль и др. можно найти свои "стандартные" библиотечные подпрограммы или операторы самого языка (типа Exec), которые делают это. Ео для версий под Win32 все они в конечном итоге сводятся к вызову CreateProcess

Как быть с батниками? Можно по-разному. Например, для каждого из них сделать одноимённый PIF (создать ярлык), назвать его так же (только расширение PIF вместо BAT) и положить его в ту же папку. Windows - это такая сволочь, которая, хочешь ты того или не хочешь, а сама всегда иет, и если находит, то использует ярлыки (PIFы) для .BAT, .COM и .EXE (DOS, Win16), выбирая оттуда "свойства". Есл не находит, то использует какой-то свой PIF по умолчанию.

В "свойствах" ярлыка (PIF) можно указать
"закрывать окно после завершения"
"выполнять свернув"
и т.п.

А если вызывать программы (хоть EXE любого типа, хоть BAT, хоть PIF) через CreateProcess или ShellExecuteEx, то там есть такой параметр CmdShow (целое число, условно кодирующее состояние главного или консольного окна при запуске). Для него определены спец.константы. Например, типа
SW_NORMAL
SW_MINIMIZED
SW_HIDDEN
Я тут могу наврать или ошибиться, см. хелп по WinAPI (в любой среде, будь то Borland C++ Builder, Dlphi, Turbo Pascal и т.п.набираешь имя API-функции, скажем, ShllExecuteEx, ставишь курсор на неё и жмёшь Ctrl-F1 - хелп по Win32 API поставляется вместн со средой разработки)


--------------------
Теперь всё, я сюда больше не приду. Никогда.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
drusha
сообщение Nov 15 2006, 19:06
Сообщение #17


Постоянный пользователь
*****

Группа: Новички
Сообщений: 520
Регистрация: 16-June 06
Пользователь №: 431
Заходит на форум с гостевика.



Из некоторых нетривиальных приёмов, которые лично я использовал в своих программах

1. Повторный вызов программой самой себя. В том числе самомодификация, самоперемещение...

Сначала надо осознать себя. Чтобы было ясно, что нужно перемещать, модифицировать и перезапускать.

Как известно, пока программа работает (выполняется), её EXEшный файл "открыт" в режиме, не допускающем повторное открытие на запись, дозапись, перезапись (т.е. любую модификацию), а так же удалить этот файл. Однако его можно открыть для чтения и скопировать в другое место (либо под другим именем). При этом доступность этого файла определяется режимом открытия, и никак не зависит от файловых атрибутов (либо только дополняется ими). Итак, мы можем

1.1. Получить имя исполняемого файла самой этой программы (которая сейчас выполняется). В Win32 API это надёжнее всего сделать функцией

GetModuleFileName((HMODULE)NULL,(char *)буфер,(unsigned int)длина_буфера); // Это на Си. Ну, на Паскале - аналогично, только там типы по-другому называются

Буфер имеется в виду под ASCIIZ-строку (такое представление строк характерно для языка Cи, в Паскале же они приделаны сбоку).
Но все (большинство) WinAPIшных функций ориентированы на ASCIIZ-строки, и с этим придётся считаться. Впрочем, у какого-нибудь Бейсика доступ к WinAPI может быть сделан через свои врапперы, которые берут бэйсичные строки (что-то вроде типа Variant), преобразуют их в ASCIIZ, вызывают API и делают обратное преобразование... Тогда надо смотреть руководство по той языковой среде.
Размер буфера должен быть не менее 260 байт (я обычно даю ему 264 - это число делится на 8, а сейчас компиляторами обычно (по умолчанию) используется выравнивание на QWORD - то есть, 8 байт, что будет особо актуально для грядущей 64-битной архитектуры). Предварительно буфер неплохо бы занулить, а для этой функции указать его длину не полную, а 260 байт. Пусть она думает, что он короче, и в конце гарантированно оставит несколько нулей на всякий случай. Хотя реально имя файла не превысит 256 байт.
Ещё можно попробовать взять _argv[0] (на С/С++) или ParamStr(0) (на Паскале) - короче, "нулевой" параметр командной строки вызова. Но не во всех системах гарантируется, что там имя файла представлено с полным путём (смотря как программа вызвана). Например, когда я стартовал программу под отладчиком, я видел там имя файла без пути.

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

GetFullPathName(имя_файла,длина_буфера,буфер,&указатель_на_имя);

Соображения насчёт буферов и указания их длин - аналогичные оговорённым выше. Последний параметр здесь - указатель на указатель (на ASCIIZ-строку), куда будет помещён указатель на начало той части полного пути (в нашем буфере), где будет начинаться просто имя файла без пути. В результате должен получиться полный (абсолютный) путь с именем файла - даже если имя_файла было задано без пути или с неполным (относительным) путём, либо там присутствовали ".", ".." и т.п. - всё это будет расшифровано и конкретизировано.
Если имя_файла было задано уже с полным путём, то эта функция просто копирует его в буфер "как есть".

Далее его можно превратить в "короткое" имя вызовом API-функции

GetShortPathName(длинное_имя,буфер,длина_буфера);

Насчёт буферов и их размеров - всё аналогично. Эта функция преобразует имя файла вместе с путём (если он там указан) в "короткую" версию, совместимую с форматом 8.3 (т.е. совместимую с MS DOS). Эту "короткую" версию она помещает в буфер. Там заведомо не будет пробелов, всякой прочей бяки, и это касается не только имени файла, но и всех элементов пути. На самом деле, в файловой системе Win32 (FAT32, NTFS, CDFS...) с поддержкой длинных имён, у каждого "длинного" имени файла или папки есть свой "короткий" псевдоним (альтернативное имя), по которому этот же объект доступен не менее надёжно. Ну, может быть, не так красиво для человека...
Если имя файла (и его путь) - уже "короткое" (удовлетворяет формату 8.3), то эта функция просто копирует его в буфер "как есть".

Из полученного имени текущего файла (преобразованного к полному пути в "короткой" форме 8.3) можно получить путь каталога (папки). Это, собственно, то место, откуда вызвана эта программа. Пригодится. Разбирать строку можно самому, а есть и стандартные (библиотечные) функции
_splitpath, fnsplit, SplitName...

Далее для простоты везде предполагается, что мы имеем "короткую" версию имени файла и пути каталога. Это существенно, если мы хотим использовать их в BATниках для команд DOS, да и вообще не помешает (например, при вызове программы по длинному имени, содержащему пробелы, это длинное имя следует заключать в двойные кавычки, но в данном случае, когда имена у нас только короткие, с кавычками можно не заморачиваться).

Кстсти, все вышеперечисленные API-функции возвращают длину, на которую реально заполнен буфер. 0 должен пониматься как признак неудачи (типа, "ну, не шмогла я!"), и в этом случае можно продолжить использовать прежнюю форму имени, либо скопировать строку в буфер самому.

Впрочем, для каких-то целей (например, для копирования в другое место) можно составить самому полное имя с путём, взяв путь в "короткой" версии (т.е. полный, но преобразованный к формату 8.3), а имя файла - "длинное". Найти "длинное" имя (если оно есть) по "короткому" можно API-функцией FindFirstFile, подставив в качестве маски реальное имя файла (она его всегда найдёт, но если у файла есть "длинная" версия имени, то отдаст именно её, а если только короткая, то её).


1.2. Неплохо бы написать отдельную подпрограммку для гарантированного нахождения имени файла, которого ещё нет (т.е. имени под новый файл). Факт существования файла можно узнать, попытавшись опросить его атрибут. Этот способ надёжен вне завистмости от того, файл это, каталог, метка тома, видимый, невидимый и доступен ли сейчас для открытия... Для этой подпрограммки следует сделать параметры для указания расположения (пути каталога или папки) и общей маски имени. Например, может понадобиться найти новое (пока несуществующее) имя с конкретным расширением EXE или BAT. И в заданном каталоге (папке), а не обязательно в текущем месте... Лично я обычно веду счётчик, преобразую его к строке в 36-ричном исчислении (получаются всевозможные сочетания цифр и букв латинского алфавита), подставляю в маску и проверяю на существование. Если объект (не важно какой) с таким именем существует, то наращиваю счётчик, и опять...

Итак, ищем новое имя для пока несуществующего файла типа EXE или даже с произвольным расширением. Использовать жёстко заданные конкретные имена я тут не рекомендую. Копируем туда файл нашей программы в файл с этим именем. API-функция CopyFile может это сделать. Для неё не важно, что сам файл текущей программы сейчас выполняется, т.к. она открывает его только на чтение. С новой копией нашего файла мы можем делать всё что угодно. Имя его мы знаем (сами только что придумали), атрибут можем принудительно присвоить FA_ARCH (=32 или 0x20). Можно, например, открыть для чтения-записи и модифицировать в каком-то месте.

1.3. Ищем новое имя для пока ещё несуществующего файла типа .BAT, и создаём этот файл (открываем на запись с созданием). Это новый файл, и о нём никто не знает кроме нашей программы, которая сама его только что создала.

Пишем туда следующие команды. Просто как строки текста.

@echo off
rem -- Сначала небольшие проверочки
if not exist [копия_нашего_файла] goto out
if not exist [наш_файл.EXE] goto dalee
rem -- Наш файл, который мы хотим подменить и перезапустить, пока существует. Этого следовало ожидать
:snova
rem -- Эта переменная среды (Environment), которую мы используем для своих целей. Здесь мы пока очистим её. Хотя это без разницы
set WAITDELAYVAR=
rem -- Попробуем удалить наш файл, но пока он работает, он этого не даст сделать. Даст только когда завершит свою работу.
del [наш_файл.EXE]
rem -- И сразу проверим, как это удалось. Не будем ни начто полагаться. Если удалось, тогда продолжим по метке :dalee
if not exist [наш_файл.EXE] goto dalee
rem -- Иначе надо подождать, пока он не завершит своё выполнение. До этого он не даёт себя уничтожить. Организуем цикл с задержкой
set WAITDELAYVAR=_
:waitagain
rem -- Обеспечим достаточно много (ну, скажем, 80-100) циклов. Для батника это выльется в несколько миллисекунд задержки
if %WAITDELAYVAR% == ________________________________________________________________________________
__________ goto snova
rem -- Пока эта строка ещё не доросла до нужной длины, нарастим её ещё на один ундербар
set WAITDELAYVAR=%WAITDELAYVAR%_
goto waitagain
:dalee
rem -- Здесь наш файл.EXE уже уничтожен, и проверено, что его нет
rename [копия_нашего_файла] "[НАШ_ФАЙЛ.EXE]"
rem -- Либо можно через Copy-Del. А можно проверить, выполнилась ли команда rename на самом деле?
if exist [наш_файл.EXE] goto call_me
rem -- А вдруг переименование не удалось? Камаднда rename - она капризная. Например, не работает между разными устройствами
if not exist [копия_нашего_файла] goto out
copy /Y [копия_нашего_файла] "[НАШ_ФАЙЛ.EXE]"
del [копия_нашего_файла]
:call_me
rem -- Повторный вызов нашего файла
[наш_файл.EXE] параметры вызова...
:out
rem -- Самоубийство этого батника - вместо %0 можно вписать его реальное имя.BAT, которое мы знаем, так как сами его создавали
del %0

Здесь вместо [копия_нашего_файла] и [наш_файл.EXE] надо подставить конкретные имена файлов, которые мы знаем (сами придумали). В последней строке, которая предписывает этому батнику сделать харакири, можно также подставить его конкретное имя, но можно %0.

Коль скоро мы сами создаём этот файл (пишем программой, а не вручную), то подстановку имён файлов организовать нетрудно. Можно использовать стандартную функцию
fprintf(файл,"\
@echo off\n\
if not exist %s goto out\n\
if not exist %s goto dalee\n\
...
del %%0\n","имя_копии_файла","наш_файл.EXE",...);

Как ни странно, батные файлы позволяют так делать - совершать харакири (я проверял это и под DOS, и под 95-98, и под NT-2000-XP). Ах, да, где я писал "[НАШ_ФАЙЛ.EXE]" - в командах копирования и переименования, туда лучше подставить первоначальную (не преобразованную к "короткой" форме 8.3) версию имени файла программы, но заключить его в двойные кавычки. Command.com от Windows-95,98,ME и CMD.EXE от Windows-NT,2000,XP это понимает правильно, и умеет работать с длинными именами. Тогда будет сохранено длинное имя файла, как оно было раньше. Двойные кавычки не повредят и для короткого имени.

Итак, создав такой батник, запускаем его на исполнение

В стандантной библиотеке Си (если пишете на этом языке) есть функция spawnl, которую можно вызвать

#include <process.h>
...
spawnl(P_NOWAIT,"имя_файла.BAT","имя_файла.BAT",NULL);

Аналогичные средства должны быть в других языках, но я не помню, где, например, в Паскале задаётся параметр аналогичный используемым здесь P_WAIT или P_NOWAIT.
Здесь константа P_NOWAIT в качестве первого параметра предписывает запустить процесс асинхронно. В MS DOS это не работало.
В других языках - свои аналоги, но общая Win32 API позволяет использовать такие вызовы

// Подготовка: надо иметь структуры данных, описанные в Win32 API
STARTUPINFO Startup; // Структурка, которую мы заполним сами и передадим по указателю для CreateProcess
PROCESS_INFORMATION ProcInfo; // Структурка, которую нам заполнит CreateProcess
// Подготовка этих структурок
memset(&Startup,0,sizeof(Startup)); // Сначала занулим её
memset(&ProcInfo,0,sizeof(ProcInfo)); // и эту тоже
Startup.cb=sizeof(Startup); // Это поле играет роль сигнатуры, и должно содержать длину этой структуры в текущей версии API
Startup.dwFlags=STARTF_USESHOWWINDOW; // Поле флагов. Здесь мы укажем только один флаг, что будем использовать только поле wShowWindow
Startup.wShowWindow=SW_HIDE; // А вот и оно. Укажем, что окно (консоль) должно быть скрыто совсем. Другие поля не используются.

CreateProcess(NULL,"имя_файла.BAT",NULL,NULL,FALSE,DETACHED_PROCESS|NORMAL_PRIORITY_CLASS,NULL,NULL,&Startup,&ProcInfo);

и тут же завершаем работу;
Exit(0);

Но можно вызвать более простые и высокоуровневые функции ShellExecute или ShellExecuteEx. Например,

ShellExecute((HWND)NULL,"open","имя_файла.BAT",NULL,NULL,SW_HIDE);

Оба этих вызова обеспечивают АСИНХРОННЫЙ запуск нового процесса. Это значит, можно не дожидаться его завершения. Если хочешь сделать синхронный вызов (с ожиданием завершения и получением результата - кода выхода или ошибки), то в Win32 придётся вызвать функцию GreateProcess или ShellExecuteEx, там получить хендл процесса (у CreateProcess он помещается в одно из полей структурки ProcInfo, у ShellExecuteEx - аналогично, но там всё передаётся в структурке типа SHELLEXECUTEINFO, передаваемой по указателю - там и входные и выходные данные). Получив этот хендл, можно периодически проверять состояние этого процесса и управлять им (например, убить вызовом TerminateProcess). Проверять можно обращением к API-функции GetProcessExitCode для этого хендла, и пока она возвращает значение STILL_ACTIVE, то процесс пока ещё работает (иначе она отдаст код выхода - обычно 0 или код ошибки). Пока ждёшь, можно обрабатывать свои оконные сообщения и другие события... Короче, не скучать. Но можно и оформить свою подпрограмму, которая сама гоняет цикл ожидания, там выполняет Sleep чтобы экономить процессорное время... Именно так реализована стандартная библиотечная функция С/С++ spawnХХХ, вызываемая с параметром P_WAIT (под MS-DOS параметр P_WAIT был как бы всегда, P_NOWAIT игнорировадся) поступает имено таким образом. То есть, стартует процесс асинхронно и ждёт сама, выполняя при этом обработку оконных событий по умолчанию. Но там слишком примитивно. Самому можно круче заделать. Тайм-ауты там всякие и всё такое прочее.

Но нам тут нужен именно асинхронный запуск процесса, которому мы можем что-то завещать. А контролировать его мы не будем, т.к. сами мрём.

В данном случае рассмотрен самоперезапуск программы после самомодификации (вернее, модификации своей копии). Но можно самоперезапускаться в других случаях
- Перенести себя в другое место. Например, в системную папку C:\WINDOWS\SYSTEM32\ и снова запустить уже оттуда
- Вызвать себя с другими параметрами командной строки
- просто перевызвать себя (без уничтожения и переименования). Тогда батник получится намного проще. И всё же, неплохо бы дать задержку, хотя бы вслепую (ну, хотя бы один цикл, как показано выше), чтобы программа могла завершить свои дела и не пересекаться со своей новой инкарнацией.

2. Неубиваемые программы.

Пусть у нас реализован (как подпрограмма) самоперезапуск. Даже проще, без копирования, переименования и переноса, а просто перезапуск этого же EXEшника через BATник, который создаётся перед "смертью" процесса. Тот батник потом тоже делает себе харакири, выполнив свою миссию. И не оставляет никаких следов.

Итак, мы можем
- Ловить сообщения Windows. Например, в том цикле, где у нас крутится GetMessage или PeekMessage. Среди них есть собщения WM_CLOSE для Главного окна и WM_QUIT - то есть, приказ умереть Бывает ещё WM_SHUTDOWN, но это уже бесполезно для нас. Надо всё же позволять выключить компьютер.
- Обрабатывать события в понятиях объектов и компонентов. Например, ловить событие OnDestroy для главной экранной формы (это кто использует VCL и пишет на Delphi или Borland C++ Builder). Можно использовать деструктор класса, и иметь глобальный объект этого класса со статическим размещением. В нормальных объектно-ориентированных системах он должен быть вызван при завершении.
- Навтыкать это во всех местах, но во избежание конфликтов между этими местами, завести себе глобальную переменную, по которой смотреть, надо ли это делать, и отмечать, что "сделано".

И во всех этих случаях делать самоперезапуск. Тогда даже если мы снимаем эту задачу через Ctrl-Alt-Del или Менеджер Процессов, но, конечно, при условии, что сама она не подвисла, Windows (или его Менеджер задач) сначала посылает процессу сообщение WM_CLOSE или WM_QUIT. То есть, даёт ей шанс самой корректно завершиться. И только если она не отвечает в течение какого-то времени и не выполняет приказ "сдохни", то Менеджер Задач грубо обрывает её API-функцией TerminateProcess... Но сначала всё же пытается по-хорошему. Дело в том что TerminateProcess может приводить к утечке некоторых ресурсов, и вообще, не рекомендуется для использования (она как пожарный шланг, не для постоянного употребления). Или, может быть, даже сама APIшная реализация TerminateProcess сначала пытается остановить процесс по-хорошему. Но в данном случае мы реагируем именно по-хорошему. То есть, умираем. Со стороны Windows к нам никаких претензий нет. Но мы косвенно (даже не сами сразу, а через батник) завещаем запустить заново свою новую инкарнацию. А это уже - другой процесс. Результатом будет "неубиваемый" процесс.

Разумеется, пока EXEшный файл работает, никто не может его удалить, перезаписать... Но для батника, которому эта программа завещала свой труп, это не проблема. Для пущей надёги его можно самопереместить в системную папку C:\Windows\System32, сделать ReadOnly, Hidden, System... Тогда ни у кого рука не поднимется с ним что-то делать.

3. Автозапуск

А теперь как обеспечить его автозапуск. Есть много способов. Есть папка Autorun (Автозапуск). Есть файл WIN.INI (по крайней мере, в Windows-95,98,ME). Но большинство программ автозапускаются по реестру.

Лезем в реестр. Там есть несколько разделов
HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN
HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUNONCE
HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUNONCEEX
HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUNSERVICES
HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUNSERVICESONCE
HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN
и т.д.
В каждом из них перечисляются все программы, которые надлежит стартовать при входе в систему.
Из HKEY_LOCAL_MACHINE автозапуску подлежат программы для всех юзеров. Из HKEY_CURRENT_USER - только для этого юзера. В HKEY_USERS перечислены все пользователи, но один из них (который сейчас текущий) отображается дважды: там и в HKEY_CURENT_USER.
Сервисы запускаются раньше входа в систему любого юзера, и им даются все полномочия администратора (доступ к папкам, право на запуск программ и т.п.). В каждо таком разделе реестра параметры выглядят так:

имя=командная строка вызова программы возможно с параметрами

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

Для работы со статьями и параметрами реестра есть соответствующие API-функции.

Тут мы можем
3.1. Занести туда запись о себе. То есть, просто командную строку вызова с параметрами. И даже как-нибудь красиво себя там назвать, чтобы это было похоже на какую-нибудь системную задачу. Чтобы не только средний ламер, но и системный админ отнёсся к ней с почтением.
3.2. С некоторой периодичностью (скажем, раз в секунду или в 10 секунд) проверять там наличие этой записи о себе, и восстанавливать её, если она там вдруг исчезла. Почему исчезла? Ну, мало ли?...
3.3. Обязательно делать это в начале своей работы и при отработке автоперезапуска перед смертью.

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

Тогда никакая сволочь не сможет вымарать тебя оттуда, даже если напрямую полезет в реестр. То есть, вымарает, и даже сама для себя убедится, что тебя там больше нету, но через какое-то время (считанные миллисекунды) ты там снова возникнешь. А эта сволочь (и даже живой юзер через RegEdit, RegCleaner или что там у него есть ещё) этого не увилит (если только не догадается сделать Refresh). Но если даже и догадается, то пусть беснуется в бессильной злобе...

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

4. Про сетевых шпионов.

А что такое "открытый порт"? Это когда какая-то сетевая служба, установленная на твоём компе, готова принять и обработать какие-то данные, присылаемые на твой адрес? Тогда проще просто отключить наф сами эти службы... Наф тебе сервер на домашнем компе? Да и вообще, стандартные сетевые службы мало чего дадут для настоящего шпиона. Там не так уж и много "дыр", а те постоянно латаются.

Но твоя программа, которая такая живучая и неубиваемая, может делать всё что хочет. Например, используя WinSock (Windows Sockets) создать входящий сокет по протоколу TCP/IP и ждать соединение по нему. Дождавшись, она может получить новый (входящий) сокет (то есть, входящее соединение) и создать отдельный поток (CreateThread), который будет вести диалог по этому соединению. То есть, выступать как сервер. По какому протоколу - как сам его реализуешь. Хоть по своему собственному. Номер порта там - какой укажешь (если только он не занят уже). Можно даже захватывать порты в стандартном диапазоне номеров. Или перебирать, ища первый свободный.

А можно сделать наоборот. Пускай твоя программа сама устанавливает исходящее соединение (то есть, как бы Клиент) с каким-то заранее известным Сервером, который находится где-то в Интернете, и докладывает туда как Алекс Юстасу... Или спрашивает у него указаний и исполняет их от своего имени на этом компьютере... Протокол общения может быть какой угодно. Хоть обмен текстовыми командами, вопросами и ответами. Или твоя программа может сама назваться хоть "интернет-эксплорером". И никакой файрволл его не остановит. И сервер, и клиент ты пишешь сам, и можешь не оглядываться ни на какие стандартные протоколы передачи данных (которые ещё дубовее, чем можешь придумать ты сам). А ещё лучше чем TCP/IP использовать дейтаграммы UDP или просто пакеты Simple IP. Надёжность тогда придётся отслеживать самому. То есть, организовывать внутреннюю нумерацию пакетов (или дейтаграмм), контроль, подтверждения, таймауты, повторы, целостность... Зато никакая зараза не узнает, что ты по каким-то своим, одному тебе ведомым понятиям, установил некое подобие виртуального соединения с каким-то особым, одному тебе ведомым сервером, и действуешь по заданию Центра. С точки зрения системы ты просто обмениваешься какими-то низкоуровневыми пакетами... Эти пакеты можно даже маскировать под какой-нибудь безобидный протокол, ну, скажем, запрос на получение точного времени... Если твой собственный сервер тоже знает обо всех этих условностях для маскировки, то ему это будет поф (только трафик будет чуть побольше). А о чём вы на самом деле... Ну, это дело можно и зашифровать. Алгоритмы шифрования и расшифровки рассматриваются в разных книжках, там есть и примеры...

А запросы к серверу и ответы могут быть такими:
- Здравствуй, господин Сервер! Это я, твой Клиент, с такого-то IP-адреса! Чё мне тут терерь делать?
- Давай сюда все адреса, телефоны, пароли, явки!
- Пожалуйста, о мой Господин! - далее следуют адреса, телефоны, пароли и явки.
- А ну-ка, Что там у тебя в такой-то статье реестра?
- То-то и то-то, о мой Господин!
- А засади-ка туда теперь вот это!
- Слушаюсь и повинуюсь, мой Господин!
- А теперь скачай из Интернета (вот тебе УРЛ) такой-то вирус!
- Есть!
- И запусити его на выполнение!
- Слушаюсь!
- А теперь выключи компьютер, сожги процессор, отформатируй диск, выжги монитор и вообще взорви всё нах!
- Бубух!

Кто тут кому сервер, а кто клиент - это уж они сами меж собой разберутся. А в заголовках пакетов пускай значится безобидный протокол, хоть бы и HTTP, и номера портов все - стандартные... Ну, если кто-то другой сдуру обратится к тому "серверу", то ему можно даже не отвечать... Мало ли в Инете таких битых серверов, которые не отвечают?

5. Как сделать программу невидимой.

Это проще всего. Просто надо НЕ ДЕЛАТЬ чего-то такого, что делает её видимой. Например, сделать её как GUI- (а не консольное) приложение и использовать WinMain вместо main (это если на C/C++, разумеется), но там НЕ создавать никакого окна, НE регистрировать оконный класс, и вообще, не делать ничего, связанного с окнами. И НЕ пользоваться тем, что предлагает автоматизированная среда разработки. Убрать нафиг Главную экранную форму (как объект, если его автоматически предлагает создать среда разработки типа Borland C++ Builder), не создавать её и не инициализировать. А вместо этого самому (даже в WinMain'е) организовать цикл PeekMessage и обрабатывать их. Нас интересует только WM_QUIT, остальные, - как рекомендуется, обрабатывать по умолчанию.

Но можно сделать и окно. Но установить его в режим отображения SW_HIDE. Обычно это всё делается не через API, а методами объектно-ориентированных оболочек, таких как MFC, VCL и иже с ними. Но суть - та же самая. Окно - есть. Но его не видно. Потому что оно HIDE.
Такая программа будет вести себя как резидентная (TSR) программа в старые добрые DOSовские времена. Но у Windows даже в минимальной конфигурации выполняются несколько десятков таких невидимых процессов.

Ах, да, чтобы такая программа не жрала как собака процессорное время, то когда ей нечем себя занять, пускай вызывает Sleep(0), Это такая APIшная функция. Можно программу "уложить спать" на заданное количество миллисекунд, но даже если на 0 (это её параметр), то она просто отдаёт системе квант времени, выделенного ей, не дожидаясь когда система отберёт его сама. Скажем, квант времени составляет 1 мс (это я к примеру, чисто условно). Он выделен этому процессу. Положим, это одноядерный процессор с тактовой частотой 3 ГГц. Будучи суперскалярным, он может за это время выполнить 1-6 млн. машинных команд (смотря какие там команды ему попадутся, а так же параллельно задействовать FPU, MMU...). Но выполнив небольшую проверку (например, всего за 1000 команд - сотня строк исходного кода) он понимает, что делать пока нечего. Это в 1-6 тыс. раз меньше, чем он мог бы выполнить за свою честную миллисекунду (фактически у него ушла на все эти проверки доля микросекунды). Тогда он делает Sleep(0), и отдаёт этот квант времени, использовав сотые доли процента от него. И в результате, "использование процессорного времени" этой задачей составит сотые доли процента. Если посмотреть Менеджером задач, то почти все процессы ведут себя так Использование процессора почти у всех 0% (ну, много меньше 1%). Впрочем, вызов Sleep(0) заделан и в GetMessage, и в PeekMessage... Так что, если крутится этот цикл, то можно не волноваться.

6. Как внедриться в систему

Тут важно чтобы эта прога была запущена хотя бы первый раз. Дальше уж она сама так вцепится, что и с мясом не вырвешь. Если мы её сами так напишем. А уж мы-то умеем!... Вся сложность в том, как заставить юзера запустить её первый раз. Ну, можно предложить ему супер-программу, которая делает именно то, что ему давно уже надо. Это будет классический троян. Вирусы и червяки умеют внедряться сами. Проще всего это сделать через AutoRUN на CD-rom и на флешках. Обычно, когда суёшь флешку в USB, то Windows пытается "распознать" и запустить то, что там... Ну, это как во времена дискет. Тогда было много бутовских вирусов. Суёшь дискетку в дисковод, обращаешься к ней в первый раз, а система читает бут-сектор и исполняет машинный код, записанный там, хочешь ты того или не хочешь. А я у себя давно отключил автораспознавание флешек и CD-ROMов. Ну, короче, надёжного и универсального способа нет. Есть много мелких дыр, которые где-то заделаны, а где-то нет. Тогда надо ломиться во все сразу. Тогда есть шанс.

Можно написать ActiveX-элемент, и поместить его на HTML-страницу, и разместить на своём сайте. У многих юзеров в настройках разрешено использовать ActiveX. Но именно этого у него нет. Тогда ему предлагается его установить. А вдруг у него в настройках разрешено и это? А вдруг он согласится? Вот, тут-то ему и можно подсунуть нечто...


--------------------
Теперь всё, я сюда больше не приду. Никогда.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение

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

 

- Текстовая версия Сейчас: 13th April 2021 - 01:23
 
     
Rambler's Top100 службы мониторинга серверов
Gentoo Powered Lighttpd Powered