Хостинг серверов Minecraft playvds.com
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем ilia770, 19 дек 2011.

  1. greck

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

    Баллы:
    78
    Может кто объяснит куда эти отрывки кода вставить?
     
    ВремяПриключений нравится это.
  2. Хостинг MineCraft
    <
  3. wkera

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

    Баллы:
    103
    У меня не стандартный лаунчер, как совместить данный код с моим?
    Код:
      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 нравится это.
  4. Gecsn

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

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

    Больше всего ругается на строчку "
    catch(FileNotFoundException fnfn)"
     
    ВремяПриключений нравится это.
  5. cubespace

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

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

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

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

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

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

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

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

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

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

    А при таком:

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

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

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

    а если:

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

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

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

    Баллы:
    63
    Skype:
    forest-creature
    Имя в Minecraft:
    root
    Так что решилось?
     
  10. mops1k

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

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

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

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

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

    Баллы:
    63
    У меня вопрос: какие импорты надо еще в файле прописать чтоб все функции подхватились?
    В частности для Formatter
    Все сам нашел :)
    Думаю они пригодятся другим пользователям:
    Код:
    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 Старожил Пользователь

    Баллы:
    123
    Skype:
    bednyj.mops
    можно пару строк импортов сократить
    вот так, я делал
    Код:
    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 нравится это.
  13. Nicolayka

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

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

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

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

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

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

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

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

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

    Баллы:
    88
    Все получилось! Вот инструкция:
    Код:
    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 после вот этого, что внизу:


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


    Код:
          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.Код, что выше вставляем после:
    Код:
      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;
          }
    Код:
    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 в самом верху файла после этих строк

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

    Всё должно работать! У меня всё работает прекрасно!!!
     
    pizzlywizzly, max--2, SmallSmile и 4 другим нравится это.
  18. goginn

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

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

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

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

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

    Баллы:
    88
    Skype:
    cahtujla
    Имя в Minecraft:
    Santila

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

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

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

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