Jump to content

arves100

Former Staff
  • Posts

    620
  • Joined

  • Last visited

  • Days Won

    18
  • Feedback

    100%

Posts posted by arves100

  1. (Sorry for bumping just to clear up what this tool is)

    Version 2.9 of Gr2 animation studio was currently in preview, so not really stable to use.

    This tool was created by RAD to animate using nodes, basically it allows to deform and move bones.

    This tool requires using RAD's gperf (or something similar) SDK that  IS NOT SUPPORTED IN METIN2.

    This tool should not support gr2 normal animations, and as it was a beta, it should not even be used in a game. (Unless you get the newer versions)

  2. On 12/18/2019 at 10:48 PM, peri200 said:

    I am interested in buying a version of vanilla game that is 100% patched and working

    I know it is public but the latest versions do not work well the r71 I am looking for someone who works with this game and has it patched and working

    If you have an issue you should post on QA, what karbust said it's right...

  3. 21 hours ago, Gurgarath said:

    Exactly, that's why I said "2014+" because nova added some bugfixes and a "ratio system" which is interesting but not effective because of the way the game update things. You're completley right :D

    Now I'm interested about this ratio system ?

  4. On 1/13/2020 at 9:46 AM, Gurgarath said:

    Hello,

     

    Quick back story, those are official from early 2014 pretty much, they contain SG sources, nova sources (2014+) and some wolfman prototype. Those are a small part of a big leak that occured in 2014. It contained Metin2 sources, Metin1 sources as well as Inferna sources. We currently have two theories that are sometimes called official theories but we can't really know who to trust. I am going  to be short:

     

    • It was either a leak made by an employee that copied the file and sold them later on.
    • Or it was downloaded from their server after someone exploited a breach in it.

     

    Ever since, we never had any more leaks, might it be core or sources like we had from 2008 to 2014. The only "leak" was an uncythonized root from 2018 because they forgot to cythonize it.

    From what I recall (I remember I have read this somewhere), novaline is a modified branch of a guy called Nova who was the first one to get the source in his hand. (It was forked from mainline_rls or dev I think).

     

     

    apart from sources, we used to have different leaks during the years, starting with 2009 server files directly leaked from RunUp.

    • Love 2
  5. M2 Download Center

    This is the hidden content, please
    ( Internal )

    Rather than having this crap die in my HDD I've decided to share them, they range around 2017-2018

     

    utils.h optimizations (You need a c++11 compiler)

    utils.h
    
    //Replace:
    out = (long long) strtoull(in, NULL, 10);
    //To:
    out = strtoll(in, NULL, 10);
    
    //Replace:
    out = (unsigned long) strtoul(in, NULL, 10);
    //To:
    out = strtoul(in, NULL, 10);
    //Replace:
    out = (long) strtol(in, NULL, 10);
    //To:
    out = strtol(in, NULL, 10);
    
    
    
    //Add:
    inline bool str_to_number (unsigned long long& out, const char *in)
    {
     if (0==in || 0==in[0]) return false;
    
     out = strtoull(in, NULL, 10);
     return true;
    }

    Useless check in char.cpp

    //From:
    			if(val==0 && val>0)
    				pack.value = val;
    			else
    				pack.value = val;
    //To:
    pack.value = val;

     

     

    Random stuff: Colored console messages (Windows only - you can do a nix version by using ansii colors) - this code was made in 2017, the quality definitly shows as it could be extended or make a singular API for console (working for both nix and win)

    Sample usage:

    #include "../libthecore/include/winconsole.h"

    void test_console() {
        winconsole_set_color(CONSOLE_COLOR_GREEN); //This set the color
        //You can find the list of all usable color in winconsole.h
        printf("Test WinConsole\n"); //Print the text with the new color
        winconsole_resetcolor(); //Always reset color else the console will continue print the same color
        printf("No color\n"); //Print with default color (WHITE)
    }

     

    winconsole.h (libthecore/include)

    /* ---------------------------------
    	ARVES100 WinConsole
    	Required for colored console
    ------------------------------------ */
    #ifndef _ARVES100_INCLUDE_WINCONSOLE_HEADER_C_
    #define _ARVES100_INCLUDE_WINCONSOLE_HEADER_C_
    
    #define CONSOLE_COLOR_BLACK 0
    #define CONSOLE_COLOR_RED 4
    #define CONSOLE_COLOR_BLUE 9
    #define CONSOLE_COLOR_WHITE 15
    #define CONSOLE_COLOR_GREEN 10
    #define CONSOLE_COLOR_YELLOW 14
    #define CONSOLE_COLOR_PURPLE 13
    
    int winconsole_initialize();
    void winconsole_resetcolor();
    void winconsole_setcolor(int color);
    void winconsole_pause();
    
    #endif

    winconsole.c (libthecore/src)

    /*
    	ARVES100 COLORED CONSOLE FOR WIN32
    	CODED 06.01.2017
    */
    
    #include "stdafx.h"
    
    #if defined(_WIN32) || defined(WIN32) || defined(__WIN32__)
    
    #include <Windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "winconsole.h"
    
    FILE* fp = NULL;
    HANDLE StdOut = NULL;
    
    int winconsole_initialize() {
    	StdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    	SetConsoleTextAttribute(StdOut,CONSOLE_COLOR_WHITE);
    	return 0;
    }
    
    void winconsole_resetcolor() {
    	SetConsoleTextAttribute(StdOut, CONSOLE_COLOR_WHITE);
    }
    
    void winconsole_setcolor(int color) {
    	SetConsoleTextAttribute(StdOut, color);
    }
    
    void winconsole_pause() {
    	// Alternativa portatile usando scanf+printf (cstdio)
    	printf("Press any key to continue...");
    	char ch;
    	scanf("%1c",&ch);
    }
    
    #endif

     

    Example usage on log.c (libthecore)

    /********************************************************/
    /* COLORED CONSOLE FOR WIN32 (PRIVATE FREE SYSTEM)		*/
    /* CODED BY ARVES100 (06/01/2017)						*/
    /********************************************************/
    
    //libthecore/src/log.c
    #define SYSERR_FILENAME "syserr.txt"
    #define PTS_FILENAME "PTS.txt"
    #include "winconsole.h"
    #endif
    ///////////////////////
    #else
    void _sys_err(const char *func, int line, const char *format, ...)
    {
    	va_list args;
    	time_t ct = time(0);  
    	char *time_s = asctime(localtime(&ct));
    
    	char buf[1024 + 2]; // \n을 붙이기 위해..
    	int len;
    
    	if (!log_file_err)
    		return;
    	
    	winconsole_setcolor(CONSOLE_COLOR_RED);
    
    	time_s[strlen(time_s) - 1] = '\0';
    	len = snprintf(buf, 1024, "SYSERR: %-15.15s :: %s: ", time_s + 4, func);
    	buf[1025] = '\0';
    
    	if (len < 1024)
    	{
    		va_start(args, format);
    		vsnprintf(buf + len, 1024 - len, format, args);
    		va_end(args);
    	}
    
    	strcat(buf, "\n");
    
    	// log_file_err 에 출력
    	fputs(buf, log_file_err->fp);
    	fflush(log_file_err->fp);
    
    	// log_file_sys 에도 출력
    	fputs(buf, log_file_sys->fp);
    	fflush(log_file_sys->fp);
    
    	fputs(buf, stdout);
    	fflush(stdout);
    	
    	winconsole_resetcolor();
    }
    #endif
    ///////////////////
    void sys_log(unsigned int bit, const char *format, ...)
    {
    	va_list	args;
    
    	if (bit != 0 && !(log_level_bits & bit))
    		return;
    	
    
    	#ifdef __WIN32__
    		winconsole_setcolor(CONSOLE_COLOR_BLUE);
    	#endif
    
    	if (log_file_sys)
    	{
    		time_t ct = time(0);  
    		char *time_s = asctime(localtime(&ct));
    
    		fprintf(log_file_sys->fp, sys_log_header_string);
    
    		time_s[strlen(time_s) - 1] = '\0';
    		fprintf(log_file_sys->fp, "%-15.15s :: ", time_s + 4);
    
    		va_start(args, format);
    		vfprintf(log_file_sys->fp, format, args);
    		va_end(args);
    
    		fputc('\n', log_file_sys->fp);
    		fflush(log_file_sys->fp);
    	}
    
    #ifndef __WIN32__
    	// log_level이 1 이상일 경우에는 테스트일 경우가 많으니 stdout에도 출력한다.
    	if (log_level_bits > 1)
    	{
    #endif
    		fprintf(stdout, sys_log_header_string);
    
    		va_start(args, format);
    		vfprintf(stdout, format, args);
    		va_end(args);
    
    		fputc('\n', stdout);
    		fflush(stdout);
    		
    #ifndef __WIN32__
    	}
    #else
    	winconsole_resetcolor();
    #endif
    }

     

    Teamspeak 3 python interfaces

    This was a leftover for an old system a pserver told me to make and then simply dropped the idea (TS3 SDK was too expensive)

    this is what is left to, I don't have any source code in client side and I do not provide any support for this, it's just a working python interface that needs to be finished. Pretty much the same you would achieve if you unpack the root where this system was originally going to be.

    This is the hidden content, please

     

    XMLCreator updated

    Who does remember the old XML files from Tim's archive? This is an updated version for Tim's 40k archiver that was based from a version of Tim's old 2089 archiver made by some guy on epvp.

    This is the hidden content, please

    You need ActionScript3 to build this.

     

    Wrong comparison on char_skill.cpp:2635 (Required for clang)

     

    from:

                        (NULL != pkVictim && SKILL_HORSE_WILDATTACK != dwVnum) ? pkVictim->GetVID() : NULL,
                        ComputeCooltime(iCooltime * 1000),

    to:

                        (NULL != pkVictim && SKILL_HORSE_WILDATTACK != dwVnum) ? pkVictim->GetVID() : 0,
                        ComputeCooltime(iCooltime * 1000),

     

    • Metin2 Dev 14
    • Eyes 1
    • Angry 1
    • Good 2
    • Love 11
  6. Note: This tutorial was originally written on 26-01-2017 for a pserver.

    Note: I don't have the SDK, I'll notify the admins if I manage to find one (it's missing on the temp forum)

    Note: AhnLab HackShield is deprecated, it has not received any update since 2013 or similar

     

    1. Extern

    Go to Extern/include and create a new folder called hackshield
    (If you already have some files inside that remove all of them)
    Put the files from (Your HackShield SDK Zip)/Include to Extern/include/hackshield
    This step must be done on both Client and Server Extern

    Copy from (Your HackShield SDK Zip)/Lib/Win/x86/MultiThreaded to Extern/lib the following files: (Client only)

    HShield/HShield.lib

    AntiCrack/AntiCpXSvr.lib

    Copy (Your HackShield SDK Zip)/Developer/Lib/Win/x86/Multithreaded/HShield.lib to Extern/lib/HShield_d.lib (Yes you have to rename this)
    Copy from (Your HackShield SDK Zip)/Lib/FreeBSD/x86/AntiCrack/LibAntiCpXSvr_st.a to Extern/lib (Server only)

    Create a new file called hshieldLibLink.h in Extern/include/hackshield (Both Client and Server) and put this:

    #ifndef _HACKSHIELD_INCLUDE_LIBLINK_H_
    #define _HACKSHIELD_INCLUDE_LIBLINK_H_
    	#ifdef _MSC_VER
    		#ifdef _DEBUG
    			#pragma comment(lib,"hshield_d.lib")
    		#else
    			#pragma comment(lib,"hshield.lib")
    		#endif
    		
    		#pragma comment(lib,"HsUserUtil.lib")
    	#endif	
    #endif

     

    2- Client source: Adding /CLR

    -- Speaicl note: you need to rebuild libjpeg, lzo, cryptopp with /MD and /MDd (defaults are /MT for CryptoPP, /MD for libjpeg and lzo if cmake is being used)

    You have to edit the VCXProjects
    Go to C/C++ -> All Options and find /M
    In Distribute/Release you have to set the "Runtime Library" value to /MD
    In Debug you have to set that to /MDd

    Now you have to go on General (In the project settings) and add "Support with Common Language Runtime" to 1 (/clr)

    Now go on C/C++ -> All Options and find /RTC and change that to "Default"
    Now go to All Options and write in command line: "/RTC:NO"

     

    --- Special note: this step was intended for an old CryptoPP version (I think v5.x?) follow this step only if you receive issues

    Spoiler

    Now you need to rebuild all modules with the Runtime Library change that you do before
    But Crypto++ need another adjustment, open config.h and change this:

    
    // synchronization: MS at VS2012 (17.00); GCC at 4.4; Clang at 3.3; Xcode 5.0; Intel 12.0; SunCC 12.4.
    // TODO: verify Clang and Intel versions; find __has_feature(x) extension for Clang
    #if (CRYPTOPP_MSC_VERSION >= 1700)
    #  define CRYPTOPP_CXX11_SYNCHRONIZATION 1
    #elif (__INTEL_COMPILER >= 1200)
    #  define CRYPTOPP_CXX11_SYNCHRONIZATION 1
    #elif (CRYPTOPP_LLVM_CLANG_VERSION >= 30300) || (CRYPTOPP_APPLE_CLANG_VERSION >= 50000)
    #  define CRYPTOPP_CXX11_SYNCHRONIZATION 1
    #elif (CRYPTOPP_GCC_VERSION >= 40400)
    #  define CRYPTOPP_CXX11_SYNCHRONIZATION 1
    #elif (__SUNPRO_CC >= 0x5130)
    #  define CRYPTOPP_CXX11_SYNCHRONIZATION 1
    #endif // synchronization

    With this:

    
    // synchronization: MS at VS2012 (17.00); GCC at 4.4; Clang at 3.3; Xcode 5.0; Intel 12.0; SunCC 12.4.
    // TODO: verify Clang and Intel versions; find __has_feature(x) extension for Clang
    /*#if (CRYPTOPP_MSC_VERSION >= 1700)
    #  define CRYPTOPP_CXX11_SYNCHRONIZATION 1
    #elif (__INTEL_COMPILER >= 1200)
    #  define CRYPTOPP_CXX11_SYNCHRONIZATION 1
    #elif (CRYPTOPP_LLVM_CLANG_VERSION >= 30300) || (CRYPTOPP_APPLE_CLANG_VERSION >= 50000)
    #  define CRYPTOPP_CXX11_SYNCHRONIZATION 1
    #elif (CRYPTOPP_GCC_VERSION >= 40400)
    #  define CRYPTOPP_CXX11_SYNCHRONIZATION 1
    #elif (__SUNPRO_CC >= 0x5130)
    #  define CRYPTOPP_CXX11_SYNCHRONIZATION 1
    #endif*/ // synchronization
    #undef CRYPTOPP_CXX11_SYNCHRONIZATION
    	

     

     

    Now rebuild everything and you don't have "mutex is not supported in CLR" error

     

    3. Client source: Adding hackshield

    Open UserInterface/HackShield.cpp
    You will find the following lines: (Or something similar at the beginning of the file)

    #if defined(LOCALE_SERVICE_EUROPE)
    	#define METIN2HS_MONITORING_SERVER_ADDR "79.110.88.84"
    #elif
    	#define METIN2HS_MONITORING_SERVER_ADDR "79.110.88.84" // GF
    #endif
    //#define METIN2HS_MONITORING_SERVER_ADDR "119.192.130.160"  //±è¿ë¿í pc

    Replace all with this:

    #define METIN2HS_MONITORING_SERVER_ADDR "YOUR IP OF THE MONITOR SERVER"

     

    -- Extra note: the monitoring server should be a server used to monitor running instances of HackShield, I never went deeply into this, perhaps you can find some extra information on the HackShield SDK docs

     

    Ok now open UserInterface/Locale_inc.h and add this:

    #define USE_AHNLAB_HACKSHIELD						// HackShield
    #define METIN2HS_INCLUDE	hackshield
    		

    Open HackShield.h and replace:

    #include "HackshieldLicense.h"

    with:

    #include "HackshieldLicense_metin2client.h"

     

    Open UserInterface/HackshieldLicense_metin2client.h and replace:

    #define METIN2HS_EXE_FILE_NAME        "metin2client.bin"
    		

    With:

    #define METIN2HS_EXE_FILE_NAME        "NAME OF THE METIN2 CLIENT.EXTENSION"

    Example:

    #define METIN2HS_EXE_FILE_NAME		  "testclient_arves100.exe"

     

    Now you need to setup your project for compile and use without error
    Open UserInterface Properties page:
    When you see Common Language Runtime Support (CLR) set it to /clr (If you use anyother it wont compile\link properly)
    Now go on C/C++ -> Enable C++ exception (sorry for bad translate <.<)
    Change "Yes (/EHsc)" to "Yes with SEH exceptions (/EHa)"

     

    Extra:
    If you get error on "DEFAULT_HSMS_TIME_OUT not defined" you have to do this:

    Open Extern/include/hackshield/hshield.h and delete:

     

    DEFAULT_HSMS_TIME_OUT
    				


    Add after:

    #ifndef _HSHIELD_H_INC
    #define _HSHIELD_H_INC            

        
    this:

    // Fix for compilation error
    #ifndef DEFAULT_HSMS_TIME_OUT
        #define    DEFAULT_HSMS_TIME_OUT        (5 * 1000)   // 5ÃÊ
    #endif

     

    - 3. Server

    Open game/src/Makefile and change this:

    # HackShield
    INCDIR += -I../../libhackshield/include
    LIBDIR += -L../../libhackshield/lib
    LIBS += -lanticpxsvr


            to:

     

     

    # HackShield *New* INCDIR += -I../../../Extern/include/hackshield LIBS += -lanticpxsvr_st

    Open game/src/HackShield_Impl.cpp and edit this line:

    handle_ = _AhnHS_CreateServerObject("metin2client.bin.hsb");


               

    with this:
    handle_ = _AhnHS_CreateServerObject("data/<client file name.extension>.hsb");

    Open your Auth and Game CONFIGs and add this:
    hackshield_enable: 1
    Extra:

     

    "hackshield_first_check_time" and "hackshield_check_cycle_time" are 2 CONFIG variables
    First check time: it tells after what second the server should ask the first heartbeat of the hackshield

    Cycle time:  it tells after what second the server should ask a heartbeat of the hackshield

     

    4. Client binary

    You have to copy from (HackShield SDK Zip)/Bin/Win/x86/HShield to Client Binary Folder
    If you want to use development hackshield (raccomended for Debug or QA) you have all content from (HackShield SDK Zip)/Developer/Bin to (Client Binary Folder)/HShield
    Remember: Do not distribute the development file (/Developer/Bin/), always use the release (/Bin/)

    If you want to periodically release updates for your HackShield you have to copy all content from (HackShield SDK Zip)/Bin/Win/x86/Update to your HShield folder on Client Binary Folder

     

    5. Configuring Hackshield

    We will work on (HackShield SDK Zip)/Bin/Win/x86:
    We must setup the AntiCrack that will check if the Client integrity is ok
    AntiCrack/HSBGen.exe will generate our HSB file
    AntiCrack/HSBHelper.exe will check if the files are ok
    Explanation:

    spacer.pngspacer.png

     

    The Output file will be the same name as we setted in HackShield_Impl.cpp before
    If you had to sign your exe make sure you do that after you used HSBGenerator
    If you use any other packer than UPX you must have to select "Execute Packet Exe File"
    Now it will generate a hsb file, put this file on (Server Binary Folder)/data/
    You can now check the hsb file with the client to see if everything match

    We need to tell hackshield witch server he uses to update our HShield files (Only if you want HSUpdate.exe)
    Open Util/HSUpSetEnv.exe

     

    -- Extra note: this is used for updating HackShield content from a remote server, you might want to ship it and do not use HSUpdate.exe
    Let me explain this application:

    spacer.pngspacer.png

     

    After you save it will create a HSUpdate.env file witch you have to put on (Client Binary Folder)/HShield

     

    Extra: Configuring HSUpdate server

    If you want to use FTP trasfer method you have to configure a ftp server with username and password you want to use (i won't explain this)

    You have to copy the folder PatchSet to your webserver
    Normally when you update your HackShield SDK you will get the update PatchSet for updating your client's HackShield to lateset version
    Everytime you get an HackShield SDK Update (mine is from 2012) you have to put the new PatchSet and distribute the new client (.exe)

     

    Extra: Disabling HS Monitor

    HackShield.cpp, change the _AhnHS_StartMonitor function to this:

            #ifdef ENABLE_HACKSHIELD_MONITOR
            DWORD dwRet = _AhnHS_StartMonitor (HsExtError, szInterfaceFilePath);
            if( dwRet != ERROR_SUCCESS )
            {
                MessageBox(NULL, MA_T("START_MONITORING_SERVICE_ERROR"), "HACK_SHIELD", MB_OK);
            }
            #endif

     

    Extra: Customizing names

    We see before how to customize .hsb file name for Server, Check out Server part if you miss out

    HSMonitor Client Name and Version can be setted in UserInterface/HackShield.cpp by editing this:

     

    strcpy(HsExtError.szGameVersion, "1.0.0.0"); //Game ë²„ì „
    strcpy(HsExtError.szUserId, "Metin2User_test"); //ìœ ì € ID

     

    If you changed the locale/ folder you also have to edit this:

    #define PREFIX_LOCALE        "locale/"

    If you want to edit the EhSvc.dll Name and Folder you have to edit this:

    #ifdef _DEBUG MA_PathMerge(szInterfaceFilePath, MA_ARRAYCOUNT(szInterfaceFilePath), szModuleDirPath, "hshield\\EHsvc.dll"); #else MA_PathMerge(szInterfaceFilePath, MA_ARRAYCOUNT(szInterfaceFilePath), szModuleDirPath, "hshield\\EHsvc.dll"); #endif

    If you want to change the HShield folder you have to edit this:

    MA_PathMerge(szFullFilePath, MA_ARRAYCOUNT(szFullFilePath), szModuleDirPath, "hshield");

     

     

    I don't have any working image or anything to show, I think I can confirm that it should work fine.
           

    • Metin2 Dev 1
    • Good 3
    • Love 9
  7. 14 hours ago, Darkness said:

    uhm, if i delete the system, i can compile 100% with no problem. so...... !! 

    I'd say some incopatibility between discord rcp and libjpeg, in my opinion you should rebuild libjpeg, for example by using something better like libjpeg turbo and not ijg libjpeg, otherwise check for /MT or /MD.

    • Love 1
  8. On 1/17/2020 at 11:07 PM, Mali61 said:

    Yes we can make a lot of things, this is so basic example.

    Also we can use visualizer:

    .gif

    oh I see, this looks pretty nice. Do you know something about the Game SDK? Wouldn't also like the game get banned or so on discord by doing such thing?

    • Metin2 Dev 1
  9. Hello, this is a small upgrade in order to build libserverkey for OpenSSL 1.0 or greater, it builds with OpenSSL v1.4d (Win32 build) fine.

     

    All this changes has to be made in RSACrypto.cpp

    Function RSACrypto::PublicKey::PublicKey

    Replace:

    		BN_hex2bn(&rsa_->n, n);
    		BN_hex2bn(&rsa_->e, e);

    to:

    #if OPENSSL_VERSION_NUMBER < 0x10100000L
    		BN_hex2bn(&rsa_->n, n);
    		BN_hex2bn(&rsa_->e, e);
    #else
    		BIGNUM* rsa_n, * rsa_e, * rsa_d;
    
    		RSA_get0_key(rsa_, (const BIGNUM**)&rsa_n, (const BIGNUM**)&rsa_e, (const BIGNUM**)&rsa_d);
    
    		BN_hex2bn(&rsa_n, n);
    		BN_hex2bn(&rsa_e, e);
    
    		RSA_set0_key(rsa_, rsa_n, rsa_e, rsa_d);
    #endif

     

    Function RSACrypto::PublicKey::Alloc

    Replace:

    		rsa->n = BN_new();
    		rsa->e = BN_new();

    to:

    #if OPENSSL_VERSION_NUMBER < 0x10100000L
    		rsa->n = BN_new();
    		rsa->e = BN_new();
    #else
    		BIGNUM* n = BN_new(), * e = BN_new();
    		RSA_set0_key(rsa, n, e, NULL);
    #endif

     

    Function RSACrypto::PublicKey::Copy

    Replace:

    		BN_copy(to->n, from->n);
    		BN_copy(to->e, from->e);

    to:

    #if OPENSSL_VERSION_NUMBER < 0x10100000L
    		BN_copy(to->n, from->n);
    		BN_copy(to->e, from->e);
    #else
    		BIGNUM* to_n, * to_e,* to_d;
    		const BIGNUM* from_n = RSA_get0_n(from), * from_e = RSA_get0_e(from);
    
    		RSA_get0_key(to, (const BIGNUM**)&to_n, (const BIGNUM**)&to_e, (const BIGNUM**)&to_d);
    
    		BN_copy(to_n, from_n);
    		BN_copy(to_e, from_e);
    
    		RSA_set0_key(to, to_n, to_e, to_d);
    #endif

     

    Function RSACrypto::PrivateKey::Alloc

    Replace:

    		rsa->d = BN_new();
    		rsa->p = BN_new();
    		rsa->q = BN_new();

    to:

    #if OPENSSL_VERSION_NUMBER < 0x10100000L
    		rsa->d = BN_new();
    		rsa->p = BN_new();
    		rsa->q = BN_new();
    #else
    		BIGNUM* d = BN_new(), * p = BN_new(), * q = BN_new();
    		RSA_set0_key(rsa, NULL, NULL, d);
    		RSA_set0_factors(rsa, p, q);
    #endif

     

    Function RSACrypto::PrintKey (k, n, e)

    Replace:

    		char* tmp = BN_bn2hex(k->rsa_->e);

    to:

    #if OPENSSL_VERSION_NUMBER < 0x10100000L
    		char* tmp = BN_bn2hex(k->rsa_->e);
    #else
    		const BIGNUM* rsa_e = RSA_get0_e(k->rsa_);
    		char* tmp = BN_bn2hex(rsa_e);
    #endif

     

    Replace:

    		tmp = BN_bn2hex(k->rsa_->n);

    to:

    #if OPENSSL_VERSION_NUMBER < 0x10100000L
    		tmp = BN_bn2hex(k->rsa_->n);
    #else
    		const BIGNUM* rsa_n = RSA_get0_n(k->rsa_);
    		tmp = BN_bn2hex(rsa_n);
    #endif

     

    Function RSACrypto::PrintKey(k, n, e, d)

    Replace:

    		char* tmp = BN_bn2hex(k->rsa_->n);

    to:

    #if OPENSSL_VERSION_NUMBER < 0x10100000L
    		char* tmp = BN_bn2hex(k->rsa_->n);
    #else
    		const BIGNUM* rsa_n = RSA_get0_n(k->rsa_);
    		char* tmp = BN_bn2hex(rsa_n);
    #endif

     

    Replace:

    		tmp = BN_bn2hex(k->rsa_->e);

    to:

    #if OPENSSL_VERSION_NUMBER < 0x10100000L
    		tmp = BN_bn2hex(k->rsa_->e);
    #else
    		const BIGNUM* rsa_e = RSA_get0_e(k->rsa_);
    		tmp = BN_bn2hex(rsa_e);
    #endif

     

    Replace:

    		tmp = BN_bn2hex(k->rsa_->d);

    to:

    #if OPENSSL_VERSION_NUMBER < 0x10100000L
    		tmp = BN_bn2hex(k->rsa_->d);
    #else
    		const BIGNUM* rsa_d = RSA_get0_d(k->rsa_);
    		tmp = BN_bn2hex(rsa_d);
    #endif

     

     

    The changes, explained:

    1) the ifdefs are there for compatibility with the old openssl version.

    2) OpenSSL 1.0 do not expose the "rsa_" structure, so we need to use OpenSSL own api to get the required data from it.

     

    A question that you might have at this point is what is the purpouse of libserverkey.

    It looks like ymir had an issue about leaking game files back in this day, this might explain why this feature was added.

    It bundles a RSA private and public key to your core, which verifies if the current machine should be able to use such core or not.

    It is not an important feature as it isn't that hard to bypass with the required knownledge and it could be removed safetly from the game.

    I'm thinking about covering this protection in the wiki, until then I hope I made some clarification about this library.

     

     

    • Metin2 Dev 1
    • Love 22
  10.             ITEM_APPLY_MAX_NUM = 4,
    
          
     typedef struct SItemApply
            {
                WORD        bType;
                long        lValue;
            } TItemApply;
    
            typedef struct SItemTable
            {
                DWORD       dwVnum;
                DWORD       dwVnumRange;
                char        szName[ITEM_NAME_MAX_LEN + 1];
                char        szLocaleName[ITEM_NAME_MAX_LEN + 1];
                BYTE        bType;
                BYTE        bSubType;
                
                BYTE        bWeight;
                BYTE        bSize;
                
                DWORD       dwAntiFlags;
                DWORD       dwFlags;
                DWORD       dwWearFlags;
                DWORD       dwImmuneFlag;
                            
                DWORD       dwIBuyItemPrice;            
                DWORD        dwISellItemPrice;
                
                TItemLimit  aLimits[ITEM_LIMIT_MAX_NUM];
                TItemApply  aApplies[ITEM_APPLY_MAX_NUM];
                long        alValues[ITEM_VALUES_MAX_NUM];
                long        alSockets[ITEM_SOCKET_MAX_NUM];
                DWORD       dwRefinedVnum;
                WORD        wRefineSet;
                uint32_t    dwMaterial67;
    
                BYTE        bAlterToMagicItemPct;
                BYTE        bSpecular;
                BYTE        bGainSocketPct;
                uint8_t        bMaskType;
                uint8_t        bMaskSubType;
    
            } TItemTable;

     

    looks like it's working fine in this way (Note: MCSP support is required) (Note2: what is that extra byte, looks like without it nothing works)

    (NOTE: Thanks to penger for explaining the extra byte)

    • Metin2 Dev 3
    • Cry 1
    • Good 1
    • Love 3
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.