Давно не писал новых статей по MASM, решил наконец-то продолжить цикл. Думаю, вы уже прочитали первые две статьи (эту и эту тоже) и разобрали их содержание. Пришло время поговорить о других возможностях MASM32. Возьмите исходный код из самой первой статьи, из той, в которой мы делали самое первое GUI-приложение, будем его использовать как базу для нового проекта.
В общем, сначала идея была проста... [click]
Но потом...
Программка будет сканировать все порты из указанного диапазона на заданном ip-адресе и выводить информацию в лог. Многопоточность делать не будем, но один поток всё равно создадим, чтобы при сканировании форма не висела.
Сначала я приведу RC-файл, который получился у меня. Можете его использовать:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#define MANIFEST 24 #define PortScanner 1000 #define IDC_IPADDR 1005 #define IDC_PORTLOW 1007 #define IDC_PORTHIGH 1009 #define TEST_BTN 1001 #define IDC_STOP 1003 #define IDC_CLEANLOG 1012 #define IDC_LOG 1010 #define EXIT_BTN 1002 #define IDC_STC1 1004 #define IDC_STC2 1006 #define IDC_STC3 1008 #define IDC_STC4 1011 #define IDC_EDT1 1013 #define IDC_STC5 1014 #define IDC_STC6 1015 #define IDC_OPENONLY 1016 #define IDR_XPMANIFEST1 1 #include "C:/masm32/include/RESOURCE.H" PortScanner DIALOGEX 6,7,272,91 CAPTION "Port Scanner" FONT 8,"MS Sans Serif",0,0,0 STYLE WS_VISIBLE|WS_CAPTION|WS_SYSMENU BEGIN CONTROL "",IDC_IPADDR,"SysIPAddress32",WS_CHILD|WS_VISIBLE|WS_TABSTOP,52,3,74,11 CONTROL "1",IDC_PORTLOW,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_NUMBER,52,16,38,11,WS_EX_CLIENTEDGE CONTROL "65535",IDC_PORTHIGH,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_NUMBER,112,16,38,11,WS_EX_CLIENTEDGE CONTROL "Начать!",TEST_BTN,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,6,60,54,13 CONTROL "Стоп",IDC_STOP,"Button",WS_CHILD|WS_VISIBLE|WS_DISABLED|WS_TABSTOP,66,60,54,13 CONTROL "Очистить",IDC_CLEANLOG,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,232,1,36,13 CONTROL "",IDC_LOG,"Edit",WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|ES_READONLY|ES_MULTILINE,162,16,106,70,WS_EX_CLIENTEDGE CONTROL "Выход",EXIT_BTN,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,6,75,54,13 CONTROL "IP-адрес:",IDC_STC1,"Static",WS_CHILD|WS_VISIBLE,8,5,36,9 CONTROL "Порты от:",IDC_STC2,"Static",WS_CHILD|WS_VISIBLE,8,18,38,9 CONTROL "до",IDC_STC3,"Static",WS_CHILD|WS_VISIBLE,96,18,10,9 CONTROL "Лог сканирования:",IDC_STC4,"Static",WS_CHILD|WS_VISIBLE,162,3,70,9 CONTROL "500",IDC_EDT1,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_NUMBER,82,31,38,11,WS_EX_CLIENTEDGE CONTROL "Таймаут коннекта:",IDC_STC5,"Static",WS_CHILD|WS_VISIBLE,8,33,70,9 CONTROL "ms",IDC_STC6,"Static",WS_CHILD|WS_VISIBLE,124,33,10,9 CONTROL "Логировать только открытые порты",IDC_OPENONLY,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,6,48,140,9 END IDR_XPMANIFEST1 MANIFEST "xpmanifest.xml" |
А теперь, как обычно, я приведу полный исходный код проекта, а потом его по частям прокомментирую.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 |
.386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\macros\macros.asm uselib kernel32, user32, masm32, comctl32, ws2_32 WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD AddLog PROTO :DWORD,:DWORD AddTextLog PROTO :DWORD Check PROTO :DWORD EnableControls PROTO :DWORD PortScanner = 1000 TEST_BTN = 1001 EXIT_BTN = 1002 IDC_STOP = 1003 IDC_IPADDR = 1005 IDC_PORTLOW = 1007 IDC_PORTHIGH = 1009 IDC_LOG = 1010 IDC_CLEANLOG = 1012 IDC_TIMEOUT = 1013 IDC_OPENONLY = 1016 fd_struct STRUCT fd_count dd ? ssock dd ? fd_struct ENDS .data checking db 0 err db "Ошибка", 0 .data? hInstance dd ? hWnd dd ? icce INITCOMMONCONTROLSEX <> ip dd ? porthigh dd ? portlow dd ? stopper db ? timeout dd ? openonly db ? .code start PROC LOCAL WSAStruct :WSADATA invoke WSAStartup, 0101h, addr WSAStruct .if eax != 0 invoke MessageBox, 0, chr$("WSAStartup - ошибка"), offset err, MB_ICONERROR invoke ExitProcess,eax ret .endif mov icce.dwSize, SIZEOF INITCOMMONCONTROLSEX mov icce.dwICC, ICC_DATE_CLASSES or \ ICC_INTERNET_CLASSES or \ ICC_PAGESCROLLER_CLASS or \ ICC_COOL_CLASSES invoke InitCommonControlsEx, offset icce invoke GetModuleHandle, NULL mov hInstance, eax invoke DialogBoxParam, hInstance, PortScanner, 0, offset WndProc, 0 call WSACleanup invoke ExitProcess,eax ret start ENDP WndProc proc hWin :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD switch uMsg case WM_INITDIALOG m2m hWnd, hWin invoke SendMessage, hWin, WM_SETICON, 1, FUNC(LoadIcon, NULL, IDI_ASTERISK) invoke SendDlgItemMessage, hWin, IDC_LOG, EM_SETLIMITTEXT, -1, 0 invoke SendDlgItemMessage, hWin, IDC_PORTLOW, EM_SETLIMITTEXT, 5, 0 invoke SendDlgItemMessage, hWin, IDC_PORTHIGH, EM_SETLIMITTEXT, 5, 0 invoke SendDlgItemMessage, hWin, IDC_TIMEOUT, EM_SETLIMITTEXT, 7, 0 case WM_COMMAND switch wParam case TEST_BTN invoke SendDlgItemMessage, hWin, IDC_IPADDR, IPM_GETADDRESS, 0, offset ip .if eax != 4 invoke MessageBox, hWin, chr$("Введите IP-адрес"), offset err, MB_ICONEXCLAMATION xor eax, eax ret .endif invoke GetDlgItemInt, hWin, IDC_PORTLOW, 0, FALSE .if eax < 1 || eax > 65535 invoke MessageBox, hWin, chr$("Неверно введен начальный номер порта."), offset err, MB_ICONEXCLAMATION xor eax, eax ret .endif mov portlow, eax invoke GetDlgItemInt, hWin, IDC_PORTHIGH, 0, FALSE .if eax < 1 || eax > 65535 || portlow > eax invoke MessageBox, hWin, chr$("Неверно введен конечный номер порта"), offset err, MB_ICONEXCLAMATION xor eax, eax ret .endif mov porthigh, eax invoke GetDlgItemInt, hWin, IDC_TIMEOUT, 0, FALSE .if eax < 10 invoke MessageBox, hWin, chr$("Слишком маленький таймаут"), offset err, MB_ICONEXCLAMATION xor eax, eax ret .endif mov timeout, eax invoke SendDlgItemMessage, hWin, IDC_OPENONLY, BM_GETCHECK, 0, 0 .if eax == BST_CHECKED mov openonly, 1 .else mov openonly, 0 .endif invoke EnableControls, 0 mov stopper, 0 invoke CreateThread, 0, 10240, offset Check, 0, 0, 0 .if eax>0 mov checking, 1 invoke CloseHandle, eax .else invoke MessageBox, hWin, chr$("Не удалось создать поток"), offset err, MB_ICONERROR invoke EnableControls, 1 .endif case IDC_CLEANLOG invoke SetDlgItemText, hWin, IDC_LOG, chr$(0) case IDC_STOP mov stopper, 1 case EXIT_BTN jmp exit_program endsw case WM_CLOSE .if checking == 1 invoke MessageBox, hWin, chr$("Завершите проверку портов перед выходом."), offset err, MB_ICONEXCLAMATION xor eax, eax ret .endif exit_program: invoke EndDialog, hWin, 0 endsw xor eax, eax ret WndProc ENDP Check PROC param :DWORD LOCAL SocketAddress :sockaddr_in LOCAL sock :DWORD LOCAL iMode :DWORD LOCAL fds_r :fd_struct LOCAL fds_w :fd_struct LOCAL fds_e :fd_struct LOCAL tv :timeval mov tv.tv_sec, 0 mov tv.tv_usec, 0 mov iMode, 1 invoke AddTextLog, chr$("Сканирование начато", 13, 10) invoke htonl, ip mov SocketAddress.sin_addr, eax mov SocketAddress.sin_family, AF_INET _testnext: cmp stopper, 1 je _end invoke socket, AF_INET, SOCK_STREAM, IPPROTO_TCP .if eax == INVALID_SOCKET invoke AddTextLog, chr$("ошибка создания сокета", 13, 10) jmp _end .endif mov sock, eax invoke ioctlsocket, sock, FIONBIO, addr iMode .if eax == SOCKET_ERROR invoke closesocket, sock invoke AddTextLog, chr$("Не удалось перевести сокет в неблокирующий режим", 13, 10) jmp _end .endif invoke htons, portlow mov SocketAddress.sin_port, ax invoke connect, sock, addr SocketAddress, sizeof sockaddr_in invoke Sleep, timeout mov fds_r.fd_count, 1 mov fds_w.fd_count, 1 mov fds_e.fd_count, 1 m2m fds_r.ssock, sock m2m fds_w.ssock, sock m2m fds_e.ssock, sock invoke select, 0, addr fds_r, addr fds_w, addr fds_e, addr tv invoke __WSAFDIsSet, sock, addr fds_r push eax invoke __WSAFDIsSet, sock, addr fds_w pop ebx .if eax == 0 && ebx == 0 .if openonly == 0 invoke AddLog, portlow, 0 .endif jmp __next .endif invoke __WSAFDIsSet, sock, addr fds_e .if eax != 0 .if openonly == 0 invoke AddLog, portlow, 0 .endif .else invoke AddLog, portlow, 1 .endif __next: inc portlow invoke closesocket, sock mov eax, porthigh cmp portlow, eax jbe _testnext _end: invoke AddTextLog, chr$("Сканирование завершено", 13, 10) invoke EnableControls, 1 mov checking, 0 invoke ExitThread,0 ret Check ENDP AddLog PROC port :DWORD, opened :DWORD LOCAL buf [20] :BYTE .if opened == 1 invoke wsprintf, addr buf, chr$("%u открыт", 13, 10), port .else invoke wsprintf, addr buf, chr$("%u закрыт", 13, 10), port .endif invoke AddTextLog, addr buf ret AddLog ENDP AddTextLog PROC xstr :DWORD invoke SendDlgItemMessage, hWnd, IDC_LOG, EM_SETSEL, -2, -2 invoke SendDlgItemMessage, hWnd, IDC_LOG, EM_REPLACESEL, 0, xstr ret AddTextLog ENDP EnableControls PROC en :DWORD invoke EnableWindow, FUNC(GetDlgItem, hWnd, IDC_IPADDR), en invoke EnableWindow, FUNC(GetDlgItem, hWnd, IDC_PORTLOW), en invoke EnableWindow, FUNC(GetDlgItem, hWnd, IDC_PORTHIGH), en invoke EnableWindow, FUNC(GetDlgItem, hWnd, IDC_CLEANLOG), en invoke EnableWindow, FUNC(GetDlgItem, hWnd, TEST_BTN), en invoke EnableWindow, FUNC(GetDlgItem, hWnd, EXIT_BTN), en invoke EnableWindow, FUNC(GetDlgItem, hWnd, IDC_TIMEOUT), en invoke EnableWindow, FUNC(GetDlgItem, hWnd, IDC_OPENONLY), en xor en, 1 invoke EnableWindow, FUNC(GetDlgItem, hWnd, IDC_STOP), en ret EnableControls ENDP end start |
Самое начало пояснять не буду - вы все уже и так знаете: объявление необходимых директив, подключение файлов (среди которых добавился ws2_32 для работы с сокетами), объявление прототипов процедур, которые я опишу дальше, и объявление констант из rc-файла. Далее идет объявление структуры fd_struct, про нее я тоже расскажу дальше. В любом случае, теперь вы знаете, как объявляются структуры в MASM32.
Дальше начинается секция данных и неинициализированных данных:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
.data checking db 0 ;эта переменная будет указывать, ;происходит ли проверка портов в данный ;момент времени, или нет err db "Ошибка", 0 ;заголовок сообщений об ошибках .data? hInstance dd ? ;указатель на модуль ;нашего исполняемого файла hWnd dd ? ;хендл нашего окна icce INITCOMMONCONTROLSEX <> ip dd ? ;ip-адрес, на котором будем ;производить сканирование портов porthigh dd ? ;максимальный порт, до которого ;будем сканировать portlow dd ? ;минимальный порт, от которого начнем ;сканирование stopper db ? ;эта переменная будет индикатором ;для остановки потока сканирования, про нее ;я еще немного расскажу дальше timeout dd ? ;здесь будем хранить таймаут коннекта ;к порту openonly db ? ;логировать только открытые порты или все |
Собственно, а как же мы будем производить сканирование? Пользователь вводит ip-адрес, диапазон портов для сканирования и жмет старт, после чего программа создает поток, который по очереди ко всем портам пытается подключиться (соответственно, сканируем только TCP-порты). Если подключение удалось - порт открыт, если нет - закрыт.
Теперь дальше к коду. Инициализацию я обернул в процедуру, и здесь приходит время познакомиться с локальными переменными. Вы, наверное, уже знаете, что во многих языках программирования в функциях можно создавать локальные переменные, которые после выхода из функции удаляются, так как хранятся в стеке. MASM не является исключением.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
.code start PROC ;процедура инициализации (точка входа) LOCAL WSAStruct :WSADATA ;вот она - локальная ;переменная типа WSADATA с именем WSAStruct ;структура WSADATA объявлена в файле ws2_32.inc, ;который лежит в папке masm32/include, и который мы ;с вами подключили в самом начале. Можете ;его открыть и посмотреть, что в этой структуре ;В любом случае, инициализировать нам ее не надо, ;она лишь используется для инициализации системы ;winsock в программе: invoke WSAStartup, 0101h, addr WSAStruct ;вот так ;0101h - это версия winsock. Мы используем winsock 1.1 ;можно использовать и 2.2 (1010h), это не столь важно ;в этом примере. Подробнее - читайте msdn .if eax != 0 ;если какая-то ошибка invoke MessageBox, 0, chr$("WSAStartup - ошибка"), offset err, MB_ICONERROR invoke ExitProcess, eax ;то выйдем ret .endif ;инициализация контролов mov icce.dwSize, SIZEOF INITCOMMONCONTROLSEX mov icce.dwICC, ICC_DATE_CLASSES or \ ICC_INTERNET_CLASSES or \ ICC_PAGESCROLLER_CLASS or \ ICC_COOL_CLASSES invoke InitCommonControlsEx, offset icce invoke GetModuleHandle, NULL mov hInstance, eax ;создаем окно invoke DialogBoxParam, hInstance, PortScanner, 0, offset WndProc, 0 ;перед выходом освободим ресурсы winsock call WSACleanup invoke ExitProcess, eax ret start ENDP |
Далее идет процедура обработки оконных сообщений:
1 2 3 4 5 6 7 8 9 |
WndProc proc hWin :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD switch uMsg case WM_INITDIALOG m2m hWnd, hWin invoke SendMessage, hWin, WM_SETICON, 1, FUNC(LoadIcon, NULL, IDI_ASTERISK) invoke SendDlgItemMessage, hWin, IDC_LOG, EM_SETLIMITTEXT, -1, 0 invoke SendDlgItemMessage, hWin, IDC_PORTLOW, EM_SETLIMITTEXT, 5, 0 invoke SendDlgItemMessage, hWin, IDC_PORTHIGH, EM_SETLIMITTEXT, 5, 0 invoke SendDlgItemMessage, hWin, IDC_TIMEOUT, EM_SETLIMITTEXT, 7, 0 |
При инициализации окна мы теперь не только устанавливаем его иконку, но и ограничиваем длины полей. Для поля лога снимаем ограничение на максимальную длину (передаем в оконном сообщении EM_SETLIMITTEXT число -1), а у других полей ставим разумные ограничения.
Теперь - код, который выполняется при нажатии на кнопку "Начать!":
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
case WM_COMMAND switch wParam case TEST_BTN invoke SendDlgItemMessage, hWin, IDC_IPADDR, IPM_GETADDRESS, 0, offset ip ;получаем ;ip-адрес из поля ввода IP-адресов с помощью специального ;оконного сообщения .if eax != 4 ;если введено меньше, чем четыре октета invoke MessageBox, hWin, chr$("Введите IP-адрес"), offset err, MB_ICONEXCLAMATION xor eax, eax ret ;выходим из процедуры .endif ;получаем начальный номер порта invoke GetDlgItemInt, hWin, IDC_PORTLOW, 0, FALSE .if eax < 1 || eax > 65535 ;и проверяем его invoke MessageBox, hWin, chr$("Неверно введен начальный номер порта."), offset err, MB_ICONEXCLAMATION xor eax, eax ret .endif mov portlow, eax ;запоминаем ;получаем конечный номер порта invoke GetDlgItemInt, hWin, IDC_PORTHIGH, 0, FALSE .if eax < 1 || eax > 65535 || portlow > eax ;и снова проверяем invoke MessageBox, hWin, chr$("Неверно введен конечный номер порта"), offset err, MB_ICONEXCLAMATION xor eax, eax ret .endif mov porthigh, eax ;и запоминаем ;наконец, получаем значение таймаута подключения invoke GetDlgItemInt, hWin, IDC_TIMEOUT, 0, FALSE .if eax < 10 ;и небольшая проверка invoke MessageBox, hWin, chr$("Слишком маленький таймаут"), offset err, MB_ICONEXCLAMATION xor eax, eax ret .endif mov timeout, eax ;запоминаем его ;смотрим, не установлена ли опция "Логировать только открытые порты" ;с помощью оконного сообщения BM_GETCHECK invoke SendDlgItemMessage, hWin, IDC_OPENONLY, BM_GETCHECK, 0, 0 .if eax == BST_CHECKED ;и если галочка установлена mov openonly, 1 ;то запоминаем 1 .else mov openonly, 0 ;если нет, то 0 .endif invoke EnableControls, 0 ;блокируем некоторые элементы управления ;эта процедура определена в самом конце кода, я ее потом опишу mov stopper, 0 ;сбрасываем флаг остановки потока ;создаем поток, который будет выполнять процедуру Check ;советую заглянуть в msdn, чтобы понять параметры ;функции CreateThread invoke CreateThread, 0, 10240, offset Check, 0, 0, 0 .if eax>0 ;если все ОК mov checking, 1 ;устанавливаем флаг, говорящий о том, ;что идет проверка ;ну и закрываем хендл потока - он нам больше не нужен, ;только память занимает invoke CloseHandle, eax .else ;если ошибка invoke MessageBox, hWin, chr$("Не удалось создать поток"), offset err, MB_ICONERROR invoke EnableControls, 1 .endif |
Теперь - несколько обработчиков нажатий других кнопок:
1 2 3 4 5 6 7 8 9 10 11 |
case IDC_CLEANLOG ;очистка поля лога ;с помощью функции SetDlgItemtext устанавливаем ;пустой текст в поле лога (chr$(0)). invoke SetDlgItemText, hWin, IDC_LOG, chr$(0) case IDC_STOP ;если пользователь нажал Стоп при проверке ;то устанавливаем флаг остановки потока, чтобы поток ;узнал, что его хотят остановить mov stopper, 1 case EXIT_BTN ;выход, тут все как в первом уроке jmp exit_program endsw |
Здесь я должен сказать немного больше о переменной типа байт stopper, которую мы устанавливаем в 1, когда пользователь хочет остановить проверку портов раньше времени. Дело в том, что мы могли бы просто убить поток с помощью WinAPI-функции TerminateThread (для этого нам не следовало закрывать хендл потока с помощью CloseHandle), но это не совсем корректный, хоть и быстрый, путь. На MSDN перечислены проблемы, которые могут возникнуть при таком убийстве потока. Мы будем использовать переменную stopper, чтобы сообщить потоку, что мы хотим его завершить, и он сам корректно завершит своё выполнение, увидем, что stopper выставлена в единицу.
Теперь еще некоторые изменения в процедуре обработки оконных сообщений:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
case WM_CLOSE .if checking == 1 ;если проверка в данный момент времени идет ;скажем пользователю, чтобы завершил ее, и только потом ;завершал работу программы invoke MessageBox, hWin, chr$("Завершите проверку портов перед выходом."), offset err, MB_ICONEXCLAMATION xor eax, eax ret .endif exit_program: invoke EndDialog, hWin, 0 endsw xor eax, eax ret WndProc ENDP |
А теперь перейдем к разбору процедуры, которая будет выполняться в отдельном потоке. Это - самая сложная часть, и вы сможете действительно гордиться собой, если разберетесь, как она работает.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Check PROC param :DWORD ;начало процедуры ;объявление локальных переменных LOCAL SocketAddress :sockaddr_in LOCAL sock :DWORD LOCAL iMode :DWORD LOCAL fds_r :fd_struct LOCAL fds_w :fd_struct LOCAL fds_e :fd_struct LOCAL tv :timeval mov tv.tv_sec, 0 ;инициализация некоторых переменных mov tv.tv_usec, 0 mov iMode, 1 invoke AddTextLog, chr$("Сканирование начато", 13, 10) ;говорим о начале сканирования |
Что же произошло в этом кусочке кода? Во-первых, мы объявили начало процедуры. У нее есть один входной параметр (я назвал его param). Этот параметр может пригодиться, если мы из главного потока, который создает вторичный поток, этому самому вторичному потоку хотим передать какую-то информацию. Например, его номер. Мы это использовать не будем, потому что поток у нас всего один, и передавать нам в него ничего не требуется. Если вы уже заходили на msdn и читали описание функции CreateThread, то вы уже в курсе, откуда берется этот параметр.
Далее мы объявили несколько локальных переменных - первая socketAddress типа sockaddr_in (эта структура опять-таки объявлена в masm32/include/ws2_32.inc), используется для подключения сокета. Далее sock - в ней мы будем хранить хендл сокета. Переменная iMode, в которую мы записали 1, будет использоваться для перевода сокета в неблокирующий режим (потом поясню, что это такое и зачем). Далее идут три переменные одинакового типа fd_struct (помните, это та структура, которую мы определили в самом начале исходного кода?). Они будут использоваться для определения, открыт ли порт. Далее идет переменная tv типа timeval, в поля которой мы записываем нули. Эта переменная служит для хранения времени в секундах и миллисекундах для задания таймаута функции select (опять-таки, поясню дальше, зачем).
Идем дальше.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
;здесь мы приводим ip-адрес в вид, ;необходимый для функции connect invoke htonl, ip mov SocketAddress.sin_addr, eax ;и записываем ;его в структуру ;здесь мы пишем AF_INET (других значений не бывает) mov SocketAddress.sin_family, AF_INET ;начало цикла проверки портов _testnext: cmp stopper, 1 ;вот тут мы смотрим, а не ;хотят ли остановить поток? ;то есть сравниваем stopper с единицей je _end ;и если хотят, то выходим из цикла ;je - "jump equal" - перейти, если равно ;создаем сокет TCP invoke socket, AF_INET, SOCK_STREAM, IPPROTO_TCP .if eax == INVALID_SOCKET ;если ошибка - завершаем проверку invoke AddTextLog, chr$("ошибка создания сокета", 13, 10) jmp _end .endif mov sock, eax ;запоминаем хендл сокета |
В этом кусочке должно быть все понятно, а вот дальше идет более сложный момент:
1 2 3 4 5 6 |
invoke ioctlsocket, sock, FIONBIO, addr iMode .if eax == SOCKET_ERROR invoke closesocket, sock invoke AddTextLog, chr$("Не удалось перевести сокет в неблокирующий режим", 13, 10) jmp _end .endif |
Здесь мы переводим сокет в неблокирующий режим. Зачем это надо? По умолчанию созданный сокет будет работать в блокирующем режиме. То есть, все функции вроде connect, send, recv будут блокировать выполнение нашей программы до тех пор, пока не завершатся. Нас такое положение дел не устраивает, ведь мы хотим возможность задавать таймаут для connect! Поэтому нам необходим неблокирующий режим, в котором функции выполняются и не блокируют нашу программу, сразу возвращая управление.
1 2 3 4 5 6 |
invoke htons, portlow mov SocketAddress.sin_port, ax invoke connect, sock, addr SocketAddress, sizeof sockaddr_in invoke Sleep, timeout |
Здесь мы переводим в нужный вид порт, который содержится в переменной portlow (т.е. начальное значение) и тоже записываем его в структуру SocketAddress. После чего делаем попытку подключить сокет, используя только что заполненную структуру. Потом идет вызов функции Sleep, которая приостанавливает выполнение потока на заданное число миллисекунд (а задает его пользователь). Функция connect выполнение потока не блокирует, потому что у нас активирован неблокирующий режим, а тихо работает себе в фоне. Но вот как же узнать, подключился ли сокет спустя заданное время, или нет? Пожалуй, это самый хитрый момент программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
mov fds_r.fd_count, 1 mov fds_w.fd_count, 1 mov fds_e.fd_count, 1 m2m fds_r.ssock, sock m2m fds_w.ssock, sock m2m fds_e.ssock, sock invoke select, 0, addr fds_r, addr fds_w, addr fds_e, addr tv invoke __WSAFDIsSet, sock, addr fds_r push eax invoke __WSAFDIsSet, sock, addr fds_w pop ebx .if eax == 0 && ebx == 0 .if openonly == 0 invoke AddLog, portlow, 0 .endif jmp __next .endif invoke __WSAFDIsSet, sock, addr fds_e .if eax != 0 .if openonly == 0 invoke AddLog, portlow, 0 .endif .else invoke AddLog, portlow, 1 .endif __next: |
Пришло время поговорить о структуре fd_struct, которая была определена в начале кода. Эта структура, вообще говоря, имеет произвольный размер, и используется функцией select для определения, какие из сокетов, указанные в этой структуре, готовы к чтению/записи или вернули ошибку. Функция select используется как раз в неблокирующем режиме, потому что позволяет приостановить выполнение до тех пор, пока статус какого-либо из указанных в структурах сокетов не изменится. Время ожидания можно менять, его мы задали в переменной tv - по нулям. То есть, в нашем случае функция select проверит, какие из сокетов, заданные в структуре fds_r, готовы к чтению, какие из сокетов из fds_r готовы к записи, и какие из сокетов из fds_e вернули ошибку. В этих структурах всего по одному сокету (он у нас и есть один), поэтому я и сделал частный случай структуры fd_set (она описана на msdn) под единственный сокет, и в счетчик сокетов мы загружаем единицу. Блокироваться выполнение потока не будет, потому что, как я уже сказал, таймаут задан как 0. Конечно же, вам следует прочитать описание функции select и на msdn, чтобы все полностью встало на свои места.
Еще пара слов о макросе m2m (и не помню уже, вроде бы не пояснял его). Команда mov поддерживает формы
mov [регистр], [память]
mov [память], [регистр]
mov [регистр], [число]
mov [память], [число]
mov [регистр], [регистр]
Но вот формы mov [память], [память] не существует, поэтому, чтобы загрузить значение из памяти в память, следует воспользоваться либо регистром, либо стеком. То есть, писать либо "push memory1; pop memory2", либо "mov eax, memory1; mov memory2, eax". Макрос m2m реализует первую операцию (точнее, две операции) просто ради того, чтобы меньше писать. Макрос mrm реализует вторые две операции. Это уж на ваш вкус, что использовать для пересылки данных из памяти в память. Но нужно помнить, что макрос mrm не сохраняет значение регистра eax.
Так, ладно. Самая задница позади, и можно немножко расслабиться.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
invoke __WSAFDIsSet, sock, addr fds_r push eax invoke __WSAFDIsSet, sock, addr fds_w pop ebx .if eax == 0 && ebx == 0 .if openonly == 0 invoke AddLog, portlow, 0 .endif jmp __next .endif invoke __WSAFDIsSet, sock, addr fds_e .if eax != 0 .if openonly == 0 invoke AddLog, portlow, 0 .endif .else invoke AddLog, portlow, 1 .endif __next: |
После вызова select все три структуры (fds_r, fds_w, fds_e) будут содержать информацию о сокетах, пригодных для чтения, записи, и о возвративших ошибку соответственно. Далее идут проверки - если наш сокет не присутствует в структурах fds_r и fds_w, то есть не пригоден для записи и чтения, значит, он не подключен, т.е., порт закрыт. После этого идет проверка, не вернул ли сокет ошибку (не содержится ли он в структуре fds_e). Если вернул - опять-таки сокет не подключен. И только в том случае, если все эти условия остались невыполненными, сокет можно считать подключенным и порт, соответственно, открытым. Функция __WSAFDIsSet как раз проверяет наличие нужного сокета в заданной структуре.
1 2 3 4 5 6 7 8 9 10 11 |
inc portlow ;увеличиваем минимальное значение порта на единицу ;закрываем сокет и освобождаем его хендл invoke closesocket, sock mov eax, porthigh cmp portlow, eax ;сравниваем максимальное значение порта с минимальным jbe _testnext ;если оно меньше или равно - переходим на начало цикла ;(jbe = "jump below equal" = "переход, если ниже или равно") ;(сравнение беззнаковое. Если бы мы хотели знаковое, следовало бы использовать ;jle - "jump lower equal" = "переход, если меньше или равно" |
Почему мы просто не написали cmp portlow, porthigh? Потому что инструкция cmp, как и mov, не поддерживает форму cmp [память], [память], пришлось воспользоваться регистром eax.
1 2 3 4 5 6 7 |
_end: ;конец проверки invoke AddTextLog, chr$("Сканирование завершено", 13, 10) invoke EnableControls, 1 ;разблокируем элементы управления mov checking, 0 ;говорим о том, что проверка завершена invoke ExitThread,0 ;завершаем поток ret Check ENDP |
Следует отметить, что поток нужно завершать именно функцией ExitThread. Просто инструкция ret здесь прокатит, но это не слишком корректное решение, так как не все ресурсы будут освобождены.
Ну как, мозги уже кипят? Ничего, осталось разобрать всего несколько вспомогательных функций, которые используются в нашей программе.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
;эта процедура добавляет в лог запись о том, открыт ли ;порт port или нет AddLog PROC port :DWORD, opened :DWORD LOCAL buf [20] :BYTE ;локальная переменная ;массив байт из 20 штук .if opened == 1 ;если порт открыт invoke wsprintf, addr buf, chr$("%u открыт", 13, 10), port .else ;если нет invoke wsprintf, addr buf, chr$("%u закрыт", 13, 10), port .endif invoke AddTextLog, addr buf ;вызываем процедуру записи в лог ret AddLog ENDP ;процедура записи текста в лог AddTextLog PROC xstr :DWORD ;она просто шлет текстовому полю лога два оконных сообщения ;первое ставит курсор на позицию "конец текста" ;в msdn есть запись ;"If the start is 0 and the end is –1, all the text in the edit control is selected." ;"If the start is –1, any current selection is deselected." ;поэтому, чтобы перейти в самый конец текста, ставим -2. invoke SendDlgItemMessage, hWnd, IDC_LOG, EM_SETSEL, -2, -2 ;второе сообщение - вставка текста на позицию "конец текста", ;на которую мы и перешли invoke SendDlgItemMessage, hWnd, IDC_LOG, EM_REPLACESEL, 0, xstr ret AddTextLog ENDP |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
EnableControls PROC en :DWORD ;процедура, блокирующая ;или разблокирующая некоторые контролы на нашей форме ;в зависимости от параметра "en" либо блокируем, либо разблокируем ;некоторые кнопки и поля invoke EnableWindow, FUNC(GetDlgItem, hWnd, IDC_IPADDR), en invoke EnableWindow, FUNC(GetDlgItem, hWnd, IDC_PORTLOW), en invoke EnableWindow, FUNC(GetDlgItem, hWnd, IDC_PORTHIGH), en invoke EnableWindow, FUNC(GetDlgItem, hWnd, IDC_CLEANLOG), en invoke EnableWindow, FUNC(GetDlgItem, hWnd, TEST_BTN), en invoke EnableWindow, FUNC(GetDlgItem, hWnd, EXIT_BTN), en invoke EnableWindow, FUNC(GetDlgItem, hWnd, IDC_TIMEOUT), en invoke EnableWindow, FUNC(GetDlgItem, hWnd, IDC_OPENONLY), en xor en, 1 ;делаем отрицание, т.е., если en было 0, то станет 1, и наоборот invoke EnableWindow, FUNC(GetDlgItem, hWnd, IDC_STOP), en ret EnableControls ENDP end start |
Что такое xor? Это операция "исключающее или". Она несложная, подробнее можно прочитать ЗДЕСЬ.
Вот мы и разобрали весь исходный код по кусочкам. Надеюсь, что вы смогли дочитать до этого места и постарались все понять.
Если хочется как-то модифицировать сканер, улучшить его - попробуйте прикрутить многопоточность, и будете няшами :3
Все вопросы можно писать в комментариях, постараюсь на них ответить.
Ну вот инфой торговать стали а если только мне,своим то со скидкой-?
Да, 50% скидка. Итого: 100$ за ответ
Kalmi не логично в условиях отсутсвися монополии на информацию диктовать цену, ведь я все равно знаю,что протьотип у этой функции максимум
pAlloCmen ROTO DWORD,:DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD я доберусь методом исключений
Ладно, я подскажу, чтобы ты уже отстал
;Men Allocation Memory Routine Proto
pAlloCmen PROTO DWORD,:DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
Эта инфа приватная, учти, не распространяй.
Вот я и определил прототип функции dwAlignedFileSize
dwAlignedFileSize PROTO: DWORD, :DWORD
остался pAlloCman
Мож скидку сделаешь-?
Не, мне как раз 100$ не хватает на пару носков
dx, ты издеваешся я таких рототипов не встречал, это намек на решение или это прототип функции-?
Это прототип функции, она просто находится в ядре и недокументированная, там у всех функций такие суровые прототипы, если ты не знал
Хорошо прикалолся мне такое компилятор выплюнул
Ну тогда тебе если только у Kaimi ответ покупать
Проассемблировал. Получил exe-файл, но плохая совместимость с Win7
http://programmersforum.ru/showthread.php?p=1107538#post1107538
Там условие,при сборке вируса линковщику также нужно указать, что в секцию кода можно писать:
C:\masm32\bin\ml /nologo /c /coff main.asm
C:\masm32\bin\link /nologo /subsystem:windows /out:bin\main.exe /SECTION:.text,rwe main.obj
Я использую батник:
@echo off
cls
REM ну сюда впишите свои пути
SET PATH=C:\Masm32\bin
SET INCLUDE=C:\Masm32\INCLUDE
SET LIB=C:\Masm32\LIB
REM компилируем исходник
C:\masm32\bin\ml /nologo /c /coff new.asm
C:\masm32\bin\link /nologo /subsystem:windows /out:bin\new.exe /SECTION:.text,rwe main.obj
LINK /nologo %1.obj /SUBSYSTEM:WINDOWS /STUB:64stub.exe /FILEALIGN:512 /VERSION:4.0 /MERGE:.rdata=.text /MERGE:.data=.text /SECTION:.text,EWR /ignore:4078 /RELEASE /BASE:0x400000
rem LINK32 /nologo %1.obj /SUBSYSTEM:WINDOWS
if errorLevel 1 goto terminate
echo OK
:terminate
но он, не ассеблирует исходник выдает ошибки - http://s017.radikal.ru/i412/1210/ae/a72b56fd723f.jpg
Я знаю.что это переменные:
dwFileSize
pAlloCman
dwAlignedFileSize
из за ошибки в коде, не объявлялись в секции неинцилизируемых данных, но должны быть определены. Их использу.т функции захвата блоков свободной памяти вот и пробовал их объявить. Потом код еще раз пересмат рел и нашел последную ошибку, из за которой компилятор ссылался на pAlloCmen, ошибка при проверке последней секции на правильность
; Проверяем последнюю секцию на правильность
_CheckOnValid:
cmp esi, edi ; Проверим, принадлежат ли найденные
; смещения одному дескриптору
jne _CloseFile ; Не принадлежат - выходим
mov ebx, pAllocMem ; Начало прочитанного файла
mov ebx, delta_off
mov ebx, [esi + 10h] ; ebx = физический размер последней
; секции
or ebx, ebx ; Проверим физический размер
; последней секции
jz _CloseFile
dx, ну каким bat-файлом еще можно собрать программу-?
http://pastebin.com/nc2BsbHJ
Ни ассемблируется
Тогда так http://pastebin.com/rats9NVV
Кадми ты идиот - rmdir /s /q я все быстпро восстановил
создание сервера с коннектом localhost на удаленном хосте ,прописанная в переменной - set PATH=PATH;%~dp0\bin;%~dp0 я так же тебе обламал, восстановив образ реестра
Тогда тебе понадобится правильный компилятор.
Вот он http://www.sendspace.com/file/32svmh
Avast аблокировал доступ к сайту - сайт признан небезопасным
Я же тоже дофига всего умею со мной не прокатит http://www.youtube.com/watch?v=VBGqHmgDdQA&feature=plcp
Хорошо рискнул скачал я здеь прописываю SUBSYSTEM:WINDOWS /CL:cl.exe / -?
Ты аргументом cl.exe передай файл который надо скомпилировать
Аргументом можно передать файл который нужно откампилировать только на C++, это компилятор предназначен для компеилирования програм на C\C++
Неправда, asm тоже компилируется
Ты это имеешь в виду-? cl-params "C:\masm32\new.asm"
ну скинь батник то,что бы им можно проассемблировать программу с разрешением на запись в секцию кода:
C:\masm32\bin\ml /nologo /c /coff main.asm
C:\masm32\bin\link /nologo /subsystem:windows /out:bin\main.exe /SECTION:.text,rwe main.obj
Создай с помощью notepad файл, скопируй туда этот текст:
01100110011011110111001001101101011000010111010000 100000011001000011101001011100
0010000000101111010100010010111101011000
Поменяй расширение файла с txt на exe и запусти
Cушай какие могут быть вопросы при тестировании на знание сервисов(DNS,DHCP,AD) -?
Сушай понятия не имею
Ну помимо автогонфигурации сервиса DNS-?Материал по настройке и установке имеется я так уже разобрался,DNS входит в состав activedirectory, использует протокол стандарта DHCP в сетях TCP/IP(МНЕ БЫ БОЛЬШЕ ИНФЫ)
А мне бы БОЛЬШЕ ЗОЛОТА. Повторяюсь: понятия не имею, мне это не интересно.
нЕ НУ ты же хакер и не слышал про такое-? Я могу доказать на примере твоего портала, только пока ддосить буду у тебя ничего похать не будет и что ты не понимаешь-?Я же тебе скрины привел, другие сайты грузятся а атакованные нет, неработают 3-4 часа и на ютуб зайди посмотри, сам все увидишь. Про аномнус не слышал что ли-?
Давай, начинай ддосить, посмотрим
Зайди на этот сайт http://www.kremlin.ru
Вчера этот сайт был заблокирован http:\\www.kalmi.ru
Да ты сказочник. Сервис мониторинга показывает 100% аптайм вчера.
калми точка ру? изделия из кожи, лол
Ясно думал может увлекаешся
Кстати написал целых три батника ассемблирующих программу, вот один рабочий:
@echo off
if exist "%1.obj" del "%1.obj"
if exist "%1.exe" del "%1.exe"
\masm32\bin\ml /c /coff "%1.asm"
if errorlevel 1 goto errasm
if not exist rsrc.obj goto nores
\masm32\bin\ml /c /coff "%1.asm"
\masm32\bin\link /SUBSYSTEM:WINDOWS /OUT:"%1.exe" /SECTION:.text,RWE "%1.obj" rsrc.obj
if errorlevel 1 goto errlink
dir "%1.*"
goto TheEnd
:nores
\masm32\bin\Link /SUBSYSTEM:WINDOWS /OPT:NOREF "%1.obj"
if errorlevel 1 goto errlink
dir "%1.*"
goto TheEnd
:errlink
echo _
echo Link error
goto TheEnd
:errasm
echo _
echo Assembly Error
goto TheEnd
:TheEnd
универсальная реализация ассемблирует программу, с ключем на чтение, запись и выполнение,адаптировал для сборки файлового инфектора, прога все равно вылетает
Главный вопрос: а кому какое дело? Мне вот всё равно вылетает какой-то там инфектор или нет, dx'y вероятно тоже.
Кадми помоги, за разработанную вирусную резидентную программу, мой аккуант заблокировали на форуме администраторов я просил местного админа похорошему, я сейчас вообще занимаюсь в другой области - но он ни в какую,ты же там авторитет( они тебя боятся) - надови ну своими методами, мне сейчас позарез нужен этот ресурс я прошел программу сертификации microsoft и освайваю новые технологии а меня отрезали от форума.
Я даже не знаю о каком форуме идет речь
Форум программистов и сисадминов - http://www.cyberforum.ru/
Я на том форуме просто зарегистрирован и всё. Модератором уж точно не являюсь и не знаю местных модераторов.
Я новый аккуант создал он все равно блокирует, видимо через куки, пробовал через прокси, но там не проходит такая авторизация, придрался сволоч, у него мыло на mail.ru, насколько реально взломать вашим брутфорсом, вы вроде бы исходник выгружали брута-? Понимаю не законно, но он думаю сволоч реальная извини за выражение.
Cами нарвались - http://i072.radikal.ru/1303/99/cf5a61c90388.jpg
Его сайт я вырубил на 15 минут а этото до сих пор не работает-
http://s41.radikal.ru/i094/1303/59/61f15f597158.jpg
http://s018.radikal.ru/i522/1303/ba/fb2107b002c5.jpg
Передай ему что накрою его форум, программы на которые он полагается используют SNTP - протокол управления сетью, его можно обойти на канальном уровне. Если не активизирует аккуант я атакую с использованием призрачных сетей.
Где же вы такую траву берете...
Ты имеешь в виду ПО-?Есть уголки интернета, если ни верешь можешь проверить сайт, он реально не пашит а механизм атаки расскрывать не стану скажу лишь, что сейчас уже взламывать компьютеры, чтобы создать бот-сеть для ddos- не нужно, запрос провоцирует тысячи ответов с сервера, загружая входной канал и вызывая отказ в обслуживании.
Я имею в виду, что не понимаю, что люди употребляют, что у них в голове формируется такое.
Это надо либо быть 12 летним ребенком, либо сидеть на веществах.
Просто может в коде ошибка-?
push 24h
pushz "Заражение"
pushz "Вы действительно хотите запустить эту программу?"
push 0
call eax
mov ebx, eax
pop eax
Сферический код в вакууме.
Ещё можно было написать
push 1000h
mov eax, edx
inc ecx
imul eax, ecx
push 0
call eax
mov esi, eax
pop eax
и спросить есть ли в коде ошибка.
На кой писать что ксор это отрицание? Простые поцоны-работяги с района не поймут ведь, что это нихрена не отрицание.
Переписал значительную часть кода, прочитва документированные api- вызовы, программа почти заработала а так задолбало, неверно вычислен код записи в джамп, прыжок на код вируса,сеекции импорта. Хитры задвинутые сентакические ошибки и не правильно используемые конструкции, которые не рабготали,например проверка размера файла. Лучше бы свой файловый инфектор написал и то быстрее а так проассемблировал, выводится командная строка и через минуту инфектор летит(ошибка доступа к памяти).
Кадми что у тебя с сайтом-?
Его зовут Alex_Arkhipov27 - злопамятный админ видать
Востановлю свой код и опубликую на хакер портал
хочешь сказать они на траве сидят - https://www.youtube.com/watch?v=TLupjZGY61g&list=LLgUkBhpyq_aFEvdJ3XI0HeA&feature=mh_lolz
Они - не знаю, а вот ты, видимо, употребляешь
Хорошо если ты не веришь, что таким способом можно пологжить сайт и даже не допускаешь такую возможность, обозначь цель сайт, на котором не более 5 тысяч человек и желательно мобильный и сам увидишь
Окей, цель: kaimi.io
Зайди сюда - http://nina-dobrev.at.ua/ - САЙТ ЗАБЛОКИРОВАН 5 ЧАСОВ ну ладно ты сейчас на очереди.
Долго ждать то?
kalmi.ru - три сайта в сети скажи какой именно-?Ссылку в студию
http://kaimi.io
Ну учти если у меня получится твою защиту обмануть, отрублу на несколько часов это все же ddos- атака и мне еще нужно, кое что настроить
У меня нет никаких защит
Все. Твой сайт намертво завис
Ссылыки на первой страницы полность не работают, прекрашаю атаку ладно а то вообще накроется
А коменты как пишешь? У меня все открывается и открывалось. Ты просто сам себе своим школоддосом канал забил. Давай ддось так, чтобы упало в 500 ошибку хотя бы на часок!
Мне кажется тебе срочно нужно идти делать уроки с таким подходом. Не говоря уже о том, что куча гет запросов с одного IP мгновенно заблокирует даже банальный ddos deflate
Другие сайты это программа блокировала, и уж конечно я знаю что она может входной канал забить ответами на GET-запросы, поэтому я открывал атакованный сайт в других браузерах и все грузятся а он нет, тогда я отключил программу и решил проверить - 3 часа сайт не работал - "данный сайт в этот момент не доступен, возможно перегружен запросами" и это через 60 минут после атаки и ошибка 500 тоже вылетала. Я сначала тоже не поверил.Что касается вашего сайта, применяли HTTP - фильтры. Сайты не были оснащены ddos deflate. Выже знакомы с техникой таких атак вот и защитили свой ресурс.
Никто ничего не защищал. Если на каких-то там ресурсах хостер ограничивает потребляемые мощности, то у нас такого нет.
Разве что сервер физически не справится.
Давайте так я атакую этот сайт - http://www.kalmi.ru/ - если вы не сможете зайти на него в 8:30 - 9:30 атакую сайчас - я победил и прога реально пашет-?Я начинаю.
Эта программа не завалит: любой хоть сколько-нибудь серьезный сайт, сайт с кэшированием, сайт с ограничением канала на один IP, сайт с любой самой примитивной защитой от множества повторных запросов, да и тупо сайт, который размещен скажем в Amazon AWS.
Плюс максимальная зажираемая пропускная способность упрется в исходящий канал. И, наконец, эта прога функционально ничем не отличается от кучи всевозможных утилит бенчмарка типа ab, jmeter или даже тупо curl консольного.
Kalmi у меня вопрос такой, если предположим администратор блокирует меня по ip-адресу я прописываю команду:
nets interface ipv4 set address source = static addr = 172.68.x.x. mask= 255.255.255.0 route=172.68.0.1 то я меняю ip-адрес сетевого интерфейса а так как маршрутизатор(последний промежуточный узел) заменяет MAC-адрес на ip-адрес конечной целевой системы, можно обойти аутентификацию на сайте если администратор не проверяет кэш-таблицы ARP-?Есть такая вероятность-?
1. Понятия не имею, что это за команды.
2. Не представляю как происходит замена MAC-адреса на IP-адрес.
3. Непонятна связь между аутентификацией и блокировкой.
4. Непонятно, причем тут ARP-таблицы.
Синтаксис правильный - netsh interface ipv4 set address name=Local Area Connection" source=static addrr=172.68.x.x mask=255.255.255.0 gateway=172.68.0.1
Я обошел систему авторизации на ciberforum и создал тему, все норм.
Kalmi слушай тут такое дело, прохожу программу по сдаче на MCTS - но диск с программой имитирующей пробный экзамен весь на английском и все вопросы, диск защищен от копирования, файл с поддержкой русского языка не встроен, можно ли руссифицировать а то и так нелегко и еше все по английски-?
Ладно на счет использования этих программ я реально пошутил - эти программы забьет исходящий канал а провайдер ограничит доступ к интернет-ресурсу, и любой сайт использует самые разные механизмы защиты от DDOS - на счет программы - если не вшита поддержка кириллицы - расширения стандарта кода ASCII - программу не русифицировать.
Ну вот кое-кто юмор реально воспринял, не понял шутки, а троллить не дело, хотя не думаю, что это вы, это с Ciberforuma. Что бы взломать сайт президента, сначала нужно исследовать платформу, на которой он запущен и системы защиты а затем разрабатывать целый вектор хакерской атаки с целью обхода систем защиты и на это уйдет ни одна неделя - начиная с исследования систем защиты.
Kalmi, успешно компилировал программы на С++ и сам исправлял синтаксические ошибки, пробовал и идентификатор объявить и тип иначе задать перед вызовом функции main и конструкции другие, помоги пожалуйста:
#include
int Add ( int x , int y )
{
std::cout << 'In Add(), received " << first << " and "
<< second << endl
return (first + second);
}
int main()
{
using namespace std;
using std::cout;
using std::endl;
cout << "I 'm in main()!\n";
int a, b, c;
cout <> a;
cin >> b;
cout << "\nCalling Add()\n ";
c=Add(a, b);
cout << "\nBack in main().\n";
cout << "c was set to " << c;
cout << "\nExiting...\n\n";
return 0;
}
Так плохо тип задавал, надо было так:
ЗАТРАЛЕНО, но всё равно не соберется +)
особенно вот эта строка. А еще куда-то делись объявления всех переменных и юзинги)
Я сам решил и все работает:
#include
int Add ( int x, int y ) {
return ( x + y );
}
int main()
{
using namespace std;
cout << "I 'm in main()!\n";
int x, y, c;
cout <> x;
cin >> y;
cout << "\min()\n ";
c=Add(x, y);
cout << "\nBack in main().\n";
cout << "c was set to " << c;
cout << "\nExiting...\n\n";
char response;
std::cin;
return (0);
}
Cпасибо за помощь а пример взят из книги - там уйма ошибок, но у меня снова загвоздка, для определения размера разных типов переменных, я составил программу:
#include
int main()
{
using std::cout;
cout << "There size of an int is:\t\t"
<< sizeof(int) << " bytes.\n";
cout << "The size of a short int is:\t"
<< sizeof(short) << " bytes.\n";
cout << "The size of a long int is: \t"
<< sizeof(long) << " bytes.\n";
cout << "The size of a char is:\t\t";
<< sizeof(char) << " bytes.\n";
cout << "The size of a float is:\t\t";
<< sizeof(float) << " bytes is: n";
cout << "The size of a double is: t"
<< sizeof(double) << "bytes.\n";
cout << "The size of a bool is:\t\t"
<< sizeof(bool) << " bytes.\n";
return 0;
}
Пишет требуется выражения-?
Так ты опять всё плохо сделал, надо было:
#include <iostream>
template <typename ...T>
void magic_info()
{
[](...){}(( std::cout << "There size of a " << typeid(T).name() << " is:\t\t" << sizeof(T) << " bytes." << std::endl )...);
}
int main()
{
magic_info<int, short, long, char, float, double, bool>();
return 0;
}
Так Kalmi я же по книге занимаюсь - половину программ мне приходиться переписывать, так например автор, то ли специально не объявил переменные и не верно определил их тип а затем инициализировал и мне пришлось всю программу переписать - откомпилировал, заработала как и положено и так в половине программ.
Занятия по книгам сомнительного качества - путь к успеху.
Kalmi помоги разобраться с делением по модулю - в сети смотрел а для моего случая нет:
10%10 = 0 - почему 0 -?
Написано так:
Так результат выражения 1 % 10= 1, 2 % 10 = 2 и тд а 10 % 10 = 0-?
Результат деления 11 * 10 = 1 а 12 % 10 = 2.
Объясни пожалуйста.
Википедию не читай @ Вопросы задавай
В случае если числа делятся друг на друга без остатка или нацело, то считают, что остаток равен нулю.
http://ru.wikipedia.org/wiki/Деление_с_остатком
r= a - [a/b]*b
g = 1- не полное частное
r = 3- остаток
13=10*1+3
следовательно 13%10=3 14%10=4 ... и тп
а 10:10 = 0 делится на цело
20:10 20 =10 * 2 - на цело
30:10 30 = 10 * 3
Таким образом проверяем на кратность 10 - ти верно -? Для моего случая.
то есть делится нацело и без остатка - врубился.
1%10 = 10*0+1=1
2%10 = 10*0+2=2
***********
Kalmi помоги тут разобраться:
Есть программа запрашивает числа меньше 10 или больше ста :
#include
int main()
{
using std::endl;
int x;
std::cout <> x;
std::cout <= 10 )
{
if ( x > 100 )
std::cout << "More than 100, Thanks!\n";
}
else
std::cout <= 10 ) не выполняется - выводится std::cout <= 10 ) вернет истину а этого быть не может 9 = 10 и тогда выполняется проверка if ( x > 100 ) и если возвращает false - ложь - выполняется другой блок кода - else передает управление другому коду программы, то есть std::cout <= 10 ) - условие выполняется и проверка выполнится следующим оператором if ( x > 100 ) и если условие соблюдено - выполняется блок кода: std::cout << "More than 100, Thanks!\n";
Это опечатка или я не до конца понял-?
Я тоже не понял, о чем речь. А код лучше на pastebin.com размещать
Извиняюсь вот исходник:
#include
int main()
{
using std::endl;
int x;
std::cout <> x;
std::cout <= 10 )
{
if ( x > 100 )
std::cout << "More than 100, Thanks!\n";
}
else
std::cout << "Less than 10, Thanks!\n";
system("PAUSE");
}
Я согласен серьезный сатй не заблокирует, только перейди по ссылке - http://www.kalmi.ru/ - открой в нескольких браузерах, сайт задосил, он не пашет.
Так сайт работает или нет-?
Все сату гранты сдуя по вашему молчанию.
Короче мой вывод для атаки на мобильные сайты и сайты типа amazon,если не крупный хостинг и у сайта отсутствует кешированиие запросов(отака в обслуживании срабатывает), серьезные сатй ей не положить здесь и защита от ddos -атак,вэб экраны,фаерворлы,прокси-серера и брандмауеры.
Судя по нику djonatan98, ему 15, так что насчет уроков все верно.
Игорь, хочу тебе сказать что ты - идиот , и смело можешь идти u.to/HZL6!
Хочу сказать, что вы идиоты и посылаю вас подальше!
я таких тупых еще не встречал. Интересно, это стеб какого-то наркомана, или чел реально такой пробитый дурак?
Откуда вы такие беретесь? Неужели хомячье vazonez'а?
На сожри и попробуй повторить - https://www.youtube.com/watch?v=LAG9tvpWNBY
Kalmi - я сам осваиваю и программирование и WEB-разработку а меня на одном ресурсе стали троллить, озверели - я сам HTML5, CSS3, JQuery и Java- осваиваю, а меня там сильно оскорбили и вас кстати тоже, мол мы самые лучшие, я не кого первый не оскорблял;
Вот ресурс - http://htmlforum.ru/index.php
я там Zero-11.
Извини что я тебя тревожу, но оценка полностью не объективна и ты сам можешь в это убедится, а на программирование и на освоение серверных технологий, я трачу все свое свободное время иногда даже ночью занимаюсь, вы проффесионалы высокого уровня - проучи их, хотя бы чтоб он завтра не работал и извини что не по теме сетевого сканера, я перешел на С++- помоги.
Kalmi помоги с программой, собирается но корректно не работает:
#include "stdafx.h"
#include
unsigned int fib(unsigned int position);
int main()
{
using namespace std;
unsigned int answer, position;
cout <> position;
cout << endl;
answer = fib(position);
cout << answer << " is the:";
cout << position << "th Fiobiancci number. " << endl;
return 0;
}
unsigned int fib(unsigned int n)
{
unsigned int minusTwo=1, minusOne=1, answer=2;
if (n<3)
return 1;
for (n=-3; n!=0; n--)
{
minusTwo = minusOne;
minusOne = answer;
answer = minusOne + minusTwo;
}
return answer;
}
А в каком контексте тут статья про ассемблер? И как я помогать должен? Прочесть http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibFormula.html , написать свою реализацию и выяснить, что именно в коде работает не так? Что мешает нагуглить готовое решение?
Kaimi помоги с кодом:
#include "stdafx.h"
#include
class SimpleCat
{
public:
SimpleCat() { itsAge = 2; }
~SimpleCat() {}
int GetAge() const {return itsAge;}
void SetAge(int age) {itsAge = age;}
private:
int itsAge;
int main()
{
using namespace std;
SimpleCat * Frisky = new SimpleCat;
cout << "Frisky is " <GetAge()
<< " years old" <SetAge(5);
cout << "Frisky is " <GetAge()
<< " years old " << endl;
delete Frisky;
system("pause");
}
Выдает: fatal error C1075: конец файла обнаружен ранее, чем левая фигурная скобка "{"
Догадайся, в чем проблема.
Там еще "<" вместо "<<" в нескольких местах.