|
С/C++
Xakep, номер #048, стр. 048-087-2 #pragma comment(linker,"/MERGE:.rdata=.text") #pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078") #pragma comment(linker,"/ENTRY:WinMain") Вот мы и подошли к самому главному в программе - точке входа, функции которой передается управление после запуска. У нее существует четыре параметра, ни один из которых нам не понадобится, поэтому название параметров я не пишу, а пишу только их тип. int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ Первым делом мы должны скопировать себя в системную директорию. Создаем два строковых буфера по 256 символов каждый. Первый для хранения полного пути с именем запущенного трояна (не будешь же распространять trojan.exe), а второй для нового пути в системной директории. Полный путь с именем файла нам придется получить с помощью функции ядра GetModuleFileName. Передавая в первом параметре GetModuleHandle(0), мы сообщаем функции описатель модуля запущенного файла, во втором и третьем параметре буфер, в который писать путь и ее размер соответственно. Путь, куда будем копировать, мы получим с помощью функции GetSystemDirectory, сообщив ей в параметрах второй буфер и склеив ее с новым именем файла в формате "\\trojan.exe". Вызываем CopyFile с нашими, уже заполненными буферами в первых двух параметрах и true в третьем, если мы не хотим перезаписывать существующий файл, или false, если хотим. Дальше с помощью функций работы с реестром мы запишем в SOFTWARE\Microsoft\Windows\CurrentVersion\Run свой свежескопированный файл, чтобы он грузился при каждом запуске системы. Троян загружен и готов к круговой обороне (атаке :)). Слушаем порт Наконец мы добрались до самого важного участка кода, без которого троян - это не троян. Участка, отвечающего за обмен данными жертвы с тобой :). Как ты уже, наверное, знаешь из статей Horrific`а, для использования функций winsock`а его сначала требуется инициализировать. В сях это делается следующим кодом: WSADATA wsaData; WSAStartup(MAKEWORD(2,2), &wsaData); После инициализации можно приступать к работе с сокетами. Для начала мы создадим сокет listet_Sock с помощью функции socket. Во втором параметре этой функции мы передадим ей defined значение SOCK_STREAM, что означает, что мы будем использовать для связи потоковый протокол TCP. Если бы мы хотели юзать UDP, то передали бы SOCK_DGRAM. SOCKET listet_Sock = socket(AF_INET,SOCK_STREAM,0); Теперь мы должны задать свойства этого сокета, то есть номер открываемого нами порта, возможные для соединения ip-адреса и семейство сокетов, параметр AF_INET, который указывает на то, что мы работаем с интернетом. Для этих свойств существует структура sockaddr_in, которую мы и заполним. //создаем переменную со свойствами SOCKADDR_IN addr_Sock; addr_Sock.sin_family = AF_INET; |