Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

Туториал Связываем клиент, лаунчер и сайт (проверка md5)

Discussion in 'Руководства, инструкции, утилиты' started by ilia770, Dec 19, 2011.

  1. greck

    greck Активный участник

    Trophy Points:
    78
    Может кто объяснит куда эти отрывки кода вставить?
     
  2. Хостинг MineCraft
    <
  3. wkera

    wkera Старожил Пользователь

    Trophy Points:
    103
    У меня не стандартный лаунчер, как совместить данный код с моим?
    Code:
      public void login(String userName, String password) {
        try {
          String parameters = "user=" + URLEncoder.encode(userName, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8") + "&version=" + 13;
          String result = Util.excutePost("http://mysite.ru/auth.php", parameters);
          if (result == null) {
            showError("Невозможно подключится к серверу!");
            loginForm.setNoNetwork();
            return;
          }
          if (!result.contains(":")) {
            if (result.trim().equals("Bad login")) {
              showError("Неправильный логин или пароль!");
            } else if (result.trim().equals("Old version")) {
              loginForm.setOutdated();
              showError("Нужно обновить лаунчер!");
            } else {
              showError(result);
            }
            loginForm.setNoNetwork();
            return;
          }
          String[] values = result.split(":");
     
          launcher = new Launcher();
          launcher.customParameters.putAll(customParameters);
          launcher.customParameters.put("userName", values[2].trim());
          launcher.customParameters.put("latestVersion", values[0].trim());
          launcher.customParameters.put("downloadTicket", values[1].trim());
          launcher.customParameters.put("sessionId", values[3].trim());
          launcher.init();
     
          removeAll();
          add(launcher, "Center");
          validate();
          launcher.start();
          loginForm.loginOk();
          loginForm = null;
          setTitle("Minecraft");
        } catch (Exception e) {
          e.printStackTrace();
          showError(e.toString());
          loginForm.setNoNetwork();
        }
      }
     
    kaban1997 likes this.
  4. Gecsn

    Gecsn Активный участник

    Trophy Points:
    63
    Ребят опишите пожалуйсто поподробнее, по пунктикам, что куда и зачем, если не сложно конечно. я использую netbeans, выдает ошибки.
    И пхп файлик выложите если не сложно.
    Зарание примного благодарен

    Больше всего ругается на строчку "
    catch(FileNotFoundException fnfn)"
     
  5. cubespace

    cubespace Старожил Пользователь

    Trophy Points:
    103
    Да, не сильно можно назвать это уроком ((
    Сделайте подробную инструкцию что, зачем, как!
    Так как другие делают!!!
     
  6. Gecsn

    Gecsn Активный участник

    Trophy Points:
    63
    или выложи хотябы исходники, и чек.пхп
     
  7. cubespace

    cubespace Старожил Пользователь

    Trophy Points:
    103
    Скажите в какой файл запихивать первую часть кода ?
     
  8. cubespace

    cubespace Старожил Пользователь

    Trophy Points:
    103
    Какая то проблема пока незнаю в чем именно :

    Code:
    <?php
    // Файл со скриптом положить на сервер рядом с файлом "minecraft.jar", хеш которого будет расчитываться для сверки c хешем передаваемым лаунчером.
     
    $clientHash = $_GET['hash']; //хеш передаваемый лаунчером по ссылке
    $serverHash = md5_file('minecraft.jar'); //хеш расчитываемый сервером
     
    if ($clientHash == $serverHash)
    {
        echo 'YES';
    }
    else
    {
        echo 'NO';
    }
    ?>
    При таком варианте у меня идет постоянна закачка файлов

    md5 моего (minecraft.jar) - 46820331c120721ddb0a30354e9b4ac0 - который на сервере

    А при таком:

    Code:
    <?php
    // Файл со скриптом положить на сервер рядом с файлом "minecraft.jar", хеш которого будет расчитываться для сверки c хешем передаваемым лаунчером.
     
    $clientHash = $_GET['hash']; //хеш передаваемый лаунчером по ссылке
    $serverHash = 46820331c120721ddb0a30354e9b4ac0; //хеш расчитываемый сервером
     
    if ($clientHash == $serverHash)
    {
        echo 'YES';
    }
    else
    {
        echo 'NO';
    }
    ?>

    Идет сразу запуск клиента!
    Но если я заменю файл minecraft.jar в папке bin, то все равно идет запуск лаунчера уже с тем minecraft.jar который я положил!

    Code:
    http://sait.ru/up/sk.php?hash=46820331c120721ddb0a30354e9b4ac0
    Ответ:
    YES

    а если:

    Code:
    http://sait.ru/up/sk.php?hash=165
    Ответ:
    NO

    Возможно он не может считать md5 клиента ?
     
  9. fractalzombie

    fractalzombie Активный участник

    Trophy Points:
    63
    Skype:
    forest-creature
    Имя в Minecraft:
    root
  10. mops1k

    mops1k Старожил Пользователь

    Trophy Points:
    123
    Skype:
    bednyj.mops
    А нельзя ли сделать нормальный человеческий туториал, а не просто строки кода, впихни то что здесь как хочешь в такой то файл... У меня NetBeams выдает кучу ошибок

    Кое как припилил проверку на eLauncher. Одно но, если файл не проходит проверку, должно запускться обновление, но этого не происходит. Висит строчка Login in...

    Ковыряться и ковыряться....(((
     
  11. Diabolo

    Diabolo Активный участник

    Trophy Points:
    63
    У меня вопрос: какие импорты надо еще в файле прописать чтоб все функции подхватились?
    В частности для Formatter
    Все сам нашел :)
    Думаю они пригодятся другим пользователям:
    Code:
    import java.io.FileInputStream;
    import java.net.URL;
    import java.io.InputStreamReader;
    import java.io.BufferedInputStream;
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.security.MessageDigest;
    import java.security.DigestInputStream;
    import java.util.Formatter;
     
  12. mops1k

    mops1k Старожил Пользователь

    Trophy Points:
    123
    Skype:
    bednyj.mops
    можно пару строк импортов сократить
    вот так, я делал
    Code:
    import java.io.*;
    import java.net.URL;
    import java.security.MessageDigest;
    import java.security.DigestInputStream;
    import java.util.Formatter;
    Я так и не смог решить проблему с обновлением, если клиент не правильный он не обновляется и ничего не делает, просто зависает на Logging in.
    Если вдруг кто знает как исправить, подскажите плз.

    UPDATE:
    Полазал еще немного. Сделал обновление принудительно если неправильный minecraft.jar или отсутствует. Все хорошо, но если бы он еще спрашивал, обновиться или нет... Буду думать дальше.

    Кому нужны исходники eLauncher с готовой проверкой по md5 - идем в личку)
     
    6matko likes this.
  13. Nicolayka

    Nicolayka Активный участник Пользователь

    Trophy Points:
    88
    Имя в Minecraft:
    Nicolayka
    а как проверять хеш не Minecraft.jar а лаунчера?
     
  14. АлексейСПБ

    АлексейСПБ Активный участник

    Trophy Points:
    63
    Имя в Minecraft:
    Lexa91
    Может чего то не понял, но тут чувствуется 1 большой изъян. Если узнать где на сервере храняться auth.php и т.п. Злоумышленник может собрать лаунчер без проверки md5 и спокойно зайти с ним на сервер. Как понимаю нужно на подходе к auth.php, перед проверкой связки логин пароля, проверять идентификатор лаунчера. Мол не тот = die.
    Если не верно расписал сильно не бить.
    Ведь даже переименовав auth.php,joinserver.php. Пряча их в самый дальний угол web сервера, закрывая все directory deny from all и храня лаунчер в .exe все равно клиент может перехватить куда конектиться лаунчер.
     
  15. mops1k

    mops1k Старожил Пользователь

    Trophy Points:
    123
    Skype:
    bednyj.mops
    А вот для этого уже используется проверка md5 клиент<->сервер или же клиент(локальный)<->клиент(удаленный) отключением кнопки "сетевая игра"
     
    АлексейСПБ likes this.
  16. goginn

    goginn Активный участник

    Trophy Points:
    68
    Имя в Minecraft:
    MaH_ga_PuH
    Может ктонибудь возмется написать подробный гайд
     
  17. CryBot

    CryBot Активный участник Пользователь

    Trophy Points:
    88
    Все получилось! Вот инструкция:
    Code:
    public static String calculateHash(MessageDigest algorithm,
                String fileName) throws Exception{
            FileInputStream    fis = new FileInputStream(fileName);
            BufferedInputStream bis = new BufferedInputStream(fis);
            DigestInputStream  dis = new DigestInputStream(bis, algorithm);
     
            while (dis.read() != -1);
                  byte[] hash = algorithm.digest();
     
            return byteArray2Hex(hash);
        }
    private static String byteArray2Hex(byte[] hash) {
            Formatter formatter = new Formatter();
            for (byte b : hash) {
                formatter.format("%02x", b);
            }
            return formatter.toString();
        }

    1.Верхний код вставляем в LauncherFrame после вот этого, что внизу:


    Code:
    //--------------------------------
    //  public String getFakeResult(String userName) {
    //        return Util.getFakeLatestVersion() + ":35b9fd01865fda9d70b157e244cf801c:" + userName + ":12345:";
    //      }
    //---------------------------------


    Code:
          String applicationData = System.getenv("APPDATA");
          String  f = applicationData + "/.minecraft/bin/minecraft.jar";
     
          try
    {
     
      MessageDigest md5  = MessageDigest.getInstance("MD5");
    String p = calculateHash(md5, f);
     
     
                    URL localURL = new URL("http://путь к папке с minecraft.jar на сайте/hash.php?hash=" + p);
            BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(localURL.openStream()));
            String str2 = localBufferedReader.readLine();
            if (str2.equalsIgnoreCase("NO")){
                {
                    GameUpdater.forceUpdate = true;
                }
     
          }
            else if (str2.equalsIgnoreCase("YES"))
            {
            }
     
      }
     
    catch(FileNotFoundException fnfn)
    {
     
     
    }
    2.Код, что выше вставляем после:
    Code:
      public void login(String userName, String password) {
        try {
          String parameters = "user=" + URLEncoder.encode(userName, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8") + "&version=" + 13;
          String result = Util.excutePost("http://ваш путь к auth/auth.php", parameters);
    //      String result = getFakeResult(userName);
          if (result == null) {
            showError("Невозможно подключится к серверу!");
            loginForm.setNoNetwork();
            return;
          }
    Code:
    import java.io.FileInputStream;
    import java.net.URL;
    import java.io.InputStreamReader;
    import java.io.BufferedInputStream;
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.security.MessageDigest;
    import java.security.DigestInputStream;
    import java.util.Formatter;


    3. Вставляем верхний код туда же в LauncherFrame в самом верху файла после этих строк

    Code:
    package net.minecraft;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Frame;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.IOException;
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.Map;
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
    import javax.swing.UIManager;




    4.Потом на сайте создаем файл hash.php в папке, где у вас лежит minecraft.jar и пишем в него:
    Code:
    <?php
    // Файл со скриптом положить на сервер рядом с файлом "minecraft.jar", хеш которого будет расчитываться для сверки c хешем передаваемым лаунчером.
     
    $clientHash = $_GET['hash']; //хеш передаваемый лаунчером по ссылке
    $serverHash = md5_file('minecraft.jar'); //хеш расчитываемый сервером
     
    if ($clientHash == $serverHash)
    {
        echo 'YES';
    }
    else
    {
        echo 'NO';
    }
    ?>

    Всё должно работать! У меня всё работает прекрасно!!!
     
  18. goginn

    goginn Активный участник

    Trophy Points:
    68
    Имя в Minecraft:
    MaH_ga_PuH
    НА 1.2.5?
     
  19. Автор темы
    ilia770

    ilia770 Активный участник

    Trophy Points:
    63
    На всех все хорошо но я не понимаю зачем делать так что бы сервер рассчитывал хеш клиента на сервере, не проще делать что бы он уже вписанный брал, потому что некоторые серверы используют два разных клиента, один например без всего, второй, там с чатом и картой к примеру
     
  20. santila

    santila Активный участник

    Trophy Points:
    88
    Skype:
    cahtujla
    Имя в Minecraft:
    Santila

    Спасибо , теперь избавимся от читеров !
     
  21. rescr1pt

    rescr1pt Старожил Пользователь

    Trophy Points:
    103
    Странно у меня после компиляции в exe требует какойто dll
     

Share This Page