support full DC NTE credentials

This commit is contained in:
Martin Michelsen
2024-02-24 22:49:37 -08:00
parent 70325793d9
commit 28cb1c52b5
8 changed files with 123 additions and 45 deletions
+23
View File
@@ -18,3 +18,26 @@ void forward_to_event_thread(std::shared_ptr<struct event_base> base, std::funct
std::function<void()>* new_fn = new std::function<void()>(std::move(fn));
event_base_once(base.get(), -1, EV_TIMEOUT, dispatch_forward_to_event_thread, new_fn, &tv);
}
template <>
void call_on_event_thread<void>(std::shared_ptr<struct event_base> base, std::function<void()>&& compute) {
bool succeeded = false;
std::string exc_what;
std::mutex ret_lock;
std::condition_variable ret_cv;
std::unique_lock<std::mutex> g(ret_lock);
forward_to_event_thread(base, [&]() -> void {
std::lock_guard<std::mutex> g(ret_lock);
try {
compute();
succeeded = true;
} catch (const std::exception& e) {
exc_what = e.what();
}
ret_cv.notify_one();
});
ret_cv.wait(g);
if (!succeeded) {
throw std::runtime_error(exc_what);
}
}
+3
View File
@@ -33,3 +33,6 @@ T call_on_event_thread(std::shared_ptr<struct event_base> base, std::function<T(
}
return ret.value();
}
template <>
void call_on_event_thread<void>(std::shared_ptr<struct event_base> base, std::function<void()>&& compute);
+38 -4
View File
@@ -19,6 +19,8 @@ License::License(const JSON& json)
bb_team_id(0) {
this->serial_number = json.get_int("SerialNumber");
this->access_key = json.get_string("AccessKey", "");
this->dc_nte_serial_number = json.get_string("DCNTESerialNumber", "");
this->dc_nte_access_key = json.get_string("DCNTEAccessKey", "");
this->gc_password = json.get_string("GCPassword", "");
this->xb_gamertag = json.get_string("XBGamerTag", "");
this->xb_user_id = json.get_int("XBUserID", 0);
@@ -38,6 +40,8 @@ JSON License::json() const {
return JSON::dict({
{"SerialNumber", this->serial_number},
{"AccessKey", this->access_key},
{"DCNTESerialNumber", this->dc_nte_serial_number},
{"DCNTEAccessKey", this->dc_nte_access_key},
{"GCPassword", this->gc_password},
{"XBGamerTag", this->xb_gamertag},
{"XBUserID", this->xb_user_id},
@@ -63,6 +67,12 @@ string License::str() const {
if (!this->access_key.empty()) {
tokens.emplace_back("access_key=" + this->access_key);
}
if (!this->dc_nte_serial_number.empty()) {
tokens.emplace_back("dc_nte_serial_number=" + this->dc_nte_serial_number);
}
if (!this->dc_nte_access_key.empty()) {
tokens.emplace_back("dc_nte_access_key=" + this->dc_nte_access_key);
}
if (!this->gc_password.empty()) {
tokens.emplace_back("gc_password=" + this->gc_password);
}
@@ -147,23 +157,47 @@ vector<shared_ptr<License>> LicenseIndex::all() const {
void LicenseIndex::add(shared_ptr<License> l) {
this->serial_number_to_license[l->serial_number] = l;
if (!l->bb_username.empty()) {
this->bb_username_to_license[l->bb_username] = l;
if (!l->dc_nte_serial_number.empty()) {
this->dc_nte_serial_number_to_license[l->dc_nte_serial_number] = l;
}
if (!l->xb_gamertag.empty()) {
this->xb_gamertag_to_license[l->xb_gamertag] = l;
}
if (!l->bb_username.empty()) {
this->bb_username_to_license[l->bb_username] = l;
}
}
void LicenseIndex::remove(uint32_t serial_number) {
auto l = this->serial_number_to_license.at(serial_number);
this->serial_number_to_license.erase(l->serial_number);
if (!l->bb_username.empty()) {
this->bb_username_to_license.erase(l->bb_username);
if (!l->dc_nte_serial_number.empty()) {
this->dc_nte_serial_number_to_license.erase(l->dc_nte_serial_number);
}
if (!l->xb_gamertag.empty()) {
this->xb_gamertag_to_license.erase(l->xb_gamertag);
}
if (!l->bb_username.empty()) {
this->bb_username_to_license.erase(l->bb_username);
}
}
shared_ptr<License> LicenseIndex::verify_dc_nte(const string& serial_number, const string& access_key) const {
if (serial_number.empty()) {
throw no_username();
}
try {
auto& license = this->dc_nte_serial_number_to_license.at(serial_number);
if (license->ban_end_time && (license->ban_end_time >= now())) {
throw invalid_argument("user is banned");
}
if (license->dc_nte_access_key != access_key) {
throw incorrect_access_key();
}
return license;
} catch (const out_of_range&) {
throw missing_license();
}
}
shared_ptr<License> LicenseIndex::verify_v1_v2(
+5 -1
View File
@@ -35,6 +35,8 @@ public:
};
uint32_t serial_number = 0;
std::string dc_nte_serial_number;
std::string dc_nte_access_key;
std::string access_key;
std::string gc_password;
std::string xb_gamertag;
@@ -123,6 +125,7 @@ public:
void add(std::shared_ptr<License> l);
void remove(uint32_t serial_number);
std::shared_ptr<License> verify_dc_nte(const std::string& serial_number, const std::string& access_key) const;
std::shared_ptr<License> verify_v1_v2(
uint32_t serial_number,
const std::string& access_key,
@@ -140,8 +143,9 @@ public:
std::shared_ptr<License> verify_bb(const std::string& username, const std::string& password) const;
protected:
std::unordered_map<std::string, std::shared_ptr<License>> bb_username_to_license;
std::unordered_map<std::string, std::shared_ptr<License>> dc_nte_serial_number_to_license;
std::unordered_map<std::string, std::shared_ptr<License>> xb_gamertag_to_license;
std::unordered_map<std::string, std::shared_ptr<License>> bb_username_to_license;
std::unordered_map<uint32_t, std::shared_ptr<License>> serial_number_to_license;
std::shared_ptr<License> create_temporary_license_for_shared_license(
+8 -8
View File
@@ -465,9 +465,8 @@ static void on_88_DCNTE(shared_ptr<Client> c, uint16_t, uint32_t, string& data)
c->config.set_flags_for_version(c->version(), -1);
c->log.info("Game version changed to DC_NTE");
uint32_t serial_number = stoul(cmd.serial_number.decode(), nullptr, 16);
try {
shared_ptr<License> l = s->license_index->verify_v1_v2(serial_number, cmd.access_key.decode(), "");
shared_ptr<License> l = s->license_index->verify_dc_nte(cmd.serial_number.decode(), cmd.access_key.decode());
c->set_license(l);
send_command(c, 0x88, 0x00);
@@ -487,8 +486,9 @@ static void on_88_DCNTE(shared_ptr<Client> c, uint16_t, uint32_t, string& data)
} else {
c->config.set_flag(Client::Flag::LICENSE_WAS_CREATED);
auto l = s->license_index->create_license();
l->serial_number = serial_number;
l->access_key = cmd.access_key.decode();
l->dc_nte_serial_number = cmd.serial_number.decode();
l->dc_nte_access_key = cmd.access_key.decode();
l->serial_number = fnv1a32(l->dc_nte_serial_number) & 0x7FFFFFFF;
s->license_index->add(l);
if (!s->is_replay) {
l->save();
@@ -510,9 +510,8 @@ static void on_8B_DCNTE(shared_ptr<Client> c, uint16_t, uint32_t, string& data)
c->config.set_flags_for_version(c->version(), -1);
c->log.info("Game version changed to DC_NTE");
uint32_t serial_number = stoul(cmd.serial_number.decode(), nullptr, 16);
try {
shared_ptr<License> l = s->license_index->verify_v1_v2(serial_number, cmd.access_key.decode(), cmd.name.decode());
shared_ptr<License> l = s->license_index->verify_dc_nte(cmd.serial_number.decode(), cmd.access_key.decode());
c->set_license(l);
} catch (const LicenseIndex::no_username& e) {
@@ -531,8 +530,9 @@ static void on_8B_DCNTE(shared_ptr<Client> c, uint16_t, uint32_t, string& data)
} else {
c->config.set_flag(Client::Flag::LICENSE_WAS_CREATED);
auto l = s->license_index->create_license();
l->serial_number = serial_number;
l->access_key = cmd.access_key.decode();
l->dc_nte_serial_number = cmd.serial_number.decode();
l->dc_nte_access_key = cmd.access_key.decode();
l->serial_number = fnv1a32(l->dc_nte_serial_number) & 0x7FFFFFFF;
s->license_index->add(l);
if (!s->is_replay) {
l->save();
+11 -1
View File
@@ -52,7 +52,7 @@ struct CommandDefinition {
if (!def) {
fprintf(stderr, "FAILED: no such command; try 'help'\n");
} else if (def->run_on_event_thread) {
args.s->forward_to_event_thread([def, args]() {
args.s->call_on_event_thread<void>([def, args]() {
CommandArgs local_args = args;
try {
def->run(local_args);
@@ -282,6 +282,8 @@ CommandDefinition c_add_license(
xb-user-id=<user-id> (Xbox user ID)\n\
xb-account-id=<account-id> (Xbox account ID)\n\
gc-password=<password> (GC password)\n\
dc-nte-serial-number=<serial-number> (DC NTE serial number)\n\
dc-nte-access-key=<access-key> (DC NTE access key)\n\
access-key=<access-key> (DC/GC/PC access key)\n\
serial=<serial-number> (decimal serial number; required for all licenses)\n\
flags=<privilege-mask> (see below)\n\
@@ -318,6 +320,10 @@ CommandDefinition c_add_license(
l->xb_account_id = stoull(token.substr(14), nullptr, 16);
} else if (starts_with(token, "gc-password=")) {
l->gc_password = token.substr(12);
} else if (starts_with(token, "dc-nte-serial-number=")) {
l->dc_nte_serial_number = token.substr(21);
} else if (starts_with(token, "dc-nte-access-key=")) {
l->dc_nte_access_key = token.substr(18);
} else if (starts_with(token, "access-key=")) {
l->access_key = token.substr(11);
} else if (starts_with(token, "serial=")) {
@@ -383,6 +389,10 @@ CommandDefinition c_update_license(
l->xb_account_id = stoull(token.substr(14), nullptr, 16);
} else if (starts_with(token, "gc-password=")) {
l->gc_password = token.substr(12);
} else if (starts_with(token, "dc-nte-serial-number=")) {
l->dc_nte_serial_number = token.substr(21);
} else if (starts_with(token, "dc-nte-access-key=")) {
l->dc_nte_access_key = token.substr(18);
} else if (starts_with(token, "access-key=")) {
l->access_key = token.substr(11);
} else if (starts_with(token, "serial=")) {
+4
View File
@@ -309,6 +309,10 @@ struct ServerState : public std::enable_shared_from_this<ServerState> {
std::pair<std::string, uint16_t> parse_port_spec(const JSON& json) const;
std::vector<PortConfiguration> parse_port_configuration(const JSON& json) const;
template <typename T>
inline void call_on_event_thread(std::function<T()>&& fn) {
return ::call_on_event_thread<T>(this->base, std::move(fn));
}
inline void forward_to_event_thread(std::function<void()>&& fn) {
::forward_to_event_thread(this->base, std::move(fn));
}
+31 -31
View File
@@ -18,9 +18,9 @@ I 91446 2023-12-31 21:04:43 - [Commands] Sending to C-1 (version=DC_NTE command=
00E0 | 65 20 77 69 74 68 20 70 72 6F 67 72 61 6D 73 20 | e with programs
00F0 | 74 68 61 74 20 65 78 70 65 63 74 20 69 74 2E 00 | that expect it.
I 91446 2023-12-31 21:04:43 - [Commands] Received from C-1 (version=DC_NTE command=88 flag=00)
0000 | 88 00 26 00 35 35 35 35 35 35 35 35 00 00 00 00 | & 55555555
0010 | 00 00 00 00 00 38 38 38 38 38 38 38 38 00 00 00 | 88888888
0020 | 00 00 00 00 00 00 |
0000 | 88 00 26 00 35 35 35 35 35 35 35 35 35 35 35 35 | & 555555555555
0010 | 35 35 35 35 00 38 38 38 38 38 38 38 38 38 38 38 | 5555 88888888888
0020 | 38 38 38 38 38 00 | 88888
I 91446 2023-12-31 21:04:43 - [C-1] Game version changed to DC_NTE
I 91446 2023-12-31 21:04:43 - [C-1] Created license [License: serial_number=1431655765/55555555, access_key=88888888, flags=00000000]
I 91446 2023-12-31 21:04:43 - [Commands] Sending to C-1 (version=DC_NTE command=88 flag=00)
@@ -43,8 +43,8 @@ I 91446 2023-12-31 21:04:44 - [Commands] Sending to C-1 (version=DC_V1 command=8
I 91446 2023-12-31 21:04:44 - [Commands] Received from C-1 (version=DC_V1 command=8B flag=00)
0000 | 8B 00 14 01 00 00 FF FF FF FF 00 00 00 00 13 2B | +
0010 | 64 B2 2C B2 20 00 00 00 00 00 00 00 35 35 35 35 | d , 5555
0020 | 35 35 35 35 00 00 00 00 00 00 00 00 00 38 38 38 | 5555 888
0030 | 38 38 38 38 38 00 00 00 00 00 00 00 00 00 66 6C | 88888 fl
0020 | 35 35 35 35 35 35 35 35 35 35 35 35 00 38 38 38 | 555555555555 888
0030 | 38 38 38 38 38 38 38 38 38 38 38 38 38 00 66 6C | 8888888888888 fl
0040 | 79 63 61 73 74 31 00 00 00 00 00 00 00 00 00 00 | ycast1
0050 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
0060 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 70 61 | pa
@@ -61,7 +61,7 @@ I 91446 2023-12-31 21:04:44 - [Commands] Received from C-1 (version=DC_V1 comman
0110 | 00 00 00 00 |
I 91446 2023-12-31 21:04:44 - [C-1] Game version changed to DC_NTE
I 91446 2023-12-31 21:04:44 - [Commands] Sending to C-1 (version=DC_NTE command=04 flag=00)
0000 | 04 00 0C 00 00 00 01 00 55 55 55 55 | UUUU
0000 | 04 00 0C 00 00 00 01 00 F5 5D C2 1A | UUUU
I 91446 2023-12-31 21:04:44 - [C-1] Client is a prototype version and the license was created during this session; converting permanent license to temporary license
I 91446 2023-12-31 21:04:44 - [Commands] Sending to C-1 (version=DC_NTE command=07 flag=02)
0000 | 07 02 58 00 11 00 00 11 FF FF FF FF 04 00 41 6C | X Al
@@ -96,10 +96,10 @@ I 91446 2023-12-31 21:04:56 - [Commands] Sending to C-2 (version=DC_NTE command=
00E0 | 65 20 77 69 74 68 20 70 72 6F 67 72 61 6D 73 20 | e with programs
00F0 | 74 68 61 74 20 65 78 70 65 63 74 20 69 74 2E 00 | that expect it.
I 91446 2023-12-31 21:04:56 - [Commands] Received from C-2 (version=DC_NTE command=8B flag=00)
0000 | 8B 00 B0 00 00 00 01 00 55 55 55 55 00 00 13 2B | UUUU +
0000 | 8B 00 B0 00 00 00 01 00 F5 5D C2 1A 00 00 13 2B | UUUU +
0010 | 64 B2 2C B2 20 00 00 00 00 00 00 00 35 35 35 35 | d , 5555
0020 | 35 35 35 35 00 00 00 00 00 00 00 00 00 38 38 38 | 5555 888
0030 | 38 38 38 38 38 00 00 00 00 00 00 00 00 00 66 6C | 88888 fl
0020 | 35 35 35 35 35 35 35 35 35 35 35 35 00 38 38 38 | 555555555555 888
0030 | 38 38 38 38 38 38 38 38 38 38 38 38 38 00 66 6C | 8888888888888 fl
0040 | 79 63 61 73 74 31 00 00 00 00 00 00 00 00 00 00 | ycast1
0050 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
0060 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 70 61 | pa
@@ -110,7 +110,7 @@ I 91446 2023-12-31 21:04:56 - [Commands] Received from C-2 (version=DC_NTE comma
I 91446 2023-12-31 21:04:56 - [C-2] Game version changed to DC_NTE
I 91446 2023-12-31 21:04:56 - [C-2] Created license [License: serial_number=1431655765/55555555, access_key=88888888, flags=00000000]
I 91446 2023-12-31 21:04:56 - [Commands] Sending to C-2 (version=DC_NTE command=04 flag=00)
0000 | 04 00 0C 00 00 00 01 00 55 55 55 55 | UUUU
0000 | 04 00 0C 00 00 00 01 00 F5 5D C2 1A | UUUU
I 91446 2023-12-31 21:04:56 - [C-2] Client is a prototype version and the license was created during this session; converting permanent license to temporary license
I 91446 2023-12-31 21:04:56 - [Commands] Sending to C-2 (version=DC_NTE command=83 flag=0A)
0000 | 83 0A 7C 00 33 00 00 33 01 00 00 00 00 00 00 00 | | 3 3
@@ -205,7 +205,7 @@ I 91446 2023-12-31 21:04:57 - [C-2] Assigned inventory item IDs
[PlayerInventory] 9: [+00000010] 03020000 03010000 00000000 (10010009) 00000000 (Disk:Barta Lv.1)
I 91446 2023-12-31 21:04:57 - [C-2] Bank is empty
I 91446 2023-12-31 21:04:57 - [Commands] Sending to C-2 (ABCDEFGHIJKL) (version=DC_NTE command=67 flag=01)
0000 | 67 01 44 04 00 00 01 00 00 00 01 00 55 55 55 55 | g D UUUU
0000 | 67 01 44 04 00 00 01 00 00 00 01 00 F5 5D C2 1A | g D UUUU
0010 | 7F 00 00 01 00 00 00 00 41 42 43 44 45 46 47 48 | ABCDEFGH
0020 | 49 4A 4B 4C 00 00 00 00 0A 00 00 00 01 00 00 00 | IJKL
0030 | 04 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 |
@@ -317,7 +317,7 @@ I 91446 2023-12-31 21:05:17 - [Commands] Received from C-2 (ABCDEFGHIJKL) (versi
0000 | 06 00 14 00 00 00 00 00 00 00 00 00 6F 6D 67 20 | omg
0010 | 68 34 78 00 | h4x
I 91446 2023-12-31 21:05:17 - [Commands] Sending to C-2 (ABCDEFGHIJKL) (version=DC_NTE command=06 flag=00)
0000 | 06 00 24 00 00 00 00 00 55 55 55 55 41 42 43 44 | $ UUUUABCD
0000 | 06 00 24 00 00 00 00 00 F5 5D C2 1A 41 42 43 44 | $ UUUUABCD
0010 | 45 46 47 48 49 4A 4B 4C 3E 30 6F 6D 67 20 68 34 | EFGHIJKL>0omg h4
0020 | 78 00 00 00 | x
I 91446 2023-12-31 21:05:17 - [Commands] Received from C-2 (ABCDEFGHIJKL) (version=DC_NTE command=60 flag=00)
@@ -456,9 +456,9 @@ I 91446 2023-12-31 21:05:43 - [Commands] Sending to C-3 (version=DC_NTE command=
00E0 | 65 20 77 69 74 68 20 70 72 6F 67 72 61 6D 73 20 | e with programs
00F0 | 74 68 61 74 20 65 78 70 65 63 74 20 69 74 2E 00 | that expect it.
I 91446 2023-12-31 21:05:43 - [Commands] Received from C-3 (version=DC_NTE command=88 flag=00)
0000 | 88 00 26 00 39 39 39 39 39 39 39 39 00 00 00 00 | & 99999999
0010 | 00 00 00 00 00 39 39 39 39 39 39 39 39 00 00 00 | 99999999
0020 | 00 00 00 00 00 00 |
0000 | 88 00 26 00 39 39 39 39 39 39 39 39 39 39 39 39 | & 999999999999
0010 | 39 39 39 39 00 39 39 39 39 39 39 39 39 39 39 39 | 9999 99999999999
0020 | 39 39 39 39 39 00 | 99999
I 91446 2023-12-31 21:05:43 - [C-3] Game version changed to DC_NTE
I 91446 2023-12-31 21:05:43 - [C-3] Created license [License: serial_number=2576980377/99999999, access_key=99999999, flags=00000000]
I 91446 2023-12-31 21:05:43 - [Commands] Sending to C-3 (version=DC_NTE command=88 flag=00)
@@ -495,7 +495,7 @@ I 91446 2023-12-31 21:05:43 - [C-2] Assigned inventory item IDs
[PlayerInventory] 9: [+00000010] 03020000 03010000 00000000 (10010009) 00000000 (Disk:Barta Lv.1)
I 91446 2023-12-31 21:05:43 - [C-2] Bank is empty
I 91446 2023-12-31 21:05:43 - [Commands] Sending to C-2 (ABCDEFGHIJKL) (version=DC_NTE command=67 flag=01)
0000 | 67 01 44 04 00 00 01 00 00 00 01 00 55 55 55 55 | g D UUUU
0000 | 67 01 44 04 00 00 01 00 00 00 01 00 F5 5D C2 1A | g D UUUU
0010 | 7F 00 00 01 00 00 00 00 41 42 43 44 45 46 47 48 | ABCDEFGH
0020 | 49 4A 4B 4C 00 00 00 00 0A 00 00 00 01 00 00 00 | IJKL
0030 | 04 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 |
@@ -567,8 +567,8 @@ I 91446 2023-12-31 21:05:43 - [Commands] Sending to C-2 (ABCDEFGHIJKL) (version=
I 91446 2023-12-31 21:05:43 - [Commands] Received from C-3 (version=DC_V1 command=8B flag=00)
0000 | 8B 00 14 01 00 00 FF FF FF FF 00 00 00 00 B7 57 | W
0010 | 02 41 B9 22 20 00 00 00 00 00 00 00 39 39 39 39 | A " 9999
0020 | 39 39 39 39 00 00 00 00 00 00 00 00 00 39 39 39 | 9999 999
0030 | 39 39 39 39 39 00 00 00 00 00 00 00 00 00 66 6C | 99999 fl
0020 | 39 39 39 39 39 39 39 39 39 39 39 39 00 39 39 39 | 999999999999 999
0030 | 39 39 39 39 39 39 39 39 39 39 39 39 39 00 66 6C | 9999999999999 fl
0040 | 79 63 61 73 74 31 00 00 00 00 00 00 00 00 00 00 | ycast1
0050 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
0060 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 70 61 | pa
@@ -585,7 +585,7 @@ I 91446 2023-12-31 21:05:43 - [Commands] Received from C-3 (version=DC_V1 comman
0110 | 00 00 00 00 |
I 91446 2023-12-31 21:05:43 - [C-3] Game version changed to DC_NTE
I 91446 2023-12-31 21:05:43 - [Commands] Sending to C-3 (version=DC_NTE command=04 flag=00)
0000 | 04 00 0C 00 00 00 01 00 99 99 99 99 |
0000 | 04 00 0C 00 00 00 01 00 F5 79 DE 25 |
I 91446 2023-12-31 21:05:43 - [C-3] Client is a prototype version and the license was created during this session; converting permanent license to temporary license
I 91446 2023-12-31 21:05:43 - [Commands] Sending to C-3 (version=DC_NTE command=07 flag=02)
0000 | 07 02 58 00 11 00 00 11 FF FF FF FF 04 00 41 6C | X Al
@@ -629,10 +629,10 @@ I 91446 2023-12-31 21:05:45 - [Commands] Sending to C-4 (version=DC_NTE command=
00E0 | 65 20 77 69 74 68 20 70 72 6F 67 72 61 6D 73 20 | e with programs
00F0 | 74 68 61 74 20 65 78 70 65 63 74 20 69 74 2E 00 | that expect it.
I 91446 2023-12-31 21:05:45 - [Commands] Received from C-4 (version=DC_NTE command=8B flag=00)
0000 | 8B 00 B0 00 00 00 01 00 99 99 99 99 00 00 B7 57 | W
0000 | 8B 00 B0 00 00 00 01 00 F5 79 DE 25 00 00 B7 57 | W
0010 | 02 41 B9 22 20 00 00 00 00 00 00 00 39 39 39 39 | A " 9999
0020 | 39 39 39 39 00 00 00 00 00 00 00 00 00 39 39 39 | 9999 999
0030 | 39 39 39 39 39 00 00 00 00 00 00 00 00 00 66 6C | 99999 fl
0020 | 39 39 39 39 39 39 39 39 39 39 39 39 00 39 39 39 | 999999999999 999
0030 | 39 39 39 39 39 39 39 39 39 39 39 39 39 00 66 6C | 9999999999999 fl
0040 | 79 63 61 73 74 31 00 00 00 00 00 00 00 00 00 00 | ycast1
0050 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
0060 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 70 61 | pa
@@ -643,7 +643,7 @@ I 91446 2023-12-31 21:05:45 - [Commands] Received from C-4 (version=DC_NTE comma
I 91446 2023-12-31 21:05:45 - [C-4] Game version changed to DC_NTE
I 91446 2023-12-31 21:05:45 - [C-4] Created license [License: serial_number=2576980377/99999999, access_key=99999999, flags=00000000]
I 91446 2023-12-31 21:05:45 - [Commands] Sending to C-4 (version=DC_NTE command=04 flag=00)
0000 | 04 00 0C 00 00 00 01 00 99 99 99 99 |
0000 | 04 00 0C 00 00 00 01 00 F5 79 DE 25 |
I 91446 2023-12-31 21:05:45 - [C-4] Client is a prototype version and the license was created during this session; converting permanent license to temporary license
I 91446 2023-12-31 21:05:45 - [Commands] Sending to C-4 (version=DC_NTE command=83 flag=0A)
0000 | 83 0A 7C 00 33 00 00 33 01 00 00 00 00 00 00 00 | | 3 3
@@ -732,7 +732,7 @@ I 91446 2023-12-31 21:05:45 - [C-4] Assigned inventory item IDs
[PlayerInventory] 3: [+00000004] 01020100 00000000 00000000 (10010003) 00000000 (Shield)
I 91446 2023-12-31 21:05:45 - [C-4] Bank is empty
I 91446 2023-12-31 21:05:45 - [Commands] Sending to C-4 (BBBBBBBBBBBB) (version=DC_NTE command=67 flag=01)
0000 | 67 01 44 04 00 00 01 00 00 00 01 00 99 99 99 99 | g D
0000 | 67 01 44 04 00 00 01 00 00 00 01 00 F5 79 DE 25 | g D
0010 | 7F 00 00 01 00 00 00 00 42 42 42 42 42 42 42 42 | BBBBBBBB
0020 | 42 42 42 42 00 00 00 00 04 00 00 00 01 00 00 00 | BBBB
0030 | 10 00 00 00 03 00 00 00 00 02 00 00 00 00 00 00 |
@@ -872,7 +872,7 @@ I 91446 2023-12-31 21:05:56 - [C-2] Assigned inventory item IDs
[PlayerInventory] 9: [+00000010] 03020000 03010000 00000000 (10210009) 00000000 (Disk:Barta Lv.1)
I 91446 2023-12-31 21:05:56 - [C-2] Bank is empty
I 91446 2023-12-31 21:05:56 - [Commands] Sending to C-4 (BBBBBBBBBBBB) (version=DC_NTE command=68 flag=01)
0000 | 68 01 44 04 00 00 01 00 00 00 01 00 55 55 55 55 | h D UUUU
0000 | 68 01 44 04 00 00 01 00 00 00 01 00 F5 5D C2 1A | h D UUUU
0010 | 7F 00 00 01 01 00 00 00 41 42 43 44 45 46 47 48 | ABCDEFGH
0020 | 49 4A 4B 4C 00 00 00 00 0A 00 00 00 01 00 00 00 | IJKL
0030 | 04 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 |
@@ -942,7 +942,7 @@ I 91446 2023-12-31 21:05:56 - [Commands] Sending to C-4 (BBBBBBBBBBBB) (version=
0430 | FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |
0440 | FF FF FF 00 |
I 91446 2023-12-31 21:05:56 - [Commands] Sending to C-2 (ABCDEFGHIJKL) (version=DC_NTE command=67 flag=02)
0000 | 67 02 80 08 01 00 01 00 00 00 01 00 99 99 99 99 | g
0000 | 67 02 80 08 01 00 01 00 00 00 01 00 F5 79 DE 25 | g
0010 | 7F 00 00 01 00 00 00 00 42 42 42 42 42 42 42 42 | BBBBBBBB
0020 | 42 42 42 42 00 00 00 00 04 00 00 00 01 00 00 00 | BBBB
0030 | 10 00 00 00 03 00 00 00 00 02 00 00 00 00 00 00 |
@@ -1010,7 +1010,7 @@ I 91446 2023-12-31 21:05:56 - [Commands] Sending to C-2 (ABCDEFGHIJKL) (version=
0410 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
0420 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
0430 | FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |
0440 | FF FF FF 00 00 00 01 00 55 55 55 55 7F 00 00 01 | UUUU
0440 | FF FF FF 00 00 00 01 00 F5 5D C2 1A 7F 00 00 01 | UUUU
0450 | 01 00 00 00 41 42 43 44 45 46 47 48 49 4A 4B 4C | ABCDEFGHIJKL
0460 | 00 00 00 00 0A 00 00 00 01 00 00 00 04 00 00 00 |
0470 | 00 06 00 00 00 00 00 00 00 00 00 00 00 00 21 10 | !
@@ -1205,7 +1205,7 @@ I 91446 2023-12-31 21:06:24 - [Commands] Sending to C-2 (ABCDEFGHIJKL) (version=
0050 | 00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 |
0060 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
0070 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
0080 | 00 00 00 00 00 00 00 00 00 00 01 00 55 55 55 55 | UUUU
0080 | 00 00 00 00 00 00 00 00 00 00 01 00 F5 5D C2 1A | UUUU
0090 | 7F 00 00 01 00 00 00 00 41 42 43 44 45 46 47 48 | ABCDEFGH
00A0 | 49 4A 4B 4C 00 00 00 00 00 00 00 00 00 00 00 00 | IJKL
00B0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
@@ -1296,7 +1296,7 @@ I 91446 2023-12-31 21:06:44 - [C-4] Assigned inventory item IDs but did not mark
[PlayerInventory] 3: [+00000004] 01020100 00000000 00000000 (00210003) 00000000 (Shield)
I 91446 2023-12-31 21:06:44 - [C-4] Bank is empty
I 91446 2023-12-31 21:06:44 - [Commands] Sending to C-2 (ABCDEFGHIJKL) (version=DC_NTE command=65 flag=01)
0000 | 65 01 44 04 00 00 01 00 00 00 01 00 99 99 99 99 | e D
0000 | 65 01 44 04 00 00 01 00 00 00 01 00 F5 79 DE 25 | e D
0010 | 7F 00 00 01 01 00 00 00 42 42 42 42 42 42 42 42 | BBBBBBBB
0020 | 42 42 42 42 00 00 00 00 04 00 00 00 01 00 00 00 | BBBB
0030 | 10 00 00 00 03 00 00 00 00 02 00 00 00 00 00 00 |
@@ -1374,9 +1374,9 @@ I 91446 2023-12-31 21:06:44 - [Commands] Sending to C-4 (BBBBBBBBBBBB) (version=
0050 | 00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 |
0060 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
0070 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
0080 | 00 00 00 00 00 00 00 00 00 00 01 00 55 55 55 55 | UUUU
0080 | 00 00 00 00 00 00 00 00 00 00 01 00 F5 5D C2 1A | UUUU
0090 | 7F 00 00 01 00 00 00 00 41 42 43 44 45 46 47 48 | ABCDEFGH
00A0 | 49 4A 4B 4C 00 00 00 00 00 00 01 00 99 99 99 99 | IJKL
00A0 | 49 4A 4B 4C 00 00 00 00 00 00 01 00 F5 79 DE 25 | IJKL
00B0 | 7F 00 00 01 01 00 00 00 42 42 42 42 42 42 42 42 | BBBBBBBB
00C0 | 42 42 42 42 00 00 00 00 00 00 00 00 00 00 00 00 | BBBB
00D0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |