Поиски свободного «почтальона Печкина». Часть 6. Использование
“поисковиков” для нахождения серверов пересылки писем.Автор: _follower
/ TPOC
Изучая особенности протокола SMTP - можно
отметить, что при пересылке письма от одного сервера к другому в заголовке его
письма остаются строки с явным указанием ip -адреса
сервера пересылки.
Этот желанный
ip-адрес находится в строке "Received:
from".
Но где искать эти заголовки?
Если Вас спросили "Где искать?", значит необходимо призвать поисковую систему.
А какие у нас есть поисковые
системы? Конечно это www.ya.ru,
www.rambler.ru,
www.aport.ru
...
Проведем несколько минут
эксперимента. Будем скармливать разные поисковики одним и тем же запросом.
Скажем таким, найди-ка мне
голубчик все, что вокруг надписи "Received:
from"?
В результатах поиска отметим
количество полезных IP - адресов.
Какой вывод?
Вывод следующий:
На момент написания этой
статьи только www.aport.ru
дает кое какие результаты.
Ни www.ya.ru
ни www.rambler.ru
ни www.google.ru
не дает "пищи для размышления", то есть, каких либо адресов.
Видимо существуют некие
мероприятия по фильтрации запросов на этих поисковиках. На
www.aport.ru
этих "заморочек" видимо, нет, поэтому продолжим.
Наш простой запрос выдал
на-гора пару тройку каких-то IP -адресов, которые мы
проверим на открытость 25 - порта.
На второй странице один
оказался рабочим! Это-ли не благодарность за 5 минут эксперимента?
Теперь самое время дать
постановку задачи.
Цель:
Программка дает все
IP - адреса по простому запросу типа "Received:
from" на aport.ru.
Программка проверит можно ли
переслать через найденный сервер наше письмо?
Давайте для начала немного познакомимся с структурой
запросов этого поисковика.
www.aport.ru
Первый запрос сформирован так:
http://sm.aport.ru/scripts/template.dll?r=Received:+from
Все последующие …
http://sm.aport.ru/scripts/template.dll?r=Received%3A+from&id=244620592&p=1
http://sm.aport.ru/scripts/template.dll?r=Received%3A+from&id=244620592&p=2
http://sm.aport.ru/scripts/template.dll?r=Received%3A+from&id=244620592&p=3
http://sm.aport.ru/scripts/template.dll?r=Received%3A+from&id=244620592&p=4
http://sm.aport.ru/scripts/template.dll?r=Received%3A+from&id=244620592&p=5
Что
такое
244620592
я не знаю. Эта величина меняется, поэтому я должен вычислить ее из
скачанной мною страницы.
1 2 …
- это понятно, номер страницы.

Запустим
наработанную нами в прошлых уроках утилиту и проверим найденный
IP.
[2006.3.20-17:59:29] 195.16.96.19 -> ...
220 ESMTP Portal mail server
250 mail.portal.ru Hello [198.172.157.13], pleased to meet you
mail.portal.ru
250 2.1.0 <_follower@mail.ru >... Sender ok
550 5.7.1 <animator@e-mail.ru >... Relaying denied. IP name lookup failed [195.248.163.92]
Aaron@mail.portal.ru
550 5.1.1 <Aaron@mail.portal.ru >... User unknown
Adam@mail.portal.ru
550 5.1.1 <Adam@mail.portal.ru >... User unknown
Alba@mail.portal.ru
550 5.1.1 <Alba@mail.portal.ru >... User unknown
Alberto@mail.portal.ru
550 5.1.1 <Alberto@mail.portal.ru >... User unknown
Alecia@mail.portal.ru
550 5.1.1 <Alecia@mail.portal.ru >... User unknown
web@mail.portal.ru
550 5.1.1 <web@mail.portal.ru >... User unknown
admin@mail.portal.ru
550 5.1.1 <admin@mail.portal.ru >... User unknown
root@mail.portal.ru
250 2.1.5 <root@mail.portal.ru >... Recipient ok
221 2.0.0 mail.portal.ru closing connection
|
Ну, как? По мне так неплохо.
Все оказалось совсем не сложно. Ну, теперь пишем программку.
;------------------------------------------------------------------------------------------------
.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
include \masm32\include\wininet.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\wininet.lib
include _subseach.inc
includelib _subseach.lib
include _mailrep.inc
includelib _mailrep.lib
Main PROTO
GetInetFile PROTO :DWORD,:DWORD
MailRep PROTO :DWORD,:DWORD,:DWORD
.data
_fileUrl db "http://sm.aport.ru/scripts/template.dll?r=Received:+from",0
_http_str_start db 'template.dll?r=Received%3A+from&id=',0;
_http_str_stop db '&p=',0
_url_str_start_1 db 'http://sm.aport.ru/scripts/template.dll?r=Received%3A+from',0
_url_str_start_2 db 80 dup(0)
_url_str_start_3 db 80 dup(0)
_url_ db 1024 dup(0)
_url_1 db 1024 dup(0)
_fileSave db "aport.ru_0.html",0
msgOk db "Downloaded Success!",13,10,0
msgErr db "Download Failed! ",0
msgErr_File db "File open Failed!",13,10,0
mcap db "Result",0
szstrSubj db 'Subj',0
szstrData db '123',0
_subStrSearch_str struct
sub_str dword 1024 dup(0)
stop_pos dword 0
error_cod dword 0
_subStrSearch_str ends
_subStrSearch struct
sub_str dword 256 dup(0)
stop_pos dword 0
_subStrSearch ends
_my_in_ch _subStrSearch <>
_my_in_str _subStrSearch_str <>
lf db 13,10,0
_ch_start_date db '&id=',0
_ch_stop_date db '&p=',0
_char_start db '[',0
_char_stop db ']',0
hMapFile HANDLE 0
_FSize DWORD 0
_count BYTE 0
.data?
hFileRead HANDLE ?
pMemory DWORD ?
bCount db ?
cBuff db ?
.code
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
; ######################################################################################
; ######################################################################################
; ######################################################################################
; ######################################################################################
; ######################################################################################
; ######################################################################################
; ######################################################################################
; ######################################################################################
; ######################################################################################
start:
invoke Main
invoke ExitProcess,0
; #########################################################################
Main proc
invoke RtlZeroMemory,ADDR _url_,SIZEOF _url_
invoke lstrcpy,ADDR _url_,ADDR _fileUrl
.REPEAT
inc _count
.IF _count==31
inc _count
invoke lstrcat,ADDR _url_1,ADDR _url_str_start_3
invoke lstrcat,ADDR _url_1,ADDR cBuff
invoke RtlZeroMemory,ADDR _url_,SIZEOF _url_
invoke lstrcpy,ADDR _url_,ADDR _url_1
.ENDIF
xor edx,edx
mov edx,DWORD PTR _count
invoke dwtoa,edx,ADDR cBuff
invoke GetInetFile, ADDR _url_,ADDR _fileSave
.if eax == TRUE
invoke StdOut, ADDR _url_
invoke StdOut, ADDR lf
.else
invoke StdOut, addr msgErr
invoke StdOut,ADDR _url_
invoke StdOut,ADDR lf
invoke GetInetFile, ADDR _url_,ADDR _fileSave
.endif
;##########################################################################
invoke CreateFile,ADDR _fileSave,\
GENERIC_READ ,\
0,\
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,\
NULL
.if eax!=0
mov hFileRead,eax
.else
invoke StdOut, addr msgErr_File
.endif
invoke CreateFileMapping,hFileRead,NULL,PAGE_READONLY,0,0,NULL
mov hMapFile,eax
invoke GetFileSize,hFileRead,NULL
cmp eax,14000h
je __closeM
mov _FSize,eax
invoke MapViewOfFile,hMapFile,FILE_MAP_READ,0,0,0
mov pMemory,eax
mov DWORD PTR _my_in_ch.stop_pos, 0
mov bCount,1
.WHILE bCount !=0
invoke RtlZeroMemory,ADDR _my_in_ch.sub_str,256
invoke RtlZeroMemory,ADDR _url_str_start_2,SIZEOF _url_str_start_2
invoke _substrCh , pMemory ,_FSize,\
ADDR _char_start,\
ADDR _char_stop,\
ADDR _my_in_ch
.IF eax!=0
;-------------------------------------------------------------------------
pushad
cld
xor ecx,ecx
mov cx,16
mov esi, eax
lea edi,_url_str_start_2
__m1:
lodsb
cmp al,' '
je __m1
stosb
loop __m1
popad
invoke lstrlen,ADDR _url_str_start_2
test eax,eax
jz __closeM0d0ah
invoke MailRep,ADDR szstrSubj,ADDR szstrData,ADDR _url_str_start_2
;-------------------------------------------------------------------------
.ELSE
mov bCount,0
.ENDIF
.ENDW
;****************************************************************************
invoke RtlZeroMemory,ADDR _my_in_ch,SIZEOF _my_in_ch
mov DWORD PTR _my_in_str.stop_pos, 0
invoke RtlZeroMemory,ADDR _my_in_str.sub_str,1024
invoke _subsearchStrFL , pMemory ,_FSize,\
ADDR _http_str_start,\
SIZEOF _http_str_start,\
ADDR _http_str_stop,\
SIZEOF _http_str_stop,\
ADDR _my_in_str
invoke lstrcpy,ADDR _url_,eax
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
invoke RtlZeroMemory,ADDR _my_in_str,SIZEOF _my_in_str
invoke _subsearchStrFL , ADDR _url_ ,SIZEOF _url_,\
ADDR _ch_start_date,\
SIZEOF _ch_start_date,\
ADDR _ch_stop_date,\
SIZEOF _ch_stop_date,\
ADDR _my_in_str
invoke lstrcpy,ADDR _url_str_start_2,eax
invoke lstrcpy,ADDR _url_str_start_3,ADDR _url_str_start_2
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
invoke lstrcat,ADDR _url_str_start_2,ADDR cBuff
invoke RtlZeroMemory,ADDR _url_,SIZEOF _url_
invoke lstrcpy,ADDR _url_,ADDR _url_str_start_1
invoke lstrcat,ADDR _url_,ADDR _url_str_start_2
invoke RtlZeroMemory,ADDR _url_1,SIZEOF _url_1
invoke lstrcpy,ADDR _url_1,ADDR _url_str_start_1
invoke lstrcat,ADDR _url_1,ADDR _url_str_start_3
invoke UnmapViewOfFile,pMemory
invoke CloseHandle,pMemory
__closeM:
invoke CloseHandle,hMapFile
invoke CloseHandle,hFileRead
invoke RtlZeroMemory,ADDR _my_in_str,SIZEOF _my_in_ch
invoke RtlZeroMemory,ADDR _my_in_str,SIZEOF _my_in_str
__closeM0d0ah:
.UNTIL _count > 100
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;****************************************************************************
ret
;############################################################################
Main endp
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
GetInetFile proc _url:DWORD, _filename:DWORD
LOCAL Buffer[1024]: BYTE
LOCAL hSession: DWORD
LOCAL hUrl: DWORD
LOCAL Bufferlen: DWORD
LOCAL AppName[127]: BYTE
LOCAL hInstance: DWORD
LOCAL fHand: DWORD
LOCAL bwrite: DWORD
invoke GetModuleFileName, hInstance, addr AppName, sizeof AppName
invoke InternetOpen, addr AppName, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL,NULL
mov hSession, eax
.if hSession == INVALID_HANDLE_VALUE
mov eax, FALSE
ret
.endif
invoke InternetOpenUrl, hSession, _url, NULL, NULL, NULL, NULL;
mov hUrl, eax
.if hUrl == INVALID_HANDLE_VALUE
mov eax, FALSE
ret
.endif
invoke CreateFile, _filename, GENERIC_READ or GENERIC_WRITE,;
FILE_SHARE_READ,\
NULL,CREATE_ALWAYS,\
FILE_ATTRIBUTE_NORMAL,\
NULL
mov fHand, eax
.if fHand == INVALID_HANDLE_VALUE
mov eax, FALSE
ret
.endif
invoke SetFilePointer, fHand, NULL, NULL, FILE_BEGIN
__downl:
invoke InternetReadFile, hUrl, addr Buffer, sizeof Buffer, addr Bufferlen
.if Bufferlen != 0
invoke WriteFile, fHand, addr Buffer, Bufferlen, ADDR bwrite, NULL
jmp __downl
.endif
invoke CloseHandle, fHand
invoke InternetCloseHandle, hUrl
invoke InternetCloseHandle, hSession
mov eax, TRUE
ret
GetInetFile endp
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
end start
|
Заранее прошу Вашего извинения
за качество кода. Я не спец., а простой вольный “художник” (известно от какого
слова происходит тот художник который я ) :). Самое главное, на мой взгляд, не
остановиться. Просто избрать какую-то середину между количеством и качеством и
идти дальше. А раз это не мой хлеб, а только инструмент позволяющий размышлять ,
то скорее всего этого достаточно.
Я начну слегка комментировать все, что тут написал.
1)
include _subseach.inc
includelib _subseach.lib
include _mailrep.inc
includelib _mailrep.lib
|
Опыт первых уроков я свел
частично к библиотекам. В прикрепленных архивах есть папки с описаниями этих
библиотек. Вкратце, _subseach.lib содержит две функции.
Одна _substrCh( )
извлекает подстроку, которая в строке обрамлена заданными символами. Например,
на входе строка – “xxxxx[192.168.1.1]yyyyyy”,
пара символов “[”, ”]”. На выходе получаем - “192.168.1.1”.
Другая _subsearchStrFL( )
извлекает подстроку, которая в строке обрамлена заданными словами. Например,
на входе строка – “xxxxx[192.168.1.1]yyyyyy”,
пара слов “xxx”, ”yyy”. На
выходе получаем – “192.168.1.1”.
2)
_fileUrl db "http://sm.aport.ru/scripts/template.dll?r=Received:+from",0
_http_str_start db 'template.dll?r=Received%3A+from&id=',0;
_http_str_stop db '&p=',0
_url_str_start_1 db 'http://sm.aport.ru/scripts/template.dll?r=Received%3A+from',0
…
_ch_start_date db '&id=',0
_ch_stop_date db '&p=',0
_char_start db '[',0
_char_stop db ']',0
|
Для работы с
www.aport.ru необходимо
несколько ознакомиться со структурой его запросов.
Итак, строки _fileUrl -
строка с первым запросом на поиск нужной строки.
Пары строк _http_str_start,_http_str_stop
и _ch_start_date,
_ch_stop_date
для того чтобы искать то таинственное число (“в девичестве”-
244620592. Но как теперь - не знаю.) Я решил в два прохода,
ну чтобы наверняка. Поэтому функция _subsearchStrFL(
) вызывается в программке дважды, хоть и делает одно и тоже.
Это искомое число (
244620592 ), что-то типа даты или времени, я не знаю. Я ищу его в
каждом файле для пущей правильности нового запроса.
3)
_subStrSearch_str struct
sub_str dword 1024 dup(0)
stop_pos dword 0
error_cod dword 0
_subStrSearch_str ends
_subStrSearch struct
sub_str dword 256 dup(0)
stop_pos dword 0
_subStrSearch ends
_my_in_str _subStrSearch_str <>
_my_in_ch _subStrSearch <>
|
А вот они эти структуры, которые снимаются с выхода функций
_subseach.lib.
sub_str
– найденная строка.
stop_pos
– (приготовьтесь к замысловатой фразенции :)) – номер последнего символа
найденной подстроки если считать от начала файла. Эти поля как в одной, так и в
другой структуре. Но _subStrSearch_str
– ищет между словами, а _subStrSearch проводит
поиск между символами.
4)
invoke GetInetFile, ADDR _url_,ADDR _fileSave
.if eax == TRUE
invoke StdOut, ADDR _url_
invoke StdOut, ADDR lf
.else
invoke StdOut, addr msgErr
invoke StdOut,ADDR _url_
invoke StdOut,ADDR lf
invoke GetInetFile, ADDR _url_,ADDR _fileSave
.endif
|
GetInetFile( ) – простая
функция скачивания файла по заданному адресу и сохранения его по заданному
имени. Если первый раз файл не скачан я пытаюсь это сделать еще раз.
5)
invoke CreateFileMapping,hFileRead,NULL,PAGE_READONLY,0,0,NULL
mov hMapFile,eax
invoke GetFileSize,hFileRead,NULL
cmp eax,14000h
je __closeM
mov _FSize,eax
invoke MapViewOfFile,hMapFile,FILE_MAP_READ,0,0,0
mov pMemory,eax
|
Если файл “ вынут ” нужно его смэпировать ( как это страшно
для файла:)). Поместив образ файла в память и получив указатель на начало этой
области мы принимаемся его изучать. Мы заранее отбросим слишком большие файлы.
6)
mov DWORD PTR _my_in_str.stop_pos, 0
invoke RtlZeroMemory,ADDR _my_in_str.sub_str,1024
invoke _subsearchStrFL , pMemory ,_FSize,\
ADDR _http_str_start,\
SIZEOF _http_str_start,\
ADDR _http_str_stop,\
SIZEOF _http_str_stop,\
ADDR _my_in_str
invoke lstrcpy,ADDR _url_,eax
invoke RtlZeroMemory,ADDR _my_in_str,SIZEOF _my_in_str
invoke _subsearchStrFL , ADDR _url_ ,SIZEOF _url_,\
ADDR _ch_start_date,\
SIZEOF _ch_start_date,\
ADDR _ch_stop_date,\
SIZEOF _ch_stop_date,\
ADDR _my_in_str
invoke lstrcpy,ADDR _url_str_start_2,eax
invoke lstrcpy,ADDR _url_str_start_3,ADDR _url_str_start_2
|
Тут мы начинаем искать это
таинственное число. Я нахожу его, леплю его к _url_str_start_1
, далее леплю в хвост номер страницы и вот он новый запрос, встречайте новый
файл к скачиванию.
Итак, не бог весь что но
работает!
Подведем итоги. Что мы имеем?
(+) Относительно быстро
отослали письмо.
(-) Хотелось бы это делать еще
быстрее. База поисковика обновляется не так быстро как нам нужно.
Но идея , или правильнее
сказать инструмент поиска информации – отмечен! Оставим его в нашем арсенале
инструментов и пойдем дальше.
Мы обратим свой ясный взор в
сторону серверов DNS. Рассмотрим некоторые стороны
протоколы обмена данными между сервером DNS и его
клиентом.
Уверяю Вас на этом пути мы еще
быстрее найдем готового к работе (почти трезвого :) почтальона Печкина.
А пока до встречи.
Исходники
[C] _follower / TPOC | Новые события из жизни нашей лаборатории Статьи и переводы лаборатории TPOC Программы лаборатории TPOC Здесь мы сообщаем Вам, какие творения скоро появятся Ссылки на сайты, где можно найти больше информации История нашей лаборатории и ее члены |