Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
minecraft 1.6.4 test
#1
buenas

todos los que han jugado saben que estabamos que utilizabamos spoutcraft hace tiempo

el principal motivo por el cual decidimos probar spoutcraft fue por el soporte de skins que brindaba, el cual se implemento y funciona impecable. lamentablemente todos los plugins de skins que conozco requieren spoutcraft

aunque el spoutcraft lo encontre bastante bueno, lo que no me gusta es que ahora esta casi abandonado por los desarrolladores en favor de otros proyectos que tienen. otro factor a considerar es que nos estabamos perdiendo las interesantes novedades de lsa nuevas versiones de minecraft, como los caballos y otras cosas

si pudieramos encontrar la forma de dar soporte a los skins para bukkit 1.6.4 r2 podriamos implementarlos en nuestro server y gozar de un software mas actualizado, con mejor soporte, con una comunidad mas amplia y con SKINS

es por eso que monte un servidor bukkit 1.6.4 r2 en modo "offline" para hacer algunas pruebas, luego que las pruebas se hagan (espero no mas de una semana si alguien se pone las pilas) se borra todo y se implementaran los cambios en el servidor oficial y se habilitaran las cuentas nuevamente

una de las cosas que me gustaria que prueben son:

- alguna forma SIMPLE de implementar skins, que no sea con ese proxy "mineshafter" que para hacerlo es el medio atao y mas encima igual necesita una cuenta en minecraft.net, con lo que ademas considerando el numero actual de cuentas oficiales el nombre de su pj seria algo como "xXxFerNanDo2013LaLleVaxXx" .. sin embargo podria alguien animarse a decompilarlo para ver como funciona y ver si podemos implementar algo parecido Gran sonrisa

- yo se que cuando un usuario tiene algun skin personalizado, este esta en formato png y el nombre del archivo es igual al nombre del pj y se carga de una url como esta: www.minecraft.net/skin/playername.png .. sospecho que el "minecraft proxy" mencionado mas arriba intercepta las llamadas a esta url y reemplaza la peticion al servidor web que aloja las skins con una al de ellos .. podria alguien buscar algun nombre de cuenta oficial con skin, logearse en nuestro servidor de minecraft con una cuenta del mismo nombre con algun compañero, modificar la ip del dominio "www.minecraft.net" para que apunte a la ip de netgamer.cl editando el archivo hosts, y ver si en algun momento se ven los skins entre ustedes .. sepan que en el servidor web ya habilite los virtualhost "www.minecraft.net" y "s3.amazonaws.com" con la ruta "/skin/playername.png" para hacer pruebas, si me lo piden habilito mas "playernames"

- buscar alguna forma de forzar un cliente especifico (como lo hacia spoutcraft, que solo podias jugar con spout) .. revisar el hash o el tamaño del archivo Minecraft.jar o algo asi .. de esta forma podriamos obligar a todos a usar un cliente que soporte los skins, de pasada tambien bloqueariamos a quien intente meterse con algun cliente hackeado .. encontre esto pero es antiguo = http://dev.bukkit.org/bukkit-plugins/flo...nt-server/


les aviso de antemano que si nadie colabora yo no movere ni un solo dedo, y si veo que se meten a perder el tiempo puro jugando el servidor lo bajo altiro
Responder
#2
hola ... hice un hallazgo .. pueden probarlo ustedes tambien

me logie en el server con el pj "playername" y me aparecio con skin Gran sonrisa

abri otra ventana y me logie tambien, y vi al otro pj con skin Gran sonrisa

hagan la prueba .. traten de encontrar mas pjs "premium" con skin y traten de logearse con esos nombres .. aqui hay uno: Honeydew (www.minecraft.net/skin/Honeydew.png)
Responder
#3
Aqui esta el codigo del Jar con el Proxy de la Skin ahora voy a testear cambiando el host, y despues ver si me deja volver a compilar el jar con los cambios ya que al descompilarlo se pierde parte infima pero ensencial del codigo.

[shcode=java]package net.minecraft.proxy;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ProxyHandler
implements HttpProxyHandler, SocksProxyHandler
{
public static Pattern SKIN_URL = Pattern.compile("http://skins\\.minecraft\\.net/MinecraftSkins/(.+?)\\.png");
public static Pattern CLOAK_URL = Pattern.compile("http://skins\\.minecraft\\.net/MinecraftCloaks/(.+?)\\.png");
public static Pattern AUTHSERVER_URL = Pattern.compile("http://authserver\\.mojang\\.com/(.*)");
private Map skinCache = new Hashtable();
private Map cloakCache = new Hashtable();

public boolean onConnect(InputStream var1, OutputStream var2, SocksMessage var3)
{
var1.mark(65535);
String var4 = readUntil(var1, '\n');
String[] var5 = var4.split(" ");

if (var5.length != 3)
{
System.out.println("Not an HTTP request: " + var4);
try
{
var1.reset();
}
catch (IOException var12)
{
var12.printStackTrace();
}

return false;
}

String var6 = var5[0].toUpperCase();
String var7 = var5[1];
HashMap var8 = new HashMap();
String var9;
do {
var9 = readUntil(var1, '\n');
var9 = var9.trim();
int var10 = var9.indexOf(58);

if (var10 != -1)
{
var8.put(var9.substring(0, var10).toLowerCase().trim(), var9.substring(var10 + 1).trim());
}
}
while (var9.length() > 0);

String var14 = "http://" + (String)var8.get("host") + var7;
System.out.println("Proxy - onConnect - url: " + var14);

if (var6.equals("GET"))
{
if (onGET(var14, var8, var1, var2))
{
return true;
}
}
else if (var6.equals("POST"))
{
if (onPOST(var14, var8, var1, var2))
{
return true;
}
}
else if ((var6.equals("HEAD")) && (onHEAD(var14, var8, var1, var2)))
{
return true;
}

try
{
var1.reset();
}
catch (IOException var13)
{
var13.printStackTrace();
}

return false;
}

public boolean onBind()
{
return false;
}

public boolean onGET(String var1, Map var2, InputStream var3, OutputStream var4)
{
System.out.println("Proxy - onGET: " + var1);
Matcher var5 = SKIN_URL.matcher(var1);
Matcher var6 = CLOAK_URL.matcher(var1);
byte[] var7 = (byte[])null;

if (var5.matches())
{
System.out.println("Proxy: Skin");
String var8 = var5.group(1);

if (!skinCache.containsKey(var8))
{
String usertorequest = var1.replace("http://skins.minecraft.net/MinecraftSkins/", "").replace(".png", "");
var1 = "http://darklbp.tk/launcher/launcher.php?function=1&username=" + usertorequest + "&request=skin";
System.out.println("To: " + var1);
var7 = getRequest(var1);
System.out.println("Response length: " + var7.length);
skinCache.put(var8, var7);
sendResponse(var4, "image/png", var7);
return true;
}

var7 = (byte[])skinCache.get(var8);
}
else if (var6.matches())
{
System.out.println("Proxy: Cloak");
String var8 = var6.group(1);

if (!cloakCache.containsKey(var8))
{
String usertorequest = var1.replace("http://skins.minecraft.net/MinecraftCloaks/", "").replace(".png", "");
var1 = "http://darklbp.tk/launcher/launcher.php?function=1&username=" + usertorequest + "&request=cloak";
System.out.println("To: " + var1);
var7 = getRequest(var1);
System.out.println("Response length: " + var7.length);
cloakCache.put(var8, var7);
sendResponse(var4, "image/png", var7);
return true;
}

var7 = (byte[])cloakCache.get(var8);
}

return false;
}

public boolean onPOST(String var1, Map var2, InputStream var3, OutputStream var4)
{
return false;
}

public boolean onHEAD(String var1, Map var2, InputStream var3, OutputStream var4)
{
return false;
}

public boolean onCONNECT(String var1, Map var2, InputStream var3, OutputStream var4)
{
return false;
}

private void sendResponse(OutputStream var1, String var2, String var3)
{
sendResponse(var1, var2, var3.getBytes());
}

private void sendResponse(OutputStream var1, String var2, byte[] var3)
{
OutputStreamWriter var4 = new OutputStreamWriter(var1);
try
{
var4.append("HTTP/1.0 200 OK\r\nConnection: close\r\nProxy-Connection: close\r\n");
var4.append("Content-Length: " + Integer.toString(var3.length) + "\r\n");

if (var2 != null)
{
var4.append("Content-Type: " + var2 + "\r\n\r\n");
}

var4.flush();
var1.write(var3);
var1.flush();
var1.close();
}
catch (IOException var6)
{
System.out.println("Proxy - sendResponse error:");
var6.printStackTrace();
}
}

public static byte[] getRequest(String var0)
{
try
{
HttpURLConnection var1 = (HttpURLConnection)new URL(var0).openConnection(Proxy.NO_PROXY);
var1.setUseCaches(false);
var1.setDefaultUseCaches(false);
var1.setRequestProperty("Cache-Control", "no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0");
var1.setRequestProperty("Expires", "0");
var1.setRequestProperty("Pragma", "no-store, no-cache");
var1.setInstanceFollowRedirects(true);
Map var2 = var1.getRequestProperties();
int var3 = var1.getResponseCode();

if (var3 / 100 == 3)
{
System.out.println("Java didn't redirect automatically, going manual: " + Integer.toString(var3));
String var4 = var1.getHeaderField("location").trim();
System.out.println("Manual redirection to: " + var4);
return getRequest(var4);
}

System.out.println("Response: " + var3);

if (var3 == 403)
{
String var4 = "403 from req to " + var0 + "\nRequest headers:\n";
Iterator var6 = var2.keySet().iterator();

while (var6.hasNext())
{
String var5 = (String)var6.next();

if (var5 != null)
{
List var7 = (List)var2.get(var5);
String var8;
for (Iterator var9 = var7.iterator(); var9.hasNext(); var4 = var4 + var5 + ": " + var8 + "\n")
{
var8 = (String)var9.next();
}
}
}

var4 = var4 + "Response headers:\n";
Map var13 = var1.getHeaderFields();
Iterator var16 = var13.keySet().iterator();

while (var16.hasNext())
{
String var15 = (String)var16.next();

if (var15 != null)
{
List var17 = (List)var13.get(var15);
String var18;
for (Iterator var10 = var17.iterator(); var10.hasNext(); var4 = var4 + var15 + ": " + var18 + "\n")
{
var18 = (String)var10.next();
}
}
}

System.out.println(var4);
System.out.println("Contents:\n" + new String(grabData(var1.getErrorStream())));
}

if (var3 / 100 == 4)
{
return new byte[0];
}

BufferedInputStream var14 = new BufferedInputStream(var1.getInputStream());
return grabData(var14);
}
catch (MalformedURLException var11)
{
System.out.println("Bad URL in getRequest:");
var11.printStackTrace();
}
catch (IOException var12)
{
System.out.println("IO error during a getRequest:");
var12.printStackTrace();
}

return new byte[0];
}

public static byte[] postRequest(String var0, String var1, String var2)
{
ByteArrayOutputStream var3 = new ByteArrayOutputStream();
OutputStreamWriter var4 = new OutputStreamWriter(var3);
try
{
var4.write(var1);
var4.flush();
}
catch (IOException var6)
{
var6.printStackTrace();
}

byte[] var5 = postRequest(var0, var3.toByteArray(), var2);
return var5;
}

public static byte[] postRequest(String var0, byte[] var1, String var2)
{
try
{
URL var3 = new URL(var0);
HttpURLConnection var4 = (HttpURLConnection)new URL(var0).openConnection(Proxy.NO_PROXY);
var4.setDoOutput(true);
var4.setRequestMethod("POST");
var4.setRequestProperty("Host", var3.getHost());
var4.setRequestProperty("Content-Length", Integer.toString(var1.length));
var4.setRequestProperty("Content-Type", var2);
BufferedOutputStream var5 = new BufferedOutputStream(var4.getOutputStream());
var5.write(var1);
var5.flush();
var5.close();
return grabData(new BufferedInputStream(var4.getInputStream()));
}
catch (UnknownHostException var7)
{
System.out.println("Unable to resolve remote host, returning null");
}
catch (MalformedURLException var8)
{
System.out.println("Bad URL when doing postRequest:");
var8.printStackTrace();
}
catch (IOException var9)
{
var9.printStackTrace();
}

return null;
}

public static byte[] grabData(InputStream var0)
{
ByteArrayOutputStream var1 = new ByteArrayOutputStream();
byte[] var2 = new byte[1024];
while (true)
{
int var3;
try
{
var3 = var0.read(var2);

if (var3 == -1)
{
break;
}
}
catch (IOException var5)
{
break;
}

var1.write(var2, 0, var3);
}

return var1.toByteArray();
}

public static String readUntil(InputStream var0, String var1)
{
return readUntil(var0, var1.getBytes());
}

public static String readUntil(InputStream var0, char var1)
{
return readUntil(var0, new byte[] { (byte)var1 });
}

public static String readUntil(InputStream var0, byte var1)
{
return readUntil(var0, new byte[] { var1 });
}

public static String readUntil(InputStream var0, byte[] var1)
{
ByteArrayOutputStream var2 = new ByteArrayOutputStream();
try
{
int var3 = 0;
boolean var4;
do
{
var4 = false;
byte var5;
try
{
var5 = (byte)var0.read();
}
catch (EOFException var8)
{
break;
}

if (var5 == var1[var3])
{
if (var3 == var1.length - 1)
{
var4 = true;
}

var3++;
}
else
{
var3 = 0;
}

var2.write(var5);
}
while (!var4);
}
catch (IOException var9)
{
System.out.println("readUntil unable to read from InputStream, endSeq: " + new String(var1));
var9.printStackTrace();
}

try
{
return var2.toString("UTF-8");
}
catch (UnsupportedEncodingException var7) {
}
return null;
}
}[/shcode]
Responder
#4
esas dudas tengo AT que relacion tiene lo destacado.

y ese
Responder
#5
(07-11-2013, 01:35 PM)ToyDead escribió: esas dudas tengo AT que relacion tiene lo destacado.

y ese

estas descompilando el launcher con pestaña de skin? o el Minecraft.jar ??

mejor empieza por descompilar el Minecraft.jar .. que es dentro del juego donde se ven los skins .. una vez comenzado el juego creo que el launcher se cierra

si tu abres www.minecraft.net/cualquiernombre.png y en vez de bajar un png te sale un xml diciendo que la cuenta no existe o algo asi ... me parece que la direccion es en realidad un script que revisa la parte de "cualquiernombre" y revisa si existe la cuenta, si es premium y si ha cambiado el skin .. y si es asi lee el archivo png y te lo manda

o sea que la verificacion pienso que la debe hacer el servidor web donde estan los skins .. yo no pienso hacer ninguna verificacion y si el jugador no tiene skin se le mandara un 404 no mas .. supongo que con eso debe bastar

de nuevo ... revisa el codigo del Minecraft.jar .. no de los launchers .. despues lo hacemos para ver como hacen para saltarse la cuenta premium Sonrisa
Responder
#6
(07-11-2013, 01:47 PM)admin escribió:
(07-11-2013, 01:35 PM)ToyDead escribió: esas dudas tengo AT que relacion tiene lo destacado.

y ese

estas descompilando el launcher con pestaña de skin? o el Minecraft.jar ??

mejor empieza por descompilar el Minecraft.jar .. que es dentro del juego donde se ven los skins .. una vez comenzado el juego creo que el launcher se cierra

si tu abres www.minecraft.net/cualquiernombre.png y en vez de bajar un png te sale un xml diciendo que la cuenta no existe o algo asi ... me parece que la direccion es en realidad un script que revisa la parte de "cualquiernombre" y revisa si existe la cuenta, si es premium y si ha cambiado el skin .. y si es asi lee el archivo png y te lo manda

o sea que la verificacion pienso que la debe hacer el servidor web donde estan los skins .. yo no pienso hacer ninguna verificacion y si el jugador no tiene skin se le mandara un 404 no mas .. supongo que con eso debe bastar

de nuevo ... revisa el codigo del Minecraft.jar .. no de los launchers .. despues lo hacemos para ver como hacen para saltarse la cuenta premium Sonrisa

si estoy revisando el launcher con pestaña skin.

Pero como podi ver en el codigo de echo hace ese proceso.
te logeas (el cliente crea una UUID deribada del username, ligada).
que queda registrada en el archivo Launcher_profile.json.
en el codigo que te puse en recortes dice que ahuntentifica ese username con su UUID en el servidor original la cual revisa si el username y su UUID tiene un skin designado, el servidor de skin se encarga de sacar 843824.png renombrandola al nombre de usuario y la envia al cliente y el cliente la manda al servidor de juego, (SE CIERRA LAUNCHER), es por eso que no se puede acceder por link a la foto via web.

es asi, tambien revise el codigo de la seccion ahuntentificacion y hay genera el UUID a partir del username.

[shcode=java]package net.minecraft.launcher.authentication;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import net.minecraft.launcher.authentication.yggdrasil.YggdrasilAuthenticationService;

public class AuthenticationDatabase
{
public static final String DEMO_UUID_PREFIX = "demo-";
private final Map<String, AuthenticationService> authById;

public AuthenticationDatabase()
{
this(new HashMap());
}

public AuthenticationDatabase(Map<String, AuthenticationService> authById) {
this.authById = authById;
}

public AuthenticationService getByName(String name) {
if (name == null) return null;

for (Map.Entry entry : authById.entrySet()) {
GameProfile profile = ((AuthenticationService)entry.getValue()).getSelectedProfile();

if ((profile != null) && (profile.getName().equals(name)))
return (AuthenticationService)entry.getValue();
if ((profile == null) && (getUserFromDemoUUID((String)entry.getKey()).equals(name))) {
return (AuthenticationService)entry.getValue();
}
}

return null;
}

public AuthenticationService getByUUID(String uuid) {
return (AuthenticationService)authById.get(uuid);
}

public Collection<String> getKnownNames() {
List names = new ArrayList();

for (Map.Entry entry : authById.entrySet()) {
GameProfile profile = ((AuthenticationService)entry.getValue()).getSelectedProfile();

if (profile != null)
names.add(profile.getName());
else {
names.add(getUserFromDemoUUID((String)entry.getKey()));
}
}

return names;
}

public void register(String uuid, AuthenticationService authentication) {
authById.put(uuid, authentication);
}

public Set<String> getknownUUIDs() {
return authById.keySet();
}

public void removeUUID(String uuid) {
authById.remove(uuid);
}

public static String getUserFromDemoUUID(String uuid)
{
if ((uuid.startsWith("demo-")) && (uuid.length() > "demo-".length())) {
return "Demo User " + uuid.substring("demo-".length());
}
return "Demo User";
}

public static class Serializer
implements JsonDeserializer<AuthenticationDatabase>, JsonSerializer<AuthenticationDatabase>
{
public AuthenticationDatabase deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException
{
TypeToken token = new TypeToken()
{
};
Map services = new HashMap();
Map credentials = (Map)context.deserialize(json, token.getType());

for (Map.Entry entry : credentials.entrySet()) {
AuthenticationService service = new YggdrasilAuthenticationService();
service.loadFromStorage((Map)entry.getValue());
services.put(entry.getKey(), service);
}

return new AuthenticationDatabase(services);
}

public JsonElement serialize(AuthenticationDatabase src, Type typeOfSrc, JsonSerializationContext context)
{
Map services = src.authById;
Map credentials = new HashMap();

for (Map.Entry entry : services.entrySet()) {
credentials.put(entry.getKey(), ((AuthenticationService)entry.getValue()).saveForStorage());
}

return context.serialize(credentials);
}
}
}

package net.minecraft.launcher.authentication;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import javax.swing.SwingUtilities;
import net.minecraft.launcher.Launcher;
import net.minecraft.launcher.events.AuthenticationChangedListener;
import org.apache.commons.lang3.StringUtils;

public abstract class BaseAuthenticationService
implements AuthenticationService
{
private static final String LEGACY_LASTLOGIN_PASSWORD = "passwordfile";
private static final int LEGACY_LASTLOGIN_SEED = 43287234;
private final List<AuthenticationChangedListener> listeners = new ArrayList();
private String username;
private String password;
private GameProfile selectedProfile;
private boolean shouldRememberMe = true;

public boolean canLogIn()
{
return (!canPlayOnline()) && (StringUtils.isNotBlank(getUsername())) && (StringUtils.isNotBlank(getPassword()));
}

public void logOut()
{
password = null;
setSelectedProfile(null);
}

public boolean isLoggedIn()
{
return getSelectedProfile() != null;
}

public boolean canPlayOnline()
{
return (isLoggedIn()) && (getSelectedProfile() != null) && (getSessionToken() != null);
}

public void addAuthenticationChangedListener(AuthenticationChangedListener listener)
{
listeners.add(listener);
}

public void removeAuthenticationChangedListener(AuthenticationChangedListener listener)
{
listeners.remove(listener);
}

protected void fireAuthenticationChangedEvent() {
final List listeners = new ArrayList(this.listeners);

for (Iterator iterator = listeners.iterator(); iterator.hasNext(); ) {
AuthenticationChangedListener listener = (AuthenticationChangedListener)iterator.next();

if (!listener.shouldReceiveEventsInUIThread()) {
listener.onAuthenticationChanged(this);
iterator.remove();
}
}

if (!listeners.isEmpty())
SwingUtilities.invokeLater(new Runnable()
{
public void run() {
for (AuthenticationChangedListener listener : listeners)
listener.onAuthenticationChanged(BaseAuthenticationService.this);
}
});
}

public void setUsername(String username)
{
if ((isLoggedIn()) && (canPlayOnline())) {
throw new IllegalStateException("Cannot change username whilst logged in & online");
}

this.username = username;
}

public void setPassword(String password) {
if ((isLoggedIn()) && (canPlayOnline()) && (StringUtils.isNotBlank(password))) {
throw new IllegalStateException("Cannot set password whilst logged in & online");
}

this.password = password;
}

public String getUsername() {
return username;
}

protected String getPassword() {
return password;
}

public void loadFromStorage(Map<String, String> credentials)
{
logOut();

if (credentials.containsKey("rememberMe")) {
setRememberMe(Boolean.getBoolean((String)credentials.get("rememberMe")));
}

setUsername((String)credentials.get("username"));

if ((credentials.containsKey("displayName")) && (credentials.containsKey("uuid")))
setSelectedProfile(new GameProfile((String)credentials.get("uuid"), (String)credentials.get("displayName")));
}

public Map<String, String> saveForStorage()
{
Map result = new HashMap();

if (!shouldRememberMe()) {
result.put("rememberMe", Boolean.toString(false));
return result;
}

if (getUsername() != null) {
result.put("username", getUsername());
}

if (getSelectedProfile() != null) {
result.put("displayName", getSelectedProfile().getName());
result.put("uuid", getSelectedProfile().getId());
}

return result;
}

public boolean shouldRememberMe()
{
return shouldRememberMe;
}

public void setRememberMe(boolean rememberMe)
{
shouldRememberMe = rememberMe;
}

protected void setSelectedProfile(GameProfile selectedProfile) {
this.selectedProfile = selectedProfile;
}

public GameProfile getSelectedProfile() {
return selectedProfile;
}

public String toString()
{
StringBuilder result = new StringBuilder();

result.append(getClass().getSimpleName());
result.append("{");

if (isLoggedIn()) {
result.append("Logged in as ");
result.append(getUsername());

if (getSelectedProfile() != null) {
result.append(" / ");
result.append(getSelectedProfile());
result.append(" - ");

if (canPlayOnline()) {
result.append("Online with session token '");
result.append(getSessionToken());
result.append("'");
} else {
result.append("Offline");
}
}
} else {
result.append("Not logged in");
}

result.append("}");

return result.toString();
}

public String guessPasswordFromSillyOldFormat(File file) {
String[] details = getStoredDetails(file);

if ((details != null) &&
(details[0].equals(getUsername()))) {
return details[1];
}

return null;
}

public static String[] getStoredDetails(File lastLoginFile) {
if (!lastLoginFile.isFile()) return null;
try
{
Cipher cipher = getCipher(2, "passwordfile");
DataInputStream dis;
DataInputStream dis;
if (cipher != null)
dis = new DataInputStream(new CipherInputStream(new FileInputStream(lastLoginFile), cipher));
else {
dis = new DataInputStream(new FileInputStream(lastLoginFile));
}

String username = dis.readUTF();
String password = dis.readUTF();
dis.close();
return new String[] { username, password };
} catch (Exception e) {
Launcher.getInstance().println("Couldn't load old lastlogin file", e);
}return null;
}

private static Cipher getCipher(int mode, String password) throws Exception
{
Random random = new Random(43287234L);
byte[] salt = new byte[8];
random.nextBytes(salt);
PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, 5);

SecretKey pbeKey = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(new PBEKeySpec(password.toCharArray()));
Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
cipher.init(mode, pbeKey, pbeParamSpec);
return cipher;
}
}[/shcode]
Responder
#7
hola ... descubri que las urls de donde se obtienen los skins y las capas son:

httq://skins.minecraft.net/MinecraftSkins/playername.png
httq://skins.minecraft.net/MinecraftCloaks/playername.png

(es http, no httq)

me parece que primero revisa si el nombre de cuenta es premium, y si lo es solicita el skin y las capa, asi que el truco primero debe ser que el cliente modificado piense que cualquier cuenta es premium Sonrisa
Responder
#8
tenemos tres cosas que revisar con el launcher / minecraft.jar

- minecraft crackeado (bypasear la comprobacion de premium)
- hacer funcionar los skins de forma nativa (que tome nuestro servidor web para los skins y capas)
- forzar un cliente / minecraft.jar especifico

ustedes ven la que sea mas urgente, util o entretenida, y postean la actividad que eligieron y el progreso para coordinarnos

recursos necesarios:

- para bypasear las cuentas premium = analizar el el laucher de teamextreme, el con skins incorporado (ellos se saltan el chequeo premium, si encuentras otro por ahi mejor), y el launcher oficial (como referencia para comparar)

- para revisar el funcionamiento de las capas y skins = el launcher con skins, el launcher oficial (comparar el codigo de los dos)

- para ver como se puede forzar un cliente = ESTE plugin: http://dev.bukkit.org/bukkit-plugins/flo...nt-server/

- algun descompilador de java (jd-gui , mcp, etc.)

- un sniffer (como el wireshark, opcional)

- cualquiera que sirva

notas:

- en este momento el server es un craftbukkit 1.6.4 r2 oficial sin modificar, el server esta en modo offline con dificultad 0 (sin mobs)
- la pagina web para cambiar el skin ya NO FUNCIONA porque la hice para spoutcraft (con spoutcraft se podia)
- aunque era muy bueno, ya no usamos spoutcraft porque se quedo obsoleto y no tenia mucho soporte
Responder
#9
si esos son loas direciones AT y las que modifique a netgamer pero no me dio resultado. al parecer algo me falla al compilar el .class nuevamente. seria de gran alluda si me pasaras un buen compilador java a class. para no estar weviando con la consola de comando ya que me tira algunos errores
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)