diff --git a/pom.xml b/pom.xml index 22792a4..89ee7d8 100644 --- a/pom.xml +++ b/pom.xml @@ -68,13 +68,9 @@ provided - org.springframework.integration - spring-integration-ip - - - org.springframework.integration - spring-integration-core - 6.0.0 + org.reflections + reflections + 0.10.2 diff --git a/src/main/java/com/alterdekim/Server.java b/src/main/java/com/alterdekim/Server.java deleted file mode 100644 index 11978ba..0000000 --- a/src/main/java/com/alterdekim/Server.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.alterdekim; - - -import com.alterdekim.db.Database; -import com.alterdekim.hearthhack.util.Util; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.net.ssl.*; -import java.io.IOException; -import java.util.LinkedList; - -@Slf4j -public class Server implements Runnable { - - private SSLServerSocket serverSocket; - private int portNumber; - private Thread acceptThread; - - private LinkedList connections; - - private Database db; - - public Server(int port) { - portNumber = port; - connections = new LinkedList<>(); - - db = new Database("localhost", 5984, "hs_lobby"); - try { - //SSLServerSocketFactory sslssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); - - serverSocket = (SSLServerSocket) Util.getSocketFactory( - "test.com.crt", - "test.com.crt", - "test.com.key", - "" - ).createServerSocket(portNumber,15); - - - db.start(); - - } catch (Exception e) { - log.error("Init failed: " + e.getMessage()); - } - } - - public void startListening() { - acceptThread = new Thread(this); - acceptThread.start(); - } - public void stopListening() { - for(Connection c:connections) { - c.stopListeningAndDisconnect(); - } - - try { - serverSocket.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - @Override - public void run() { - try { - while(true) { - SSLSocket s = (SSLSocket) serverSocket.accept(); - Connection c = new Connection(s, db); - connections.add(c); - log.info("New Connection Established From "+s.getInetAddress().toString()); - } - } catch(java.net.SocketException e) { - log.error("Listening thread terminated with exception: " + e.getMessage()); - } catch(IOException e) { - log.error(e.getMessage()); - } - } - - public void removeConnection(Connection c) { - connections.remove(c); - } - - public void printConnections() { - log.info("Number of connections "+connections.toString()); - - for(int i=0; i services; + private Map processors; - @Getter - private final Database db; - - public Connection(SSLSocket socket, Database db) { + public TcpConnection(SSLSocket socket) { this.fromClient = socket; - this.db = db; this.init(); this.start(); } @@ -42,7 +34,6 @@ public class Connection extends Thread { } public void send(BattleNetPacket bp) throws Exception { - // log.info("Sending response: " + bp.getHeader().getServiceId() + " / " + bp.getHeader().getMethodId()); this.outToClient.write(bp.Encode()); this.outToClient.flush(); } @@ -53,29 +44,31 @@ public class Connection extends Thread { } private void init() { - this.services = new HashMap<>(); - this.services.put(0, new ConnectionService("")); - this.services.put(1, new AuthService("bnet.protocol.authentication.AuthenticationClient")); // Compute32.Hash("bnet.protocol.authentication.AuthenticationServer") - this.services.put(17, new AccountService("bnet.protocol.account.AccountNotify")); // Compute32.Hash("bnet.protocol.account.AccountService") - this.services.put(4, new PresenceService("bnet.protocol.presence.PresenceService")); // Compute32.Hash("bnet.protocol.presence.PresenceService") - this.services.put(6, new FriendsService("bnet.protocol.friends.FriendsNotify")); // Compute32.Hash("bnet.protocol.friends.FriendsService") - this.services.put(7, new ChannelService("bnet.protocol.channel.Channel")); // Compute32.Hash("bnet.protocol.channel.Channel") - this.services.put(16, new ResourcesService("bnet.protocol.resources.Resources")); - this.services.put(9, new GameUtilitiesService("bnet.protocol.game_utilities.GameUtilities")); + this.processors = new HashMap<>(); + Reflections reflections = new Reflections(this.getClass().getPackageName()); + Set> classes = reflections.getSubTypesOf(Processor.class); + classes.forEach(c -> { + try { + var ci = c.getDeclaredConstructor().newInstance(); + this.processors.put(ci.getProcessorId(), ci); + } catch (Exception e) { + log.error(e.getMessage()); + } + }); } private void processPacket( BattleNetPacket packet ) { try { - Service is = this.services.get(Integer.parseUnsignedInt(Integer.toUnsignedString(packet.getHeader().getServiceId()))); + Processor is = this.processors.get(Integer.parseUnsignedInt(Integer.toUnsignedString(packet.getHeader().getServiceId()))); if( is == null ) { - log.error("Can't process weird ServiceId: " + Integer.parseUnsignedInt(Integer.toUnsignedString(packet.getHeader().getServiceId()))); + log.error("Can't process weird ProcessorId: " + Integer.parseUnsignedInt(Integer.toUnsignedString(packet.getHeader().getServiceId()))); return; } log.info("Incoming: " + is.getClass().getSimpleName() + " / " + packet.getHeader().getMethodId() + " (Token: " + packet.getHeader().getToken() + ")"); is.process(packet, this); } catch ( Exception e ) { - e.printStackTrace(); + log.error(e.getMessage()); } } @@ -102,16 +95,12 @@ public class Connection extends Thread { } baos.close(); } catch (Exception e) { - e.printStackTrace(); + log.error(e.getMessage()); break; } } } catch ( Exception e ) { - e.printStackTrace(); + log.error(e.getMessage()); } - /* - br.close(); - fromClient.close(); - */ } } diff --git a/src/main/java/com/alterdekim/hearthhack/component/TcpServer.java b/src/main/java/com/alterdekim/hearthhack/component/TcpServer.java new file mode 100644 index 0000000..cfe7171 --- /dev/null +++ b/src/main/java/com/alterdekim/hearthhack/component/TcpServer.java @@ -0,0 +1,62 @@ +package com.alterdekim.hearthhack.component; + + +import com.alterdekim.hearthhack.util.Util; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.net.ssl.SSLServerSocket; +import javax.net.ssl.SSLSocket; +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; + +@Slf4j +@Component +public class TcpServer { + + private final int socketPort = 1119; + + private SSLServerSocket serverSocket; + private List connections; + + @Scheduled(fixedDelay = 5000) + private void start() { + try { + if( serverSocket != null && !serverSocket.isClosed() ) { + serverSocket.close(); + serverSocket = null; + } + this.connections = new LinkedList<>(); + this.serverSocket = (SSLServerSocket) Util.getSocketFactory( + "test.com.crt", // "test.com.crt" + "test.com.crt", // "test.com.crt" + "test.com.key", // "test.com.key" + "" + ).createServerSocket(this.socketPort, 15); + + while(true) { + SSLSocket s = (SSLSocket) serverSocket.accept(); + TcpConnection c = new TcpConnection(s); + connections.add(c); + log.info("New Connection Established From {}", s.getInetAddress().toString()); + } + } catch (IOException e) { + log.error(e.getMessage()); + } + } + + public void stopListening() { + connections.forEach(TcpConnection::stopListeningAndDisconnect); + try { + serverSocket.close(); + } catch (IOException e) { + log.error(e.getMessage()); + } + } + + public void removeConnection(TcpConnection c) { + connections.remove(c); + } +} diff --git a/src/main/java/com/alterdekim/services/AccountService.java b/src/main/java/com/alterdekim/hearthhack/component/processor/AccountProcessor.java similarity index 79% rename from src/main/java/com/alterdekim/services/AccountService.java rename to src/main/java/com/alterdekim/hearthhack/component/processor/AccountProcessor.java index 7c16cc6..e0b6f0b 100644 --- a/src/main/java/com/alterdekim/services/AccountService.java +++ b/src/main/java/com/alterdekim/hearthhack/component/processor/AccountProcessor.java @@ -1,22 +1,24 @@ -package com.alterdekim.services; +package com.alterdekim.hearthhack.component.processor; + -import com.alterdekim.Connection; import com.alterdekim.Protocol; +import com.alterdekim.hearthhack.component.TcpConnection; import com.alterdekim.hearthhack.util.BattleNetPacket; import com.alterdekim.hearthhack.util.Util; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class AccountService extends Service { +@Slf4j +public class AccountProcessor extends Processor { - private static final Logger log = LoggerFactory.getLogger(AccountService.class); - - public AccountService(String export_name) { - super(export_name); + public AccountProcessor() { + this.setProcessorId(17); } @Override - public void process(BattleNetPacket packet, Connection conn) throws Exception { + public void process(BattleNetPacket packet, TcpConnection conn) throws Exception { switch (packet.getHeader().getMethodId()) { case 30: // Protocol.GetAccountStateRequest getAccountStateRequest = Protocol.GetAccountStateRequest.parseFrom(packet.getBody()); @@ -57,8 +59,13 @@ public class AccountService extends Service { conn.send(new BattleNetPacket(header1, Util.hexStringToByteArray("12331880B5B9F50E221F0A0D36322E3139372E3234332E383810CBA6011A0A4272617469736C617661280030003800409AE5A1B905"))); break; default: - log.error("Can't process weird AccountService method: " + packet.getHeader().getMethodId()); + log.error("Can't process weird AccountProcessor method: " + packet.getHeader().getMethodId()); break; } } + + @Override + public String getExportName() { + return "bnet.protocol.account.AccountNotify"; + } } diff --git a/src/main/java/com/alterdekim/services/AuthService.java b/src/main/java/com/alterdekim/hearthhack/component/processor/AuthProcessor.java similarity index 89% rename from src/main/java/com/alterdekim/services/AuthService.java rename to src/main/java/com/alterdekim/hearthhack/component/processor/AuthProcessor.java index 90c184f..05a1217 100644 --- a/src/main/java/com/alterdekim/services/AuthService.java +++ b/src/main/java/com/alterdekim/hearthhack/component/processor/AuthProcessor.java @@ -1,24 +1,25 @@ -package com.alterdekim.services; +package com.alterdekim.hearthhack.component.processor; + -import com.alterdekim.Connection; import com.alterdekim.Protocol; +import com.alterdekim.hearthhack.component.TcpConnection; import com.alterdekim.hearthhack.util.BattleNetPacket; import com.alterdekim.hearthhack.util.Util; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.nio.charset.StandardCharsets; -public class AuthService extends Service { +@Slf4j +public class AuthProcessor extends Processor { - private static final Logger log = LoggerFactory.getLogger(AuthService.class); - - public AuthService(String export_name) { - super(export_name); + public AuthProcessor() { + this.setProcessorId(1); } - - private void logonRequest( BattleNetPacket packet, Connection conn ) throws Exception { + private void logonRequest(BattleNetPacket packet, TcpConnection conn ) throws Exception { // Protocol.LogonRequest lr = Protocol.LogonRequest.parseFrom(packet.getBody()); Protocol.Header h = Protocol.Header.newBuilder() @@ -71,7 +72,7 @@ public class AuthService extends Service { } @Override - public void process(BattleNetPacket packet, Connection conn) throws Exception { + public void process(BattleNetPacket packet, TcpConnection conn) throws Exception { switch (packet.getHeader().getMethodId()) { case 1: logonRequest(packet, conn); @@ -153,8 +154,13 @@ public class AuthService extends Service { conn.send(new BattleNetPacket(h, logonResult.toByteArray())); break; default: - log.error("Can't process weird AuthService method: " + packet.getHeader().getMethodId()); + log.error("Can't process weird AuthProcessor method: " + packet.getHeader().getMethodId()); break; } } + + @Override + public String getExportName() { + return "bnet.protocol.authentication.AuthenticationClient"; + } } diff --git a/src/main/java/com/alterdekim/services/ChannelService.java b/src/main/java/com/alterdekim/hearthhack/component/processor/ChannelProcessor.java similarity index 60% rename from src/main/java/com/alterdekim/services/ChannelService.java rename to src/main/java/com/alterdekim/hearthhack/component/processor/ChannelProcessor.java index d6db00c..cda1d80 100644 --- a/src/main/java/com/alterdekim/services/ChannelService.java +++ b/src/main/java/com/alterdekim/hearthhack/component/processor/ChannelProcessor.java @@ -1,21 +1,23 @@ -package com.alterdekim.services; +package com.alterdekim.hearthhack.component.processor; + -import com.alterdekim.Connection; import com.alterdekim.Protocol; +import com.alterdekim.hearthhack.component.TcpConnection; import com.alterdekim.hearthhack.util.BattleNetPacket; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ChannelService extends Service { +@Slf4j +public class ChannelProcessor extends Processor { - private static final Logger log = LoggerFactory.getLogger(ChannelService.class); - - public ChannelService(String export_name) { - super(export_name); + public ChannelProcessor() { + this.setProcessorId(7); } @Override - public void process(BattleNetPacket packet, Connection conn) throws Exception { + public void process(BattleNetPacket packet, TcpConnection conn) throws Exception { switch (packet.getHeader().getMethodId()) { case 1: Protocol.CISubscribeRequest ciSubscribeRequest = Protocol.CISubscribeRequest.parseFrom(packet.getBody()); @@ -27,8 +29,13 @@ public class ChannelService extends Service { conn.send(new BattleNetPacket(header, ciSubscribeResponse.toByteArray())); break; default: - log.error("Can't process weird ChannelService method: " + packet.getHeader().getMethodId()); + log.error("Can't process weird ChannelProcessor method: " + packet.getHeader().getMethodId()); break; } } + + @Override + public String getExportName() { + return "bnet.protocol.channel.Channel"; + } } diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/ConnectionProcessor.java b/src/main/java/com/alterdekim/hearthhack/component/processor/ConnectionProcessor.java new file mode 100644 index 0000000..94d6b93 --- /dev/null +++ b/src/main/java/com/alterdekim/hearthhack/component/processor/ConnectionProcessor.java @@ -0,0 +1,72 @@ +package com.alterdekim.hearthhack.component.processor; + + +import com.alterdekim.Protocol; +import com.alterdekim.hearthhack.component.TcpConnection; +import com.alterdekim.hearthhack.util.BattleNetPacket; +import com.alterdekim.hearthhack.util.Util; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Set; + +@Slf4j +public class ConnectionProcessor extends Processor { + + public ConnectionProcessor() { + this.setProcessorId(0); + } + + /*int GameUtilityProcessor = Compute32.Hash("bnet.protocol.game_utilities.GameUtilities"); + int GameMasterProcessor = Compute32.Hash("bnet.protocol.game_master.GameMaster"); + int NotificationProcessor = Compute32.Hash("bnet.protocol.notification.NotificationProcessor"); + + int ChannelOwnerProcessor = Compute32.Hash("bnet.protocol.channel.ChannelOwner"); + + int ChannelInvitationProcessor = Compute32.Hash("bnet.protocol.channel_invitation.ChannelInvitationProcessor"); + + int ChallengeProcessor = Compute32.Hash("bnet.protocol.challenge.ChallengeProcessor"); + int ResourcesProcessor = Compute32.Hash("bnet.protocol.resources.Resources"); */ + + private void processConnect( BattleNetPacket packet, TcpConnection conn ) throws Exception { + Protocol.ConnectRequest cr = Protocol.ConnectRequest.parseFrom(packet.getBody()); + Protocol.BindResponse.Builder b = Protocol.BindResponse.newBuilder(); + List hashes = cr.getBindRequest().getImportedServiceHashList(); + for( Integer hash : hashes ) { + b.addImportedServiceId(hash); + } + List bs = cr.getBindRequest().getExportedServiceList(); + for( Protocol.BoundService s : bs ) { + Set ks = conn.getProcessors().keySet(); + for( Integer c : ks ) { + Processor ss = conn.getProcessors().get(c); + if( ss != null && ss.getProcessorHash() == s.getHash() ) { + ss.setProcessorId(s.getId()); + break; + } + } + } + + conn._send(Util.hexStringToByteArray("000c08fe011800200028950130000a0c08f4c9ccf30d10c687bcb805120a0889ff5c1092e5a1b9051800220e0a0c0109080a04030507060211102a2e0a2c0d55450000157a72746d1a206ff4fdd5fa5f6d62a278a04403e075d69d734cd4880732dce8edc6a3f528089230a08a95f4cebdcc02422e0a2c0d55450000157a72746d1a20b4bd0f0096a7648de1d19042fb7a79b96c0df48eea3488f498b08ad3d38fb2cc")); + } + + @Override + public void process(BattleNetPacket packet, TcpConnection conn) throws Exception { + switch (packet.getHeader().getMethodId()) { + case 1: + processConnect(packet, conn); + break; + case 5: + // FUCK NODATA + break; + default: + log.error("Can't process weird ConnectionProcessor method: " + packet.getHeader().getMethodId()); + break; + } + } + + @Override + public String getExportName() { + return super.getExportName(); + } +} diff --git a/src/main/java/com/alterdekim/services/FriendsService.java b/src/main/java/com/alterdekim/hearthhack/component/processor/FriendsProcessor.java similarity index 79% rename from src/main/java/com/alterdekim/services/FriendsService.java rename to src/main/java/com/alterdekim/hearthhack/component/processor/FriendsProcessor.java index 5bf69fe..73fae88 100644 --- a/src/main/java/com/alterdekim/services/FriendsService.java +++ b/src/main/java/com/alterdekim/hearthhack/component/processor/FriendsProcessor.java @@ -1,21 +1,22 @@ -package com.alterdekim.services; +package com.alterdekim.hearthhack.component.processor; -import com.alterdekim.Connection; import com.alterdekim.Protocol; +import com.alterdekim.hearthhack.component.TcpConnection; import com.alterdekim.hearthhack.util.BattleNetPacket; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class FriendsService extends Service { +@Slf4j +public class FriendsProcessor extends Processor { - private static final Logger log = LoggerFactory.getLogger(FriendsService.class); - - public FriendsService(String export_name) { - super(export_name); + public FriendsProcessor() { + this.setProcessorId(6); } @Override - public void process(BattleNetPacket packet, Connection conn) throws Exception { + public void process(BattleNetPacket packet, TcpConnection conn) throws Exception { switch (packet.getHeader().getMethodId()) { case 1: //Protocol.SubscribeToFriendsRequest subscribeToFriendsRequest = Protocol.SubscribeToFriendsRequest.parseFrom(packet.getBody()); @@ -35,6 +36,7 @@ public class FriendsService extends Service { .build()) .build(); + Protocol.Header header = Protocol.Header.newBuilder() .setServiceId(254) .setStatus(0) @@ -57,8 +59,13 @@ public class FriendsService extends Service { } break; default: - log.error("Can't process weird FriendsService method: " + packet.getHeader().getMethodId()); + log.error("Can't process weird FriendsProcessor method: " + packet.getHeader().getMethodId()); break; } } + + @Override + public String getExportName() { + return "bnet.protocol.friends.FriendsNotify"; + } } \ No newline at end of file diff --git a/src/main/java/com/alterdekim/services/GameUtilitiesService.java b/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java similarity index 99% rename from src/main/java/com/alterdekim/services/GameUtilitiesService.java rename to src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java index 63e172e..f48e6be 100644 --- a/src/main/java/com/alterdekim/services/GameUtilitiesService.java +++ b/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java @@ -1,21 +1,22 @@ -package com.alterdekim.services; +package com.alterdekim.hearthhack.component.processor; + -import com.alterdekim.Connection; import com.alterdekim.Protocol; +import com.alterdekim.hearthhack.component.TcpConnection; import com.alterdekim.hearthhack.util.BattleNetPacket; import com.alterdekim.hearthhack.util.Util; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; -public class GameUtilitiesService extends Service { - private static final Logger log = LoggerFactory.getLogger(GameUtilitiesService.class); - public GameUtilitiesService(String export_name) { - super(export_name); +@Slf4j +public class GameUtilitiesProcessor extends Processor { + + public GameUtilitiesProcessor() { + this.setProcessorId(9); } @Override - public void process(BattleNetPacket packet, Connection conn) throws Exception { + public void process(BattleNetPacket packet, TcpConnection conn) throws Exception { switch (packet.getHeader().getMethodId()) { case 1: if( packet.getHeader().getToken() == 10 ) { @@ -857,8 +858,13 @@ public class GameUtilitiesService extends Service { } break; default: - log.error("Can't process weird GameUtilitiesService method: " + packet.getHeader().getMethodId()); + log.error("Can't process weird GameUtilitiesProcessor method: " + packet.getHeader().getMethodId()); break; } } + + @Override + public String getExportName() { + return "bnet.protocol.game_utilities.GameUtilities"; + } } diff --git a/src/main/java/com/alterdekim/services/PresenceService.java b/src/main/java/com/alterdekim/hearthhack/component/processor/PresenceProcessor.java similarity index 95% rename from src/main/java/com/alterdekim/services/PresenceService.java rename to src/main/java/com/alterdekim/hearthhack/component/processor/PresenceProcessor.java index 4dfced7..dcefdc8 100644 --- a/src/main/java/com/alterdekim/services/PresenceService.java +++ b/src/main/java/com/alterdekim/hearthhack/component/processor/PresenceProcessor.java @@ -1,24 +1,26 @@ -package com.alterdekim.services; +package com.alterdekim.hearthhack.component.processor; + -import com.alterdekim.Connection; import com.alterdekim.Protocol; +import com.alterdekim.hearthhack.component.TcpConnection; import com.alterdekim.hearthhack.util.BattleNetPacket; import com.alterdekim.hearthhack.util.Util; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.nio.charset.StandardCharsets; -public class PresenceService extends Service { +@Slf4j +public class PresenceProcessor extends Processor { - private static final Logger log = LoggerFactory.getLogger(PresenceService.class); - - public PresenceService(String export_name) { - super(export_name); + public PresenceProcessor() { + this.setProcessorId(4); } @Override - public void process(BattleNetPacket packet, Connection conn) throws Exception { + public void process(BattleNetPacket packet, TcpConnection conn) throws Exception { switch (packet.getHeader().getMethodId()) { case 1: Protocol.SubscribeRequest subscribeRequest = Protocol.SubscribeRequest.parseFrom(packet.getBody()); @@ -236,8 +238,13 @@ public class PresenceService extends Service { } break; default: - log.error("Can't process weird PresenceService method: " + packet.getHeader().getMethodId()); + log.error("Can't process weird PresenceProcessor method: " + packet.getHeader().getMethodId()); break; } } + + @Override + public String getExportName() { + return "bnet.protocol.presence.PresenceProcessor"; + } } diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/Processor.java b/src/main/java/com/alterdekim/hearthhack/component/processor/Processor.java new file mode 100644 index 0000000..db1aa41 --- /dev/null +++ b/src/main/java/com/alterdekim/hearthhack/component/processor/Processor.java @@ -0,0 +1,52 @@ +package com.alterdekim.hearthhack.component.processor; + +import com.alterdekim.Protocol; +import com.alterdekim.hearthhack.component.TcpConnection; +import com.alterdekim.hearthhack.util.BattleNetPacket; +import com.alterdekim.hearthhack.util.Compute32; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@NoArgsConstructor +public abstract class Processor { + + @Setter + private int processorId; + + public int getProcessorHash() { return Compute32.Hash(getExportName()); } + + public String getExportName() { + return ""; + } + + public abstract void process(BattleNetPacket packet, TcpConnection conn) throws Exception; + + public static Protocol.Header generateResponse(int size, int token) { + return Protocol.Header.newBuilder() + .setServiceId(254) + .setSize(size) + .setToken(token) + .build(); + } + + public static Protocol.Header generateResponse(int size, int token, int status, int object_id) { + return Protocol.Header.newBuilder() + .setServiceId(254) + .setSize(size) + .setStatus(status) + .setToken(token) + .setObjectId(object_id) + .build(); + } + + public static Protocol.Header generateResponse(int size, int token, int object_id) { + return Protocol.Header.newBuilder() + .setServiceId(254) + .setSize(size) + .setToken(token) + .setObjectId(object_id) + .build(); + } +} diff --git a/src/main/java/com/alterdekim/services/ResourcesService.java b/src/main/java/com/alterdekim/hearthhack/component/processor/ResourcesProcessor.java similarity index 68% rename from src/main/java/com/alterdekim/services/ResourcesService.java rename to src/main/java/com/alterdekim/hearthhack/component/processor/ResourcesProcessor.java index 9c93ef1..cac0886 100644 --- a/src/main/java/com/alterdekim/services/ResourcesService.java +++ b/src/main/java/com/alterdekim/hearthhack/component/processor/ResourcesProcessor.java @@ -1,23 +1,22 @@ -package com.alterdekim.services; +package com.alterdekim.hearthhack.component.processor; + -import com.alterdekim.Connection; import com.alterdekim.Protocol; +import com.alterdekim.hearthhack.component.TcpConnection; import com.alterdekim.hearthhack.util.BattleNetPacket; import com.alterdekim.hearthhack.util.Util; import com.google.protobuf.ByteString; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; -public class ResourcesService extends Service { +@Slf4j +public class ResourcesProcessor extends Processor { - private static final Logger log = LoggerFactory.getLogger(ResourcesService.class); - - public ResourcesService(String export_name) { - super(export_name); + public ResourcesProcessor() { + this.setProcessorId(16); } @Override - public void process(BattleNetPacket packet, Connection conn) throws Exception { + public void process(BattleNetPacket packet, TcpConnection conn) throws Exception { switch (packet.getHeader().getMethodId()) { case 1: // Protocol.ContentHandleRequest contentHandleRequest = Protocol.ContentHandleRequest.parseFrom(packet.getBody()); @@ -37,8 +36,13 @@ public class ResourcesService extends Service { conn.send(new BattleNetPacket(header, contentHandle.toByteArray())); break; default: - log.error("Can't process weird ResourcesService method: " + packet.getHeader().getMethodId()); + log.error("Can't process weird ResourcesProcessor method: " + packet.getHeader().getMethodId()); break; } } + + @Override + public String getExportName() { + return "bnet.protocol.resources.Resources"; + } } diff --git a/src/main/java/com/alterdekim/hearthhack/config/TcpServerSocketConfiguration.java b/src/main/java/com/alterdekim/hearthhack/config/TcpServerSocketConfiguration.java deleted file mode 100644 index 94449ec..0000000 --- a/src/main/java/com/alterdekim/hearthhack/config/TcpServerSocketConfiguration.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.alterdekim.hearthhack.config; - -import com.alterdekim.hearthhack.handler.BattleNetSocketHandler; -import com.alterdekim.hearthhack.parser.BattleNetSerializerDeserializer; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.integration.config.EnableIntegration; -import org.springframework.integration.dsl.IntegrationFlow; -import org.springframework.integration.ip.dsl.Tcp; -import org.springframework.integration.ip.dsl.TcpInboundGatewaySpec; -import org.springframework.integration.ip.dsl.TcpServerConnectionFactorySpec; - -@Slf4j -@Configuration -@EnableIntegration -public class TcpServerSocketConfiguration { - - private final int socketPort = 1119; - - @Bean - public IntegrationFlow server(BattleNetSocketHandler serverSocketHandler) { - TcpServerConnectionFactorySpec connectionFactory = - Tcp.netServer(socketPort) - .deserializer(new BattleNetSerializerDeserializer()) - .serializer(new BattleNetSerializerDeserializer()) - .soTcpNoDelay(true); - - TcpInboundGatewaySpec inboundGateway = - Tcp.inboundGateway(connectionFactory); - - return IntegrationFlow - .from(inboundGateway) - .handle(serverSocketHandler::handleMessage) - .get(); - } - - @Bean - public BattleNetSocketHandler serverSocketHandler() { - return new BattleNetSocketHandler(); - } -} \ No newline at end of file diff --git a/src/main/java/com/alterdekim/hearthhack/handler/BattleNetSocketHandler.java b/src/main/java/com/alterdekim/hearthhack/handler/BattleNetSocketHandler.java index 4862e2d..436abce 100644 --- a/src/main/java/com/alterdekim/hearthhack/handler/BattleNetSocketHandler.java +++ b/src/main/java/com/alterdekim/hearthhack/handler/BattleNetSocketHandler.java @@ -1,14 +1,10 @@ package com.alterdekim.hearthhack.handler; import lombok.extern.slf4j.Slf4j; -import org.springframework.messaging.Message; -import org.springframework.messaging.MessageHeaders; @Slf4j public class BattleNetSocketHandler { - public String handleMessage(Message message, MessageHeaders messageHeaders) { - log.info(message.getPayload() + ""); - // TODO implement something useful to process the incoming message here... - return message.getPayload().toString(); + public String handleMessage() { + return ""; } } diff --git a/src/main/java/com/alterdekim/services/ConnectionService.java b/src/main/java/com/alterdekim/services/ConnectionService.java deleted file mode 100644 index d3800c5..0000000 --- a/src/main/java/com/alterdekim/services/ConnectionService.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.alterdekim.services; - -import com.alterdekim.Connection; -import com.alterdekim.Protocol; -import com.alterdekim.hearthhack.util.BattleNetPacket; -import com.alterdekim.hearthhack.util.Util; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import java.util.List; -import java.util.Set; - -public class ConnectionService extends Service { - - private static final Logger log = LoggerFactory.getLogger(ConnectionService.class); - - public ConnectionService(String export_name) { - super(export_name); - } - - /*int GameUtilityService = Compute32.Hash("bnet.protocol.game_utilities.GameUtilities"); - int GameMasterService = Compute32.Hash("bnet.protocol.game_master.GameMaster"); - int NotificationService = Compute32.Hash("bnet.protocol.notification.NotificationService"); - - int ChannelOwnerService = Compute32.Hash("bnet.protocol.channel.ChannelOwner"); - - int ChannelInvitationService = Compute32.Hash("bnet.protocol.channel_invitation.ChannelInvitationService"); - - int ChallengeService = Compute32.Hash("bnet.protocol.challenge.ChallengeService"); - int ResourcesService = Compute32.Hash("bnet.protocol.resources.Resources"); */ - - private void processConnect( BattleNetPacket packet, Connection conn ) throws Exception { - Protocol.ConnectRequest cr = Protocol.ConnectRequest.parseFrom(packet.getBody()); - Protocol.BindResponse.Builder b = Protocol.BindResponse.newBuilder(); - List hashes = cr.getBindRequest().getImportedServiceHashList(); - for( Integer hash : hashes ) { - b.addImportedServiceId(hash); - } - List bs = cr.getBindRequest().getExportedServiceList(); - for( Protocol.BoundService s : bs ) { - Set ks = conn.getServices().keySet(); - for( Integer c : ks ) { - Service ss = conn.getServices().get(c); - if( ss != null && ss.getSERVICE_HASH() == s.getHash() ) { - ss.setSERVICE_ID(s.getId()); - break; - } - } - } - - conn._send(Util.hexStringToByteArray("000c08fe011800200028950130000a0c08f4c9ccf30d10c687bcb805120a0889ff5c1092e5a1b9051800220e0a0c0109080a04030507060211102a2e0a2c0d55450000157a72746d1a206ff4fdd5fa5f6d62a278a04403e075d69d734cd4880732dce8edc6a3f528089230a08a95f4cebdcc02422e0a2c0d55450000157a72746d1a20b4bd0f0096a7648de1d19042fb7a79b96c0df48eea3488f498b08ad3d38fb2cc")); - } - - @Override - public void process(BattleNetPacket packet, Connection conn) throws Exception { - switch (packet.getHeader().getMethodId()) { - case 1: - processConnect(packet, conn); - break; - case 5: - // FUCK NODATA - break; - default: - log.error("Can't process weird ConnectionService method: " + packet.getHeader().getMethodId()); - break; - } - } -} diff --git a/src/main/java/com/alterdekim/services/Service.java b/src/main/java/com/alterdekim/services/Service.java deleted file mode 100644 index 558e555..0000000 --- a/src/main/java/com/alterdekim/services/Service.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.alterdekim.services; - -import com.alterdekim.Connection; -import com.alterdekim.hearthhack.util.BattleNetPacket; -import com.alterdekim.hearthhack.util.Compute32; - -public abstract class Service { - - private final int SERVICE_HASH; - private int SERVICE_ID; - - public Service( String export_name ) { - this.SERVICE_HASH = Compute32.Hash(export_name); - } - - public int getSERVICEID() { - return this.SERVICE_ID; - } - - public void setSERVICE_ID(int SERVICE_ID) { - this.SERVICE_ID = SERVICE_ID; - } - - public int getSERVICE_HASH() { - return SERVICE_HASH; - } - - public abstract void process(BattleNetPacket packet, Connection conn) throws Exception; -}