Войти или зарегистрироваться

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

  • Автор темы Автор темы ilia770
  • Дата начала Дата начала
У меня не стандартный лаунчер, как совместить данный код с моим?
Код:
  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();
    }
  }
 
Ребят опишите пожалуйсто поподробнее, по пунктикам, что куда и зачем, если не сложно конечно. я использую netbeans, выдает ошибки.
И пхп файлик выложите если не сложно.
Зарание примного благодарен

Больше всего ругается на строчку "
catch(FileNotFoundException fnfn)"
 
Да, не сильно можно назвать это уроком ((
Сделайте подробную инструкцию что, зачем, как!
Так как другие делают!!!
 
Какая то проблема пока незнаю в чем именно :

Код:
<?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 клиента ?
 
А нельзя ли сделать нормальный человеческий туториал, а не просто строки кода, впихни то что здесь как хочешь в такой то файл... У меня NetBeams выдает кучу ошибок

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

Ковыряться и ковыряться....(((
 
У меня вопрос: какие импорты надо еще в файле прописать чтоб все функции подхватились?
В частности для 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;
 
можно пару строк импортов сократить
вот так, я делал
Код:
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 - идем в личку)
 
а как проверять хеш не Minecraft.jar а лаунчера?
 
Может чего то не понял, но тут чувствуется 1 большой изъян. Если узнать где на сервере храняться auth.php и т.п. Злоумышленник может собрать лаунчер без проверки md5 и спокойно зайти с ним на сервер. Как понимаю нужно на подходе к auth.php, перед проверкой связки логин пароля, проверять идентификатор лаунчера. Мол не тот = die.
Если не верно расписал сильно не бить.
Ведь даже переименовав auth.php,joinserver.php. Пряча их в самый дальний угол web сервера, закрывая все directory deny from all и храня лаунчер в .exe все равно клиент может перехватить куда конектиться лаунчер.
 
Может чего то не понял, но тут чувствуется 1 большой изъян. Если узнать где на сервере храняться auth.php и т.п. Злоумышленник может собрать лаунчер без проверки md5 и спокойно зайти с ним на сервер. Как понимаю нужно на подходе к auth.php, перед проверкой связки логин пароля, проверять идентификатор лаунчера. Мол не тот = die.
Если не верно расписал сильно не бить.
Ведь даже переименовав auth.php,joinserver.php. Пряча их в самый дальний угол web сервера, закрывая все directory deny from all и храня лаунчер в .exe все равно клиент может перехватить куда конектиться лаунчер.
А вот для этого уже используется проверка md5 клиент<->сервер или же клиент(локальный)<->клиент(удаленный) отключением кнопки "сетевая игра"
 
Может ктонибудь возмется написать подробный гайд
 
Все получилось! Вот инструкция:
Код:
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';
}
?>


Всё должно работать! У меня всё работает прекрасно!!!
 
Все получилось! Вот инструкция:
Код:
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';
}
?>


Всё должно работать! У меня всё работает прекрасно!!!
НА 1.2.5?
 
На всех все хорошо но я не понимаю зачем делать так что бы сервер рассчитывал хеш клиента на сервере, не проще делать что бы он уже вписанный брал, потому что некоторые серверы используют два разных клиента, один например без всего, второй, там с чатом и картой к примеру
 
Все получилось! Вот инструкция:
Код:
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';
}
?>


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

Спасибо , теперь избавимся от читеров !
 
Назад
Верх