From 5a1ac47828717dd31e3ee17c556c7cb9ae516cb0 Mon Sep 17 00:00:00 2001 From: alterdekim Date: Fri, 31 May 2024 03:50:31 +0300 Subject: [PATCH] refactoring. Rewriting code to spring-boot service, changing token-based filtering to data-based filtering. --- .../hearthhack/component/TcpConnection.java | 7 + .../component/processor/AuthProcessor.java | 21 +- .../processor/GameUtilitiesProcessor.java | 266 ++++++++++++++---- .../processor/PresenceProcessor.java | 18 +- .../handler/BattleNetSocketHandler.java | 10 - .../BattleNetSerializerDeserializer.java | 27 -- .../util/GetAccountInfoRequest.java | 71 +++++ src/main/proto/bnet/protocol/protocol.proto | 149 ++++++++++ 8 files changed, 458 insertions(+), 111 deletions(-) delete mode 100644 src/main/java/com/alterdekim/hearthhack/handler/BattleNetSocketHandler.java delete mode 100644 src/main/java/com/alterdekim/hearthhack/parser/BattleNetSerializerDeserializer.java create mode 100644 src/main/java/com/alterdekim/hearthhack/util/GetAccountInfoRequest.java diff --git a/src/main/java/com/alterdekim/hearthhack/component/TcpConnection.java b/src/main/java/com/alterdekim/hearthhack/component/TcpConnection.java index 0de99ef..d8dbca0 100644 --- a/src/main/java/com/alterdekim/hearthhack/component/TcpConnection.java +++ b/src/main/java/com/alterdekim/hearthhack/component/TcpConnection.java @@ -19,6 +19,9 @@ public class TcpConnection extends Thread { private final SSLSocket fromClient; private OutputStream outToClient; + @Getter + private int token; + @Getter private Map processors; @@ -99,4 +102,8 @@ public class TcpConnection extends Thread { log.error(e.getMessage()); } } + + public int nextToken() { + return this.token++; + } } diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/AuthProcessor.java b/src/main/java/com/alterdekim/hearthhack/component/processor/AuthProcessor.java index 2dac484..b55cf07 100644 --- a/src/main/java/com/alterdekim/hearthhack/component/processor/AuthProcessor.java +++ b/src/main/java/com/alterdekim/hearthhack/component/processor/AuthProcessor.java @@ -27,24 +27,24 @@ public class AuthProcessor extends Processor { h = Protocol.Header.newBuilder() .setServiceId(1) .setObjectId(0) - .setToken(0) + .setToken(conn.nextToken()) .setMethodId(12) .setStatus(0) .setSize(b.length) .build(); - conn.send(new BattleNetPacket(h, b)); - + h = Protocol.Header.newBuilder() .setServiceId(1) .setObjectId(0) - .setToken(1) + .setToken(conn.nextToken()) .setMethodId(13) .setStatus(0) .setSize(0) .build(); conn.send(new BattleNetPacket(h, new byte[0])); + //120C7765625F617574685F75726C1A16687474703A2F2F68732F6C6F67696E2F7A2E68746D6C byte[] us = "http://0.0.0.0:8080".getBytes(StandardCharsets.UTF_8); byte[] bb = Util.hexStringToByteArray("120C7765625F617574685F75726C1A"+Util.intToHex(us.length)+Util.bytesToHex(us)); @@ -52,13 +52,14 @@ public class AuthProcessor extends Processor { h = Protocol.Header.newBuilder() .setServiceId(8) .setObjectId(0) - .setToken(2) + .setToken(conn.nextToken()) .setMethodId(3) .setStatus(0) .setSize(bb.length) .build(); conn.send(new BattleNetPacket(h, bb)); + } private void selectGameAccount(BattleNetPacket packet, TcpConnection conn) throws Exception { @@ -78,24 +79,25 @@ public class AuthProcessor extends Processor { h = Protocol.Header.newBuilder() .setServiceId(10) .setMethodId(1) - .setToken(4) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(2) .setStatus(0) .build(); conn.send(new BattleNetPacket(h, Util.hexStringToByteArray("0800"))); - + h = Protocol.Header.newBuilder() .setServiceId(10) .setMethodId(1) - .setToken(5) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(2) .setStatus(0) .build(); conn.send(new BattleNetPacket(h, Util.hexStringToByteArray("0800"))); + // THIRD //Protocol.LogonResult lr = Protocol.LogonResult.parseFrom(Util.hexStringToByteArray("080012120900000000000000011193710E1A000000001A12094743545702000002116739AB040000000022002801280228032806286230023A0F517569726B794F72632332393638384202534B4A40AA15061771938C7790CDA59BD500BF2AA3205912148098F8B68ADA802F1122B2792D90FA2952A338032A03895322DD02C4E2F3CFE6CD72415466B3798C9ADB015000")); @@ -117,13 +119,14 @@ public class AuthProcessor extends Processor { h = Protocol.Header.newBuilder() .setServiceId(1) .setMethodId(5) - .setToken(6) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(logonResult.getSerializedSize()) .setStatus(0) .build(); conn.send(new BattleNetPacket(h, logonResult.toByteArray())); + } @Override diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java b/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java index 65ea2b6..86b2dd3 100644 --- a/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java +++ b/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java @@ -3,10 +3,8 @@ 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.ClientRequestBody; -import com.alterdekim.hearthhack.util.ClientRequestManager; -import com.alterdekim.hearthhack.util.Util; +import com.alterdekim.hearthhack.util.*; +import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; import lombok.extern.slf4j.Slf4j; @@ -36,11 +34,157 @@ public class GameUtilitiesProcessor extends Processor { return requestBody; } + private void parseRequestNetCacheObject(ClientRequestBody body, TcpConnection conn) throws InvalidProtocolBufferException { + parseGenericRequest(Protocol.UtilGenericRequest.parseFrom(body.getBody()), conn); + } + + private void processGoldBalance( TcpConnection conn ) throws Exception { + Protocol.GoldBalance gb = Protocol.GoldBalance.newBuilder() + .setCap(999999) + .setBonusBalance(165) + .setCappedBalance(160) + .setCapWarning(2000) + .build(); + + byte[] b = generateNotification(278, gb.toByteString(), gb.getSerializedSize()).toByteArray(); + + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(conn.nextToken()) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + } + + private void parseGenericRequest(Protocol.UtilGenericRequest genericRequest, TcpConnection conn) { + // body = genericRequest.getGenericData().getData().toByteArray() + GetAccountInfoRequest req = GetAccountInfoRequest.parseFromInt(genericRequest.getRequestSubId()); + try { + switch (req) { + case GOLD_BALANCE -> processGoldBalance(conn); + default -> log.warn("Unknown generic request: {}", req); + } + } catch (Exception e) { + log.error(e.getMessage()); + } + } + + private void parseRequestNetCacheObjectList(ClientRequestBody body, TcpConnection conn) throws InvalidProtocolBufferException { + Protocol.GenericRequestList genericRequestList = Protocol.GenericRequestList.parseFrom(body.getBody()); + genericRequestList.getRequestsList().forEach(gr -> this.parseGenericRequest(gr, conn)); + } + + private void parseSubscriptionRequest(ClientRequestBody body) throws InvalidProtocolBufferException { + Protocol.Subscribe subscribe = Protocol.Subscribe.parseFrom(body.getBody()); + log.info("parseSubscriptionRequest: {}", subscribe); + } + + private void parseGetAssetsVersion(ClientRequestBody body) { + log.info("parseGetAssetsVersion: got"); + } + + private void parseCheckAccountLicenses(ClientRequestBody body) { + // CheckAccountLicensesResponse + log.info("parseCheckAccountLicenses: got"); + } + + private void parseUpdateLogin(ClientRequestBody body) throws InvalidProtocolBufferException { + Protocol.UpdateLogin updateLogin = Protocol.UpdateLogin.parseFrom(body.getBody()); + log.info("parseUpdateLogin: {}", updateLogin); + } + + private void parseCheckGameLicenses(ClientRequestBody body) { + log.info("parseCheckGameLicenses: got"); + // CheckGameLicensesResponse + } + + private void parseGetAdventureProgress(ClientRequestBody body) { + log.info("parseGetAdventureProgress: got"); + } + + private void parseGetBattlePayConfig(ClientRequestBody body) { + log.info("parseGetBattlePayConfig: got"); + } + + private void parseGetAchieves(ClientRequestBody body) throws InvalidProtocolBufferException { + Protocol.GetAchieves getAchieves = Protocol.GetAchieves.parseFrom(body.getBody()); + log.info("parseGetAchieves: {}", getAchieves); + } + + private void parseGetBattlePayStatus(ClientRequestBody body) { + log.info("parseGetBattlePayStatus: got"); + } + + private void parseSetOptions(ClientRequestBody body) throws InvalidProtocolBufferException { + Protocol.SetOptions setOptions = Protocol.SetOptions.parseFrom(body.getBody()); + log.info("parseSetOptions: {}", setOptions); + } + + private void parseSendUnsubcribeRequest(ClientRequestBody body) { + log.info("parseSendUnsubcribeRequest: got"); + } + + private Protocol.Notification generateNotification(int message_type, ByteString bs, int size) { + return Protocol.Notification.newBuilder() + .setSenderId(Protocol.EntityId.newBuilder() + .setHigh(144115188075855872L) + .setLow(0)) + .setTargetId(Protocol.EntityId.newBuilder() + .setHigh(144115198130930503L) + .setLow(78330215)) + .setType("WTCG.UtilNotificationMessage") + .setSenderBattleTag("") + .setSenderAccountId(Protocol.EntityId.newBuilder() + .setHigh(72057594037927936L) + .setLow(0)) + .setTargetAccountId(Protocol.EntityId.newBuilder() + .setHigh(72057594037927936L) + .setLow(437154195)) + .addAttribute(Protocol.Attribute.newBuilder() + .setName("message_type") + .setValue(Protocol.Variant.newBuilder() + .setIntValue(message_type))) // 278L + .addAttribute(Protocol.Attribute.newBuilder() + .setName("fragment_000") + .setValue(Protocol.Variant.newBuilder() + .setBlobValue(bs))) + .addAttribute(Protocol.Attribute.newBuilder() + .setName("message_size") + .setValue(Protocol.Variant.newBuilder() + .setIntValue(size))) + .build(); + } + private void processClientRequest(BattleNetPacket packet, TcpConnection conn) throws Exception { Protocol.ClientRequest cr = Protocol.ClientRequest.parseFrom(packet.getBody()); var p = parseClientRequest(cr); - log.info("processClientRequest: {}, token={}, body={}", p, packet.getHeader().getToken(), Protocol.Subscribe.parseFrom(p.getBody())); + + //log.info("processClientRequest: {}, token={}, body={}", p, packet.getHeader().getToken(), Protocol.Subscribe.parseFrom(p.getBody())); + + int type = p != null ? p.getType() : 0; + switch(type) { + case 201 -> parseRequestNetCacheObject(p, conn); + case 327 -> parseRequestNetCacheObjectList(p, conn); + case 314 -> parseSubscriptionRequest(p); + case 303 -> parseGetAssetsVersion(p); + case 267 -> parseCheckAccountLicenses(p); + case 205 -> parseUpdateLogin(p); + case 276 -> parseCheckGameLicenses(p); + case 305 -> parseGetAdventureProgress(p); + case 237 -> parseGetBattlePayConfig(p); + case 253 -> parseGetAchieves(p); + case 255 -> parseGetBattlePayStatus(p); + case 239 -> parseSetOptions(p); + case 329 -> parseSendUnsubcribeRequest(p); + default -> log.warn("Unknown ClientRequest type #{}", p.getType()); + } + if( packet.getHeader().getToken() == 10 ) { Protocol.Header header = Processor.generateResponse(37, packet.getHeader().getToken(), 0, 0); conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318BB020A180A0570726F746F120F320D084918AC0220002800300F4078"))); @@ -54,13 +198,14 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(16) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(213) .setStatus(0) .build(); conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222170A0C667261676D656E745F303030120732050801108B0222120A0C6D6573736167655F73697A65120218052A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"))); + } else if( packet.getHeader().getToken() == 16 ) { Protocol.Header header = Processor.generateResponse(29, packet.getHeader().getToken(), 0, 0); conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110CD01"))); @@ -85,45 +230,49 @@ public class GameUtilitiesProcessor extends Processor { .build(); conn.send(new BattleNetPacket(header, b)); + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222170A0C667261676D656E745F30303012073205080110940222120A0C6D6573736167655F73697A65120218052A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(20) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) .build(); conn.send(new BattleNetPacket(header, b)); + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318B30222120A0C6D6573736167655F73697A65120218002A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(21) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) .build(); conn.send(new BattleNetPacket(header, b)); + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318CB0222140A0C667261676D656E745F30303012043202080122120A0C6D6573736167655F73697A65120218022A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(22) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) .build(); conn.send(new BattleNetPacket(header, b)); + } else if (packet.getHeader().getToken() == 20) { byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110C702"); @@ -136,26 +285,28 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(23) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) .build(); conn.send(new BattleNetPacket(header, b)); + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318E90122160A0C667261676D656E745F303030120632040806100022120A0C6D6573736167655F73697A65120218042A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(24) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) .build(); conn.send(new BattleNetPacket(header, b)); + } else if( packet.getHeader().getToken() == 21 ) { byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110C702"); @@ -168,46 +319,49 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(25) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) .build(); conn.send(new BattleNetPacket(header, b)); + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180222120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(26) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) .build(); conn.send(new BattleNetPacket(header, b)); + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180322120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(27) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) .build(); conn.send(new BattleNetPacket(header, b)); + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180F22120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(28) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -226,7 +380,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(29) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -239,7 +393,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(30) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -252,7 +406,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(31) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -265,7 +419,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(32) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -293,7 +447,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(33) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -306,7 +460,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(34) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -319,7 +473,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(35) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -332,7 +486,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(36) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -345,7 +499,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(37) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -358,7 +512,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(38) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -371,7 +525,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(39) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -384,7 +538,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(40) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -397,7 +551,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(41) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -410,7 +564,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(42) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -423,7 +577,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(43) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -436,7 +590,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(44) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -449,7 +603,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(45) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -462,7 +616,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(46) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -475,7 +629,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(47) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -488,7 +642,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(48) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -501,14 +655,14 @@ public class GameUtilitiesProcessor extends Processor { // log.warn("ProtoNotify" + Protocol.Notification.parseFrom(b)); - Protocol.GoldBalance gb = Protocol.GoldBalance.newBuilder() + /*Protocol.GoldBalance gb = Protocol.GoldBalance.newBuilder() .setCap(999999) .setBonusBalance(165) .setCappedBalance(160) .setCapWarning(2000) - .build(); + .build();*/ - Protocol.Notification notification = Protocol.Notification.newBuilder() + /* Protocol.Notification notification = Protocol.Notification.newBuilder() .setSenderId(Protocol.EntityId.newBuilder() .setHigh(144115188075855872L) .setLow(0)) @@ -535,25 +689,25 @@ public class GameUtilitiesProcessor extends Processor { .setName("message_size") .setValue(Protocol.Variant.newBuilder() .setIntValue(gb.getSerializedSize()))) - .build(); - b = notification.toByteArray(); + .build();*/ + /* b = notification.toByteArray(); header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(49) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) .build(); - conn.send(new BattleNetPacket(header, b)); + conn.send(new BattleNetPacket(header, b));*/ b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318F10122480A0C667261676D656E745F303030123832360A04081818030A0B08013080E08380C0E180180A090802308080808080100A04081418020A04081518010A04080818040A04080A180122120A0C6D6573736167655F73697A65120218362A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(50) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -566,7 +720,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(51) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -579,7 +733,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(52) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -592,7 +746,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(53) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -605,7 +759,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(54) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -618,7 +772,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(55) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -631,7 +785,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(56) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -644,7 +798,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(57) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -676,7 +830,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(59) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -701,7 +855,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(60) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -714,7 +868,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(61) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -731,7 +885,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(5) .setMethodId(6) - .setToken(62) + .setToken(conn.nextToken()) .setObjectId(2) .setSize(b.length) .setStatus(0) @@ -753,7 +907,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(64) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -766,7 +920,7 @@ public class GameUtilitiesProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(65) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/PresenceProcessor.java b/src/main/java/com/alterdekim/hearthhack/component/processor/PresenceProcessor.java index 0755766..0939300 100644 --- a/src/main/java/com/alterdekim/hearthhack/component/processor/PresenceProcessor.java +++ b/src/main/java/com/alterdekim/hearthhack/component/processor/PresenceProcessor.java @@ -39,7 +39,7 @@ public class PresenceProcessor extends Processor { .setMethodId(1) .setSize(bb.length) .setObjectId(1) - .setToken(7) + .setToken(conn.nextToken()) .setStatus(0) .build(); // FIRST @@ -62,7 +62,7 @@ public class PresenceProcessor extends Processor { .setMethodId(1) .setSize(bb.length) .setObjectId(2) - .setToken(8) + .setToken(conn.nextToken()) .setStatus(0) .build(); // SECOND @@ -76,7 +76,7 @@ public class PresenceProcessor extends Processor { .setMethodId(6) .setSize(68) .setObjectId(2) - .setToken(10) + .setToken(conn.nextToken()) .setStatus(0) .build(); conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("1242AA063F0A12094743545702000002116739AB040000000012170A150A0808CE840110021804120918F182EAF5CEBDCC0212100A0E0A0808CE84011002180112021001"))); @@ -95,7 +95,7 @@ public class PresenceProcessor extends Processor { header1 = Protocol.Header.newBuilder() .setServiceId(5) .setMethodId(6) - .setToken(14) + .setToken(conn.nextToken()) .setObjectId(2) .setSize(Util.hexStringToByteArray("1233AA06300A12094743545702000002116739AB0400000000121A0A180A0A08C786D1BA0510021813120A2A083833383836303830").length) .setStatus(0) @@ -111,7 +111,7 @@ public class PresenceProcessor extends Processor { header1 = Protocol.Header.newBuilder() .setServiceId(5) .setMethodId(6) - .setToken(17) + .setToken(conn.nextToken()) .setObjectId(2) .setSize(b.length) .setStatus(0) @@ -124,7 +124,7 @@ public class PresenceProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(18) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) @@ -141,7 +141,7 @@ public class PresenceProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(5) .setMethodId(6) - .setToken(58) + .setToken(conn.nextToken()) .setObjectId(2) .setSize(b.length) .setStatus(0) @@ -159,7 +159,7 @@ public class PresenceProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(5) .setMethodId(6) - .setToken(63) + .setToken(conn.nextToken()) .setObjectId(2) .setSize(b.length) .setStatus(0) @@ -181,7 +181,7 @@ public class PresenceProcessor extends Processor { header = Protocol.Header.newBuilder() .setServiceId(4) .setMethodId(1) - .setToken(64) + .setToken(conn.nextToken()) .setObjectId(0) .setSize(b.length) .setStatus(0) diff --git a/src/main/java/com/alterdekim/hearthhack/handler/BattleNetSocketHandler.java b/src/main/java/com/alterdekim/hearthhack/handler/BattleNetSocketHandler.java deleted file mode 100644 index 436abce..0000000 --- a/src/main/java/com/alterdekim/hearthhack/handler/BattleNetSocketHandler.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.alterdekim.hearthhack.handler; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class BattleNetSocketHandler { - public String handleMessage() { - return ""; - } -} diff --git a/src/main/java/com/alterdekim/hearthhack/parser/BattleNetSerializerDeserializer.java b/src/main/java/com/alterdekim/hearthhack/parser/BattleNetSerializerDeserializer.java deleted file mode 100644 index 6683578..0000000 --- a/src/main/java/com/alterdekim/hearthhack/parser/BattleNetSerializerDeserializer.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.alterdekim.hearthhack.parser; - - -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.serializer.Deserializer; -import org.springframework.core.serializer.Serializer; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -@Slf4j -@Data -public class BattleNetSerializerDeserializer implements Serializer, Deserializer { - - - @Override - public byte[] deserialize(InputStream inputStream) throws IOException { - return inputStream.readAllBytes(); - } - - @Override - public void serialize(byte[] object, OutputStream outputStream) throws IOException { - outputStream.write(object); - } -} \ No newline at end of file diff --git a/src/main/java/com/alterdekim/hearthhack/util/GetAccountInfoRequest.java b/src/main/java/com/alterdekim/hearthhack/util/GetAccountInfoRequest.java new file mode 100644 index 0000000..adf8588 --- /dev/null +++ b/src/main/java/com/alterdekim/hearthhack/util/GetAccountInfoRequest.java @@ -0,0 +1,71 @@ +package com.alterdekim.hearthhack.util; + +public enum GetAccountInfoRequest { + // Token: 0x04000931 RID: 2353 + LAST_LOGIN, + // Token: 0x04000932 RID: 2354 + DECK_LIST, + // Token: 0x04000933 RID: 2355 + COLLECTION, + // Token: 0x04000934 RID: 2356 + MEDAL_INFO, + // Token: 0x04000935 RID: 2357 + MEDAL_HISTORY, + // Token: 0x04000936 RID: 2358 + BOOSTERS, + // Token: 0x04000937 RID: 2359 + CARD_BACKS, + // Token: 0x04000938 RID: 2360 + PLAYER_RECORD, + // Token: 0x04000939 RID: 2361 + GAMES_PLAYED, + // Token: 0x0400093A RID: 2362 + DECK_LIMIT, + // Token: 0x0400093B RID: 2363 + CAMPAIGN_INFO, + // Token: 0x0400093C RID: 2364 + NOTICES, + // Token: 0x0400093D RID: 2365 + MOTD, + // Token: 0x0400093E RID: 2366 + CLIENT_OPTIONS, + // Token: 0x0400093F RID: 2367 + CARD_VALUES, + // Token: 0x04000940 RID: 2368 + DISCONNECTED, + // Token: 0x04000941 RID: 2369 + ARCANE_DUST_BALANCE, + // Token: 0x04000942 RID: 2370 + FEATURES, + // Token: 0x04000943 RID: 2371 + REWARD_PROGRESS, + // Token: 0x04000944 RID: 2372 + GOLD_BALANCE, + // Token: 0x04000945 RID: 2373 + HERO_XP, + // Token: 0x04000946 RID: 2374 + PVP_QUEUE, + // Token: 0x04000947 RID: 2375 + NOT_SO_MASSIVE_LOGIN, + // Token: 0x04000948 RID: 2376 + BOOSTER_TALLY, + // Token: 0x04000949 RID: 2377 + TAVERN_BRAWL_INFO, + // Token: 0x0400094A RID: 2378 + TAVERN_BRAWL_RECORD, + // Token: 0x0400094B RID: 2379 + FAVORITE_HEROES, + // Token: 0x0400094C RID: 2380 + ACCOUNT_LICENSES; + + public int getValue() { + return ordinal() + 1; + } + + public static GetAccountInfoRequest parseFromInt(int val) { + for( GetAccountInfoRequest r : values() ) { + if( r.getValue() == val ) return r; + } + return LAST_LOGIN; + } +} \ No newline at end of file diff --git a/src/main/proto/bnet/protocol/protocol.proto b/src/main/proto/bnet/protocol/protocol.proto index 053681e..3270ec6 100644 --- a/src/main/proto/bnet/protocol/protocol.proto +++ b/src/main/proto/bnet/protocol/protocol.proto @@ -2090,4 +2090,153 @@ message Subscribe { ID = 314; } +} + +// ref: PegasusUtil.GenericData +message GenericData { + required uint32 type_id = 1; + required bytes data = 2; +} + +// ref: PegasusUtil.GenericRequest +message UtilGenericRequest { + required int32 request_id = 1; + optional GenericData generic_data = 2; + optional int32 request_sub_id = 3; +} + +// ref: PegasusUtil.GenericRequestList +message GenericRequestList { + // ref: PegasusUtil.GenericRequestList/PacketID + enum PacketID { + system = 0; + ID = 327; + } + + repeated UtilGenericRequest requests = 1; +} + +// ref: PegasusUtil.GetPurchaseMethod +message GetPurchaseMethod { + // ref: PegasusUtil.GetPurchaseMethod/PacketID + enum PacketID { + system = 1; + ID = 250; + } + + required string product_id = 1; + required int32 quantity = 2; + required int32 currency = 3; + required string device_id = 4; + optional Platform platform = 5; +} + +// ref: PegasusShared.Platform +message Platform { + required int32 os = 1; + required int32 screen = 2; + required string name = 3; + optional int32 store = 4; +} + +// ref: PegasusUtil.CheckAccountLicenses +message CheckAccountLicenses { + // ref: PegasusUtil.CheckAccountLicenses/PacketID + enum PacketID { + system = 0; + ID = 267; + } + +} + +// ref: PegasusUtil.CheckAccountLicensesResponse +message CheckAccountLicensesResponse { + // ref: PegasusUtil.CheckAccountLicensesResponse/PacketID + enum PacketID { + ID = 330; + } + + required bool success = 1; +} + +// ref: PegasusUtil.UpdateLogin +message UpdateLogin { + // ref: PegasusUtil.UpdateLogin/PacketID + enum PacketID { + system = 0; + ID = 205; + } + + optional bool reply_required = 1; + optional string referral = 2; + optional string device_model_deprecated = 3; +} + + +// ref: PegasusUtil.CheckGameLicenses +message CheckGameLicenses { + // ref: PegasusUtil.CheckGameLicenses/PacketID + enum PacketID { + system = 1; + ID = 276; + } + +} + +// ref: PegasusUtil.GetAchieves +message GetAchieves { + // ref: PegasusUtil.GetAchieves/PacketID + enum PacketID { + system = 0; + ID = 253; + } + + optional bool only_active_or_new_complete = 1; + optional string device_model = 2; +} + +// ref: PegasusUtil.CheckGameLicensesResponse +message CheckGameLicensesResponse { + // ref: PegasusUtil.CheckGameLicensesResponse/PacketID + enum PacketID { + ID = 331; + } + + required bool success = 1; +} + +// ref: PegasusUtil.GetAdventureProgress +message GetAdventureProgress { + // ref: PegasusUtil.GetAdventureProgress/PacketID + enum PacketID { + system = 0; + ID = 305; + } + +} + +// ref: PegasusUtil.SetOptions +message SetOptions { + // ref: PegasusUtil.SetOptions/MaxOptionCount + enum MaxOptionCount { + LIMIT = 51; + } + + // ref: PegasusUtil.SetOptions/PacketID + enum PacketID { + system = 0; + ID = 239; + } + + repeated ClientOption options = 1; +} + +// ref: PegasusUtil.ClientOption +message ClientOption { + required int32 index = 1; + optional bool as_bool = 2; + optional int32 as_int32 = 3; + optional int64 as_int64 = 4; + optional float as_float = 5; + optional uint64 as_uint64 = 6; } \ No newline at end of file