Welcome to The Passion Of Code Laboratory!!!Статьи

Поиски свободного «почтальона Печкина». Часть 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

Релизы

Здесь мы сообщаем Вам, какие творения скоро появятся

Ссылки

Ссылки на сайты, где можно найти больше информации

Наша лаборатория

История нашей лаборатории и ее члены

У вас есть предложения по нашему сайту?
Напишите сюда
Любимые сайты вирмейкеров:
(WASM)   (RSDN)