diff --git a/.gitignore b/.gitignore index e7b496171..011808419 100644 --- a/.gitignore +++ b/.gitignore @@ -275,4 +275,5 @@ blcrack/out/ blcrack/tolua/ bin/hook/ blcrack/patchelf/build/ -blcrack/test/ \ No newline at end of file +blcrack/test/ +blcrack/cracker/pb/ \ No newline at end of file diff --git a/blcrack/cracker/CMakeLists.txt b/blcrack/cracker/CMakeLists.txt index ddbed9f12..3ec836e46 100644 --- a/blcrack/cracker/CMakeLists.txt +++ b/blcrack/cracker/CMakeLists.txt @@ -5,6 +5,8 @@ add_library(${TOLUA} SHARED ${CMAKE_CURRENT_LIST_DIR}/tolua.c) set(CRACKER cracker) +file(GLOB CRACKER_PROTOS ${CMAKE_CURRENT_LIST_DIR}/proto/*.proto) + file(GLOB CRACKER_SRCS ${CMAKE_CURRENT_LIST_DIR}/*.hpp ${CMAKE_CURRENT_LIST_DIR}/*.cpp @@ -16,8 +18,23 @@ target_link_options(${CRACKER} PRIVATE -Wl,--version-script=${CMAKE_CURRENT_LIST target_link_libraries(${CRACKER} PRIVATE httplib::httplib spdlog::spdlog JsonCpp::JsonCpp PRIVATE ${TOLUA} ${IL2CPP} + PRIVATE protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite ) target_compile_definitions(${CRACKER} PRIVATE ${SPDLOG_DEFINES} SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE PRIVATE SOL_USE_LUA_HPP -) \ No newline at end of file +) + +set(CRACKER_PB_DIR ${CMAKE_CURRENT_LIST_DIR}/pb) + +if (NOT EXISTS ${CRACKER_PB_DIR}) + file(MAKE_DIRECTORY ${CRACKER_PB_DIR}) +endif() + +protobuf_generate( + TARGET ${CRACKER} + LANGUAGE cpp + PROTOS ${CRACKER_PROTOS} + IMPORT_DIRS ${CMAKE_CURRENT_LIST_DIR}/proto + PROTOC_OUT_DIR ${CRACKER_PB_DIR} +) diff --git a/blcrack/cracker/cracker.cpp b/blcrack/cracker/cracker.cpp index d338fc3e7..1fe434306 100644 --- a/blcrack/cracker/cracker.cpp +++ b/blcrack/cracker/cracker.cpp @@ -476,6 +476,28 @@ void Cracker::print_table_field(std::vector& path) { Utils::Lua::print_table_fields_type(t); } +void Cracker::print_value(std::vector& path) { + Lua::Table t = m_state.globals(); + for (auto it = path.begin(); it != path.end() - 1; ++it) { + t = t[*it]; + } + std::string key = path.back(); + Lua::Object value = t[key]; + auto type = value.get_type(); + if (type == sol::type::number) { + SPDLOG_INFO("value: {}", value.as()); + } else if (type == sol::type::string) { + SPDLOG_INFO("value: {}", value.as()); + } else if (type == sol::type::boolean) { + SPDLOG_INFO("value: {}", value.as()); + } else if (type == sol::type::nil) { + SPDLOG_INFO("value: nil"); + } else if (type == sol::type::table) { + Lua::Table table = value.as(); + Utils::Lua::print_table_fields_type(table); + } +} + void Cracker::enable_flag(FunctionId id) { m_functions[id] = true; } diff --git a/blcrack/cracker/cracker.hpp b/blcrack/cracker/cracker.hpp index db45d5585..7ea2c2265 100644 --- a/blcrack/cracker/cracker.hpp +++ b/blcrack/cracker/cracker.hpp @@ -136,6 +136,7 @@ public: bool is_disabled(FunctionId id); void print_table_field(std::vector& path); + void print_value(std::vector& path); private: void enable_flag(FunctionId id); diff --git a/blcrack/cracker/gen_proto.py b/blcrack/cracker/gen_proto.py index 0007975bf..d62bbedaf 100644 --- a/blcrack/cracker/gen_proto.py +++ b/blcrack/cracker/gen_proto.py @@ -189,6 +189,7 @@ IMPORT_MAP = { "p64": ["common.proto"], } +NO_PACKAGE = ["common.proto", "guild.proto"] def gen_proto_file(lua_file_path, proto_file_path): print(f"Parse {lua_file_path}, generate {proto_file_path}") @@ -264,6 +265,8 @@ def gen_proto_file(lua_file_path, proto_file_path): with open(str(proto_file_path), mode="w", encoding="utf-8") as f: f.write("syntax = \"proto2\";\n\n") + if proto_file_path.name not in NO_PACKAGE: + f.write(f"package {proto_file_path.stem};\n\n") file_path = Path(lua_file_path) proto_name = file_path.stem.replace("_pb", "") diff --git a/blcrack/cracker/proto/p10.proto b/blcrack/cracker/proto/p10.proto index 4f427b2d3..4727f7249 100644 --- a/blcrack/cracker/proto/p10.proto +++ b/blcrack/cracker/proto/p10.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p10; + message CS_10001 { required string account = 1; diff --git a/blcrack/cracker/proto/p11.proto b/blcrack/cracker/proto/p11.proto index 80720a2f7..19d34882d 100644 --- a/blcrack/cracker/proto/p11.proto +++ b/blcrack/cracker/proto/p11.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p11; + import "common.proto"; message SC_11000 { diff --git a/blcrack/cracker/proto/p12.proto b/blcrack/cracker/proto/p12.proto index 0e46e4bb8..ada915b4a 100644 --- a/blcrack/cracker/proto/p12.proto +++ b/blcrack/cracker/proto/p12.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p12; + import "common.proto"; message SC_12001 { diff --git a/blcrack/cracker/proto/p13.proto b/blcrack/cracker/proto/p13.proto index b265c8337..f2bf66fd9 100644 --- a/blcrack/cracker/proto/p13.proto +++ b/blcrack/cracker/proto/p13.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p13; + import "common.proto"; message SC_13000 { diff --git a/blcrack/cracker/proto/p14.proto b/blcrack/cracker/proto/p14.proto index bcb297d9d..33e2b2a60 100644 --- a/blcrack/cracker/proto/p14.proto +++ b/blcrack/cracker/proto/p14.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p14; + import "common.proto"; message SC_14001 { diff --git a/blcrack/cracker/proto/p15.proto b/blcrack/cracker/proto/p15.proto index 393cf2786..88f30023a 100644 --- a/blcrack/cracker/proto/p15.proto +++ b/blcrack/cracker/proto/p15.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p15; + import "common.proto"; message SC_15001 { diff --git a/blcrack/cracker/proto/p16.proto b/blcrack/cracker/proto/p16.proto index 44922af81..c472ccb50 100644 --- a/blcrack/cracker/proto/p16.proto +++ b/blcrack/cracker/proto/p16.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p16; + import "common.proto"; message CS_16001 { diff --git a/blcrack/cracker/proto/p17.proto b/blcrack/cracker/proto/p17.proto index 0390aab76..a91c52e37 100644 --- a/blcrack/cracker/proto/p17.proto +++ b/blcrack/cracker/proto/p17.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p17; + message SC_17001 { repeated uint32 finish_list = 1; diff --git a/blcrack/cracker/proto/p18.proto b/blcrack/cracker/proto/p18.proto index 7e92a0c35..4f7e680d8 100644 --- a/blcrack/cracker/proto/p18.proto +++ b/blcrack/cracker/proto/p18.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p18; + import "common.proto"; message CS_18001 { diff --git a/blcrack/cracker/proto/p19.proto b/blcrack/cracker/proto/p19.proto index ef8357283..b072c49f4 100644 --- a/blcrack/cracker/proto/p19.proto +++ b/blcrack/cracker/proto/p19.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p19; + message SC_19001 { required uint32 lv = 1; diff --git a/blcrack/cracker/proto/p20.proto b/blcrack/cracker/proto/p20.proto index e16a8c0e5..e5969aa1c 100644 --- a/blcrack/cracker/proto/p20.proto +++ b/blcrack/cracker/proto/p20.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p20; + import "common.proto"; message SC_20001 { diff --git a/blcrack/cracker/proto/p22.proto b/blcrack/cracker/proto/p22.proto index 2635ba7a7..6957ad371 100644 --- a/blcrack/cracker/proto/p22.proto +++ b/blcrack/cracker/proto/p22.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p22; + import "common.proto"; message SC_22001 { diff --git a/blcrack/cracker/proto/p24.proto b/blcrack/cracker/proto/p24.proto index 1cbd3791e..dbc4f1e98 100644 --- a/blcrack/cracker/proto/p24.proto +++ b/blcrack/cracker/proto/p24.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p24; + import "common.proto"; message CS_24002 { diff --git a/blcrack/cracker/proto/p25.proto b/blcrack/cracker/proto/p25.proto index c4a6fef08..344f2568a 100644 --- a/blcrack/cracker/proto/p25.proto +++ b/blcrack/cracker/proto/p25.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p25; + import "common.proto"; message SC_25001 { diff --git a/blcrack/cracker/proto/p26.proto b/blcrack/cracker/proto/p26.proto index d00c2d6ad..9d49d91cc 100644 --- a/blcrack/cracker/proto/p26.proto +++ b/blcrack/cracker/proto/p26.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p26; + import "common.proto"; message SC_26001 { diff --git a/blcrack/cracker/proto/p27.proto b/blcrack/cracker/proto/p27.proto index 6f617cf97..bba941a45 100644 --- a/blcrack/cracker/proto/p27.proto +++ b/blcrack/cracker/proto/p27.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p27; + message CS_27000 { required uint32 type = 1; diff --git a/blcrack/cracker/proto/p28.proto b/blcrack/cracker/proto/p28.proto index 58de89316..2b1ba6a28 100644 --- a/blcrack/cracker/proto/p28.proto +++ b/blcrack/cracker/proto/p28.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p28; + import "common.proto"; message SC_28000 { diff --git a/blcrack/cracker/proto/p29.proto b/blcrack/cracker/proto/p29.proto index 28b8f41b2..9f5608206 100644 --- a/blcrack/cracker/proto/p29.proto +++ b/blcrack/cracker/proto/p29.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p29; + import "common.proto"; message CS_29001 { diff --git a/blcrack/cracker/proto/p30.proto b/blcrack/cracker/proto/p30.proto index 350410fc8..61d2bb8e5 100644 --- a/blcrack/cracker/proto/p30.proto +++ b/blcrack/cracker/proto/p30.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p30; + import "common.proto"; message SC_30001 { diff --git a/blcrack/cracker/proto/p33.proto b/blcrack/cracker/proto/p33.proto index a309ead39..5a055ec74 100644 --- a/blcrack/cracker/proto/p33.proto +++ b/blcrack/cracker/proto/p33.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p33; + import "common.proto"; message CS_33000 { diff --git a/blcrack/cracker/proto/p34.proto b/blcrack/cracker/proto/p34.proto index bf7751f49..e073c19f4 100644 --- a/blcrack/cracker/proto/p34.proto +++ b/blcrack/cracker/proto/p34.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p34; + import "common.proto"; message CS_34001 { diff --git a/blcrack/cracker/proto/p40.proto b/blcrack/cracker/proto/p40.proto index 3a1bcd6bf..8a72fb94f 100644 --- a/blcrack/cracker/proto/p40.proto +++ b/blcrack/cracker/proto/p40.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p40; + import "common.proto"; message CS_40001 { diff --git a/blcrack/cracker/proto/p50.proto b/blcrack/cracker/proto/p50.proto index efbc08b21..71682d2da 100644 --- a/blcrack/cracker/proto/p50.proto +++ b/blcrack/cracker/proto/p50.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p50; + import "common.proto"; message SC_50000 { diff --git a/blcrack/cracker/proto/p60.proto b/blcrack/cracker/proto/p60.proto index fb7915b23..f880492a1 100644 --- a/blcrack/cracker/proto/p60.proto +++ b/blcrack/cracker/proto/p60.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p60; + import "common.proto"; import "guild.proto"; diff --git a/blcrack/cracker/proto/p61.proto b/blcrack/cracker/proto/p61.proto index f014e374a..40c00a960 100644 --- a/blcrack/cracker/proto/p61.proto +++ b/blcrack/cracker/proto/p61.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p61; + import "common.proto"; message CS_61001 { diff --git a/blcrack/cracker/proto/p62.proto b/blcrack/cracker/proto/p62.proto index 0d18a6cab..0c61e9d0c 100644 --- a/blcrack/cracker/proto/p62.proto +++ b/blcrack/cracker/proto/p62.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p62; + import "common.proto"; import "guild.proto"; diff --git a/blcrack/cracker/proto/p63.proto b/blcrack/cracker/proto/p63.proto index 0e36b5f5c..eb2ad1a8b 100644 --- a/blcrack/cracker/proto/p63.proto +++ b/blcrack/cracker/proto/p63.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p63; + import "common.proto"; message SC_63000 { diff --git a/blcrack/cracker/proto/p64.proto b/blcrack/cracker/proto/p64.proto index 8590fdca3..9910f2a74 100644 --- a/blcrack/cracker/proto/p64.proto +++ b/blcrack/cracker/proto/p64.proto @@ -1,5 +1,7 @@ syntax = "proto2"; +package p64; + import "common.proto"; message SC_64000 { diff --git a/blcrack/cracker/server.cpp b/blcrack/cracker/server.cpp index 1ac131bad..72722c0f5 100644 --- a/blcrack/cracker/server.cpp +++ b/blcrack/cracker/server.cpp @@ -120,6 +120,18 @@ CrackerServer::CrackerServer() { res.status = 200; }); + Post("/print_value", [](const httplib::Request& req, httplib::Response& res) { + Json::Reader reader; + Json::Value j; + reader.parse(req.body, j); + std::vector path; + for (auto& key : j["path"]) { + path.push_back(key.asString()); + } + Cracker::Instance().print_value(path); + res.status = 200; + }); + Post("/enable_fake_player", [](const httplib::Request& req, httplib::Response& res) { Cracker::Instance().enable_fake_player(); res.status = 200; diff --git a/blcrack/installvcpkgs.bat b/blcrack/installvcpkgs.bat index 58653f79a..eaf5bc11f 100644 --- a/blcrack/installvcpkgs.bat +++ b/blcrack/installvcpkgs.bat @@ -10,6 +10,7 @@ call :install_all_platforms cpp-httplib call :install_all_platforms jsoncpp call :install_all_platforms spdlog call :install_all_platforms cxxopts +call :install_all_platforms protobuf call :install cpp-httplib x64-windows-static call :install jsoncpp x64-windows-static diff --git a/blcrack/platform/android.vcpkgs.cmake b/blcrack/platform/android.vcpkgs.cmake index 140874eb6..ce8346865 100644 --- a/blcrack/platform/android.vcpkgs.cmake +++ b/blcrack/platform/android.vcpkgs.cmake @@ -4,6 +4,7 @@ else () set(ARCH ${ANDROID_ABI}) endif () set(VCPKGS_SHARE ${VCPKG_ROOT}/${ARCH}-android/share) +set(VCPKGS_TOOLS ${VCPKG_ROOT}/${ARCH}-android/tools) set(unofficial-brotli_DIR ${VCPKGS_SHARE}/unofficial-brotli) set(httplib_DIR ${VCPKGS_SHARE}/httplib) @@ -18,4 +19,14 @@ find_package(spdlog CONFIG REQUIRED) set(SPDLOG_DEFINES SPDLOG_COMPILED_LIB) set(cxxopts_DIR ${VCPKGS_SHARE}/cxxopts) -find_package(cxxopts CONFIG REQUIRED) \ No newline at end of file +find_package(cxxopts CONFIG REQUIRED) + +set(OpenSSL_DIR ${VCPKGS_SHARE}/openssl) +set(Z_VCPKG_OPENSSL_USE_SINGLE_CONFIG ON) +find_package(OpenSSL CONFIG REQUIRED) + +set(absl_DIR ${VCPKGS_SHARE}/absl) +set(utf8_range_DIR ${VCPKGS_SHARE}/utf8_range) +set(protobuf_DIR ${VCPKGS_SHARE}/protobuf) +set(Protobuf_PROTOC_EXECUTABLE ${VCPKGS_TOOLS}/protobuf/protoc) +find_package(protobuf CONFIG REQUIRED) \ No newline at end of file diff --git a/blcrack/triplets/x64-linux-static.cmake b/blcrack/triplets/x64-linux-static.cmake index 5a48fbe0c..64657f506 100644 --- a/blcrack/triplets/x64-linux-static.cmake +++ b/blcrack/triplets/x64-linux-static.cmake @@ -2,12 +2,12 @@ set(VCPKG_TARGET_ARCHITECTURE x64) set(VCPKG_CRT_LINKAGE static) set(VCPKG_LIBRARY_LINKAGE static) -set(VCPKG_ENV_PASSTHROUGH LINUX_CROSS_COMPILE_ROOT_DIR LINUX_CROSS_COMPILE_PREFIX PATH) +set(VCPKG_ENV_PASSTHROUGH LINUX_CROSS_COMPILER_ROOT_DIR LINUX_CROSS_COMPILER_PREFIX PATH) set(VCPKG_CMAKE_SYSTEM_NAME Linux) set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/x64-linux-static.toolchain.cmake) -set(PATCHELF ${CMAKE_CURRENT_LIST_DIR}/../vcpkgs/x64-linux-static/tools/patchelf.exe) +set(PATCHELF D:/patchelf/patchelf.exe) if (NOT EXISTS ${PATCHELF}) message(STATUS "patchelf not found, building it") diff --git a/blcrack/triplets/x64-linux-static.toolchain.cmake b/blcrack/triplets/x64-linux-static.toolchain.cmake index e444a39e1..7298d90c7 100644 --- a/blcrack/triplets/x64-linux-static.toolchain.cmake +++ b/blcrack/triplets/x64-linux-static.toolchain.cmake @@ -1,13 +1,13 @@ -if (NOT DEFINED ENV{LINUX_CROSS_COMPILE_ROOT_DIR}) - message(FATAL_ERROR "LINUX_CROSS_COMPILE_ROOT_DIR is not defined. Please set it to the root directory of your cross-compile toolchain.") +if (NOT DEFINED ENV{LINUX_CROSS_COMPILER_ROOT_DIR}) + message(FATAL_ERROR "LINUX_CROSS_COMPILER_ROOT_DIR is not defined. Please set it to the root directory of your cross-compile toolchain.") endif () -message(STATUS "Using cross: $ENV{LINUX_CROSS_COMPILE_ROOT_DIR}") +message(STATUS "Using cross: $ENV{LINUX_CROSS_COMPILER_ROOT_DIR}") set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR x64) -set(CMAKE_C_COMPILER $ENV{LINUX_CROSS_COMPILE_ROOT_DIR}/bin/$ENV{LINUX_CROSS_COMPILE_PREFIX}gcc.exe) -set(CMAKE_CXX_COMPILER $ENV{LINUX_CROSS_COMPILE_ROOT_DIR}/bin/$ENV{LINUX_CROSS_COMPILE_PREFIX}g++.exe) -set(CMAKE_AR $ENV{LINUX_CROSS_COMPILE_ROOT_DIR}/bin/$ENV{LINUX_CROSS_COMPILE_PREFIX}ar.exe) -set(CMAKE_RANLIB $ENV{LINUX_CROSS_COMPILE_ROOT_DIR}/bin/$ENV{LINUX_CROSS_COMPILE_PREFIX}ranlib.exe) -set(CMAKE_STRIP $ENV{LINUX_CROSS_COMPILE_ROOT_DIR}/bin/$ENV{LINUX_CROSS_COMPILE_PREFIX}strip.exe) +set(CMAKE_C_COMPILER $ENV{LINUX_CROSS_COMPILER_ROOT_DIR}/bin/$ENV{LINUX_CROSS_COMPILER_PREFIX}gcc.exe) +set(CMAKE_CXX_COMPILER $ENV{LINUX_CROSS_COMPILER_ROOT_DIR}/bin/$ENV{LINUX_CROSS_COMPILER_PREFIX}g++.exe) +set(CMAKE_AR $ENV{LINUX_CROSS_COMPILER_ROOT_DIR}/bin/$ENV{LINUX_CROSS_COMPILER_PREFIX}ar.exe) +set(CMAKE_RANLIB $ENV{LINUX_CROSS_COMPILER_ROOT_DIR}/bin/$ENV{LINUX_CROSS_COMPILER_PREFIX}ranlib.exe) +set(CMAKE_STRIP $ENV{LINUX_CROSS_COMPILER_ROOT_DIR}/bin/$ENV{LINUX_CROSS_COMPILER_PREFIX}strip.exe)