diff --git a/.gitignore b/.gitignore index 6b38132..9c4b6e9 100644 --- a/.gitignore +++ b/.gitignore @@ -42,4 +42,6 @@ conaninfo.txt graph_info.json CMakeUserPresets.json cmake-* -.idea/ \ No newline at end of file +.idea/ +obj-x86_64-linux-gnu/ +.claude/ diff --git a/CMakeLists.txt b/CMakeLists.txt index c6a0681..1b440e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,12 +1,8 @@ cmake_minimum_required(VERSION 3.25) -SET(VERSION_MAJOR "1") -SET(VERSION_MINOR "4") -SET(VERSION_PATCH "3") -project(bncsutil VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") +project(bncsutil VERSION 1.4.5) set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} "${PROJECT_SOURCE_DIR}/CMake/Modules") -message(${CMAKE_BINARY_DIR}) add_library(bncsutil SHARED) @@ -17,7 +13,6 @@ set(HEADERS "src/bncsutil/cdkeydecoder.h" "src/bncsutil/checkrevision.h" "src/bncsutil/decodekey.h" - "src/bncsutil/file.h" "src/bncsutil/keytables.h" "src/bncsutil/libinfo.h" "src/bncsutil/mutil.h" @@ -26,7 +21,6 @@ set(HEADERS "src/bncsutil/oldauth.h" "src/bncsutil/pe.h" "src/bncsutil/sha1.h" - "src/bncsutil/stack.h" ) set(SOURCES @@ -45,79 +39,82 @@ set(SOURCES target_sources(bncsutil PRIVATE ${SOURCES} ${HEADERS}) -if (WIN32) +if(WIN32) option(USE_SYSTEM_LIBS "Use system libraries" OFF) else() option(USE_SYSTEM_LIBS "Use system libraries" ON) endif() -if (CMAKE_GENERATOR_PLATFORM EQUAL "x86") - set_target_properties(bncsutil PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32") - MESSAGE(STATUS "Excluding 64bit library paths from search.") +if(CMAKE_GENERATOR_PLATFORM STREQUAL "x86") + target_compile_options(bncsutil PRIVATE -m32) + target_link_options(bncsutil PRIVATE -m32) + message(STATUS "Excluding 64bit library paths from search.") set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS OFF) - set(ARCH_DEB i386) - set(ARCH_RPM i686) -elseif (CMAKE_GENERATOR_PLATFORM EQUAL "x64") - set_target_properties(bncsutil PROPERTIES COMPILE_FLAGS "-m64" LINK_FLAGS "-m64") - set(ARCH_DEB amd64) - set(ARCH_RPM x86_64) -else() - set(ARCH_DEB amd64) - set(ARCH_RPM x86_64) +elseif(CMAKE_GENERATOR_PLATFORM STREQUAL "x64") + target_compile_options(bncsutil PRIVATE -m64) + target_link_options(bncsutil PRIVATE -m64) endif() -if (USE_SYSTEM_LIBS) - message("Using system dependencies") +if(USE_SYSTEM_LIBS) + message(STATUS "Using system dependencies") find_package(GMP REQUIRED) target_include_directories(bncsutil PRIVATE src ${GMP_INCLUDE_DIR}) - target_link_libraries(bncsutil ${GMP_LIBRARIES}) + target_link_libraries(bncsutil PRIVATE ${GMP_LIBRARIES}) else() - message("Using conan dependencies") + message(STATUS "Using conan dependencies") find_package(gmp REQUIRED) - target_include_directories(bncsutil PRIVATE src gmp::gmp) + target_include_directories(bncsutil PRIVATE src) target_link_libraries(bncsutil PRIVATE gmp::gmp) endif() -set_target_properties(bncsutil PROPERTIES OUTPUT_NAME bncsutil) +target_compile_definitions(bncsutil PRIVATE MUTIL_LIB_BUILD) if(UNIX) - set_target_properties(bncsutil PROPERTIES VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") - set_target_properties(bncsutil PROPERTIES SOVERSION 1) - - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -Wno-multichar -fPIC") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 -Wno-multichar -fPIC") + set_target_properties(bncsutil PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + ) + target_compile_options(bncsutil PRIVATE + -Wall -O3 -Wno-multichar -fPIC + -fvisibility=hidden + $<$:-fvisibility-inlines-hidden> + ) + target_link_options(bncsutil PRIVATE + -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/bncsutil.map + ) endif() -if (WIN32) - add_definitions(-D_CRT_SECURE_NO_WARNINGS -DMUTIL_LIB_BUILD) +if(WIN32) + target_compile_definitions(bncsutil PRIVATE _CRT_SECURE_NO_WARNINGS) endif() -if (MSVC) - set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT "bncsutil") +if(MSVC) + set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT "bncsutil") endif() include(CMakePackageConfigHelpers) +include(GNUInstallDirs) install(TARGETS bncsutil EXPORT bncsutilTargets - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - INCLUDES DESTINATION include + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) -install(FILES ${HEADERS} DESTINATION include/bncsutil) +install(FILES ${HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/bncsutil) install(EXPORT bncsutilTargets FILE bncsutilTargets.cmake NAMESPACE bncsutil:: - DESTINATION lib/cmake/bncsutil + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bncsutil ) configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/CMake/bncsutilConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/bncsutilConfig.cmake" - INSTALL_DESTINATION lib/cmake/bncsutil + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bncsutil ) write_basic_package_version_file( @@ -129,37 +126,35 @@ write_basic_package_version_file( install(FILES "${CMAKE_CURRENT_BINARY_DIR}/bncsutilConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/bncsutilConfigVersion.cmake" - DESTINATION lib/cmake/bncsutil + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bncsutil ) -#CPack configuration -SET(CPACK_GENERATOR "DEB" "RPM") -SET(CPACK_PACKAGE_NAME "bncsutil") -SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Battle.Net Chat Service Utility") -SET(CPACK_PACKAGE_VENDOR "bncsutil") -SET(CPACK_PACKAGE_DESCRIPTION "\ +# CPack configuration +set(CPACK_GENERATOR "DEB" "RPM") +set(CPACK_PACKAGE_NAME "bncsutil") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Battle.Net Chat Service Utility") +set(CPACK_PACKAGE_VENDOR "bncsutil") +set(CPACK_PACKAGE_DESCRIPTION "\ This will install the library to /usr/local/lib and header files to /usr/local/include.\n \ Make sure these directories are in your library and include paths. \ ") -SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING") -SET(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}") -SET(CPACK_PACKAGE_VERSION_MINOR "${VERSION_MINOR}") -SET(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING") +set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) +set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) +set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) set(CPACK_PACKAGING_INSTALL_PREFIX "/usr/local") -#DEB configuration -SET(CPACK_DEBIAN_PACKAGE_SECTION "libs") -SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/BNETDocs/bncsutil") -SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "imbacen@gmail.com") -SET(CPACK_DEBIAN_PACKAGE_ARCHITECTURE ${ARCH_DEB}) -SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libgmp10") - -#RPM configuration -SET(CPACK_RPM_PACKAGE_RELEASE 1) -SET(CPACK_RPM_PACKAGE_LICENSE "LGPL-2.1") -SET(CPACK_RPM_PACKAGE_GROUP "bncsutil") -SET(CPACK_RPM_PACKAGE_URL "https://github.com/BNETDocs/bncsutil") -SET(CPACK_RPM_PACKAGE_REQUIRES "gmp") -SET(CPACK_RPM_PACKAGE_ARCHITECTURE ${ARCH_RPM}) - -INCLUDE(CPack) +# DEB configuration +set(CPACK_DEBIAN_PACKAGE_SECTION "libs") +set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/BNETDocs/bncsutil") +set(CPACK_DEBIAN_PACKAGE_MAINTAINER "imbacen@gmail.com") +set(CPACK_DEBIAN_PACKAGE_DEPENDS "libgmp10") + +# RPM configuration +set(CPACK_RPM_PACKAGE_RELEASE 1) +set(CPACK_RPM_PACKAGE_LICENSE "LGPL-2.1") +set(CPACK_RPM_PACKAGE_GROUP "bncsutil") +set(CPACK_RPM_PACKAGE_URL "https://github.com/BNETDocs/bncsutil") +set(CPACK_RPM_PACKAGE_REQUIRES "gmp") + +include(CPack) diff --git a/bncsutil.map b/bncsutil.map new file mode 100644 index 0000000..ee1cc9d --- /dev/null +++ b/bncsutil.map @@ -0,0 +1,68 @@ +{ + global: + /* bsha1 */ + calcHashBuf; + + /* checkrevision */ + checkRevision; + checkRevisionFlat; + extractMPQNumber; + getExeInfo; + get_mpq_seed; + set_mpq_seed; + + /* decodekey (C wrappers) */ + kd_calculateHash; + kd_create; + kd_free; + kd_getHash; + kd_init; + kd_isValid; + kd_longVal2; + kd_product; + kd_quick; + kd_val1; + kd_val2; + kd_val2Length; + + /* libinfo */ + bncsutil_getVersion; + bncsutil_getVersionString; + + /* nls */ + nls_account_change_proof; + nls_account_create; + nls_account_logon; + nls_check_M2; + nls_check_signature; + nls_free; + nls_get_A; + nls_get_K; + nls_get_M1; + nls_get_S; + nls_get_v; + nls_init; + nls_init_l; + nls_reinit; + nls_reinit_l; + + /* oldauth */ + doubleHashPassword; + hashPassword; + + /* pe */ + cm_pe_fixed_version; + cm_pe_load; + cm_pe_load_resources; + cm_pe_unload; + cm_pe_unload_resources; + + /* CDKeyDecoder C++ class (methods, vtable, typeinfo) */ + _ZN12CDKeyDecoder*; + _ZTI12CDKeyDecoder; + _ZTS12CDKeyDecoder; + _ZTV12CDKeyDecoder; + + local: + *; +}; diff --git a/src/bncsutil/bsha1.h b/src/bncsutil/bsha1.h index 71fb980..52cff86 100644 --- a/src/bncsutil/bsha1.h +++ b/src/bncsutil/bsha1.h @@ -42,10 +42,6 @@ extern "C" { */ MEXP(void) calcHashBuf(const char* data, size_t length, char* hash); -/* - * New implementation. Broken. No plans to fix. - */ -MEXP(void) bsha1_hash(const char* input, unsigned int length, char* result); #ifdef __cplusplus } // extern "C" diff --git a/src/bncsutil/mutil.h b/src/bncsutil/mutil.h index 981a132..09e4d4e 100644 --- a/src/bncsutil/mutil.h +++ b/src/bncsutil/mutil.h @@ -151,9 +151,18 @@ #endif /** - * I think what this tries to do is differentiate if you are trying to build - * this as a library exporting symbols versus using the library from this same project - * ..which I don't think makes much sense. TODO: evaluate and nuke import part in the future + * MUTIL_LIB_BUILD must be defined when compiling the library itself. + * It is set automatically by CMake via target_compile_definitions(). + * + * When defined (building the .so/.dll): + * MEXP marks symbols for export: + * Windows - __declspec(dllexport) + * Linux - __attribute__((visibility("default"))) (with -fvisibility=hidden) + * + * When not defined (consumer including the header): + * MEXP marks symbols for import: + * Windows - __declspec(dllimport) + * Linux - extern (no-op; ELF resolves symbols at load time) */ #ifdef MOS_WINDOWS # pragma comment(lib, "Version.lib") @@ -166,8 +175,8 @@ # endif #else # ifdef MUTIL_LIB_BUILD -# define MEXP(type) type -# define MCEXP(name) class name +# define MEXP(type) __attribute__((visibility("default"))) type +# define MCEXP(name) class __attribute__((visibility("default"))) name # else # define MEXP(type) extern type # define MCEXP(name) class name diff --git a/src/bncsutil/pe.c b/src/bncsutil/pe.c index decbb1c..2843e89 100644 --- a/src/bncsutil/pe.c +++ b/src/bncsutil/pe.c @@ -245,7 +245,7 @@ MEXP(void) cm_pe_unload(cm_pe_t pe) free(pe); } -MEXP(cm_pe_section_t*) cm_pe_get_section(cm_pe_t pe, const char* name) { +static cm_pe_section_t* cm_pe_get_section(cm_pe_t pe, const char* name) { unsigned int i; cm_pe_section_t* s; uint32_t section_count = pe->header.section_count;