Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Pytanie dotyczące silnika.


Rekomendowane odpowiedzi

Opublikowano

Jak jest zrobiony silnik na mchc że on sprawdza czy używa się ich version i co jest umieszczone w version?

Opublikowano

Jak wiadomo mchc to jeden z najbardziej topowych serwerów hardcore w polsce który posiada środki pieniężne i rzesze programistów siedzę w silnikach minecraft trochę ale sam nie wiem jak oni to zrobili i wątpie żeby ktoś na mpc to wiedział.

MQaM4O1.png

Opublikowano

­Sprawdzają swoje ID silnika i tym w pluginach:

((CraftPlayer) player).getHandle().playerConnection.networkManager.getVersion();

sprawdzają wartość wersji, jeżeli się nie zgadza, to nie wejdziesz. ;)

 

sygnatura.png

Opublikowano

­Sprawdzają swoje ID silnika i tym w pluginach:

((CraftPlayer) player).getHandle().playerConnection.networkManager.getVersion();

sprawdzają wartość wersji, jeżeli się nie zgadza, to nie wejdziesz. ;)

 

To nie może być takie proste.

Niektórym osobom wywala info o złym czasie w systemie więc możliwe, że klient łączy się z ich serwerem i tam uzyskuje jakiś token który później jest wysyłany do serwera.

 

Trzeba by po prostu zdekompilować plik jar który dają i przeszukać go pod kątem frazy "mchc" :D

Opublikowano

Oni podobno mają spigot i na serwerze jest 23 pluginy z tego co więm.­

HTBCzoQ.png


Chcesz żebym zobaczył co nabazgrałeś?


dodaj @rzy4y do posta to zobacze :)


if player has name "rzy4y"


Execute command: /Give a like


Opublikowano

Tak jak @pomperek powiedział, MCHC jako że jest jednym z najlepszych hc i największych serwerów w Polsce mają pieniądze i programistów na to żeby takie rozwiązania wprowadzić. Prawdopodobnie ich silnik ma jakieś połączenia z klientem... No nie wiem w sumie ;D

r9wfFzB.png

Opublikowano

Tak jak @pomperek powiedział, MCHC jako że jest jednym z najlepszych hc i największych serwerów w Polsce mają pieniądze i programistów na to żeby takie rozwiązania wprowadzić. Prawdopodobnie ich silnik ma jakieś połączenia z klientem... No nie wiem w sumie ;D

Nieee... pierolisz, client ma połączenie z serverem? Gdzie bezpieczeństwo! gdzie policja!

Od kiedy to tak server może utrzymywać jakieś połączenia z użytkownikiem!

 

Każdy server łączy się z uzytkownikiem... żes dojebał.

 

 

Co do clienta, razem z pomocą @nieznany1234567 odkryłem że po prsotu w HANDSAHE zamianst ip servera wysyla klucz, ten kluczyk jest dośc skomplikowany i zwera timestampa, ale bez problemu może to łamać xD

UEwgNw3.png

MG4OB77.png

Więc to tyle jeśli chodzi o jakieś zabezpieczenia <3

 

 

Co dokladnie zawiera klucz to trudno powiedzieć, bo nie chce mi sie tego dekodoweać, szczególnie że dkompiler sobie nie radzi.. 

A w bytecode sie pierniczyć mi dziś nie chce.

Wiem że zawiera datę, i jest to ostatnia część stringu (albo i nie... jest też na początku, uj wie, nie chce mi się), oraz gdzieś tam po drodze jest hash pliku mchc co by blokować zmiane plików launchera.

 

Ogólnie zabezpieczenie słabe, spodziewałem się czegoś lepszego, godzina by wejść, i pewnie z godzinkę więcej by trzeba było poświęcić by rozkodować klucz, jak ktoś chce to proszę: http://pastebin.com/cwRpnzZE

Niestety jedna metoda sie kompletnie zepsuła, inne też poszły z problemami :P No ale może komuś sie przyda.

 

 

EDIT: klucze trzymają jakieś 15-20 minut

 

EDIT: albo proszę, więcej info:

Czas jest tam gdzieś na początku, a cały koniec klucza to chyba jakaś sumka kontrolna :P widac po kodzie.

Oraz wychodzi na to że klucz kogoś innego dziala też dla ciebie, bo north wysłał mi jego, i zaskoczyło.

1438614356923701010629.png

 

Opublikowano

A co mi tam... jak by ktoś chciał więcej:

    public static String generateKey()
    {
        try
        {
            String key = "narazie_brak:" + new Date().getTime() + ":1:";
            final MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            
            // full class path
            for (final String classPath : System.getProperty("java.class.path").split(System.getProperty("path.separator")))
            {
                try (final FileInputStream fileInputStream = new FileInputStream(new File(classPath)))
                {
                    messageDigest.reset();
                    final byte[] buf = new byte[2048];
                    int i;
                    while ((i = fileInputStream.read(buf)) != - 1)
                    {
                        messageDigest.update(buf, 0, i);
                    }
                    final byte[] digest = messageDigest.digest();
                    final BigInteger bigInteger = new BigInteger(1, digest);
                    String hex = bigInteger.toString(16);
                    while (hex.length() < 32)
                    {
                        hex = "0" + hex;
                    }
                    key += new File(classPath).getName() + "=" + hex + ":";
                }
            }

            // add checksum
            final ByteBuffer checkSumByteBuf = ByteBuffer.allocate(key.length() + 5);
            checkSumByteBuf.put(key.getBytes());
            checkSumByteBuf.put("magia".getBytes());
            final byte[] checkSumBytes = MessageDigest.getInstance("MD5").digest(checkSumByteBuf.array());
            final BigInteger bigInteger = new BigInteger(1, checkSumBytes);
            String checkSumHex = bigInteger.toString(16);
            while (checkSumHex.length() < 32)
            {
                checkSumHex = "0" + checkSumHex;
            }
            key += checkSumHex;

            // last change
            final byte[] bytes = new byte[key.length()];
            final byte[] keyBytes = key.getBytes();
            for (int i = 0; i < key.length(); ++ i)
            {
                bytes[i] = (byte) (keyBytes[i] ^ 103);
            }

            // send as encoded in base64
            return new String(Base64.encode(Unpooled.copiedBuffer(bytes)).array()); // jak nie działa to Base64.encode(bytes)
        } catch (final Exception e)
        {
            e.printStackTrace();
            return null;
        }
    } 

tutaj macie z dekodowanymi stringami :P w postaci metody

 

Jak znajdę chwilkę to może też jebne generator, co poda prawidlowe wartości i tylko czas odpowiednio edytuje.

EDIT: no i macie też generator:

import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.Date;

public class KeyGen
{
    public static String generateKey() throws NoSuchAlgorithmException
    {

        String key = "narazie_brak:" + new Date().getTime() + ":1:realms-1.3.5.jar=9b12c295c39ee87ee01a685b47021221:commons-compress-1.8.1.jar=d862e30ff6b5d78264677dcd6507abb8:httpclient-4.3.3.jar=88cc3123fce88d61b7c2cdbfc33542c5:commons-logging-1.1.3.jar=92eb5aabc1b47287de53d45c086a435c:httpcore-4.3.2.jar=ee3d34dce4a30c7d3002cadf8c9172c1:vecmath-1.3.1.jar=d7e1ab8fc389a50f2b4bb4a6bebc9e1c:trove4j-3.0.3.jar=8fc4d4e0129244f9fd39650c5f30feb2:icu4j-core-mojang-51.2.jar=aec124acf7b3c1c6ed41a6270a4452b8:jopt-simple-4.5.jar=1372bd4823bb1ef61e7db6724f601150:codecjorbis-20101023.jar=0d622e2ac4368b5a33d540a9e4819e0c:codecwav-20101023.jar=f6a93b7eb8083e4ced92e7e253657057:libraryjavasound-20101123.jar=247b45f9d2f0071ad543c14d0ff31d5c:librarylwjglopenal-20100824.jar=93730cef2e75762c5a1431c6d7a0c78e:soundsystem-20120107.jar=6d9d7d6c163caf74984465694d3566e7:netty-all-4.0.10.Final.jar=ec0ec0f03adcc9800cbda8cbc2dc6560:guava-15.0.jar=2c10bb2ca3ac8b55b0e77e54a7eb3744:commons-lang3-3.1.jar=71b48e6b3e1b1dc73fe705604b9c7584:commons-io-2.4.jar=7f97854dc04c119d461fed14f5d8bb96:commons-codec-1.9.jar=75615356605c8128013da9e3ac62a249:jinput-2.0.5.jar=cc07d371f79dc4ed2239e1101ae06313:jutils-1.0.0.jar=f60976b19661c849c5c87433045a9885:gson-2.2.4.jar=2f54fc24807a4cad7297012dd8cebf3d:authlib-1.5.21.jar=70565f6a4aa38a8e8541ef019adbf8ad:log4j-api-2.0-beta9.jar=243049406066e313938e168335069d32:log4j-core-2.0-beta9.jar=152ecb3ce094ac5bc9ea39d6122e2814:lwjgl-2.9.1.jar=71dad15991e937f14ba6e412aef5debf:lwjgl_util-2.9.1.jar=26edc5b18436597e001b3235c785bac7:twitch-5.16.jar=a74ff1813e2d8d4872049ca519b56c81:1.7.10.mchc.jar=2b351d0835da243b85f04dc66de0737c:";

        // checksum or other s**t
        final ByteBuffer checkSumByteBuf = ByteBuffer.allocate(key.length() + 5);
        checkSumByteBuf.put(key.getBytes());
        checkSumByteBuf.put("magia".getBytes());
        String checkSumHex = new BigInteger(1, MessageDigest.getInstance("MD5").digest(checkSumByteBuf.array())).toString(16); // to hex string
        while (checkSumHex.length() < 32)
        {
            checkSumHex = "0" + checkSumHex;
        }

        // add check sum to key
        key += checkSumHex;

        // last changes
        final byte[] bytes = new byte[key.length()];
        final byte[] keyBytes = key.getBytes();
        for (int i = 0; i < key.length(); ++ i)
        {
            bytes[i] = (byte) (keyBytes[i] ^ 103);
        }

        // send as encoded in base64

        return "\u0000" + new String(Base64.getEncoder().encode(bytes));
    }
}
 

zwraca zawsze nowy gotowy do użycia kod :P

Ten wygnerowany kod nalezy wysłać zamiast hosta w:

http://wiki.vg/Protocol#Handshake

I wtedy wszystko śmiga :P

 

A tutaj nawet pokaz działania:

http://ideone.com/lgjshI

 

 

To co? jeszcze poradnik xD?66zF5jZ.png

 

 

 

 

EDIT:

http://www.mpcforum.pl/topic/1431151-jak-oszuka%C4%87-zabezpieczenia-mchcpl-czyli-jak-wej%C5%9B%C4%87-z-w%C5%82asnym-clientem/

poradnik :P

1438614356923701010629.png

 

  • 2 tygodnie później...

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...