Hello, guys. What is the worst thing both Silkroad server owners and normal players can experience ? Yes, its all about server
stability issues. Yeah, there are some solutions at PSRO scene like DetGuard, Torque and some others which aren't for public sale. But what I offer is something you really
must have if you want your server crash-free.
Why should you buy this tool, not any other out there ?
First of all, it uses both client and server sides for protecting your server.
This includes client side libraries (for silkroad and sro_client) which uses native hooks on some of client functions.
This means you can add your own, custom encryption on the top of Silkroad network protocol. Server side wont even accept any improper (non client) packets sent by attacker.
Server side, technically, is a TCP/IP proxy using high performance asynchronous sockets decrypting and encrypting data from modules. This also supports multiple gateway/download/agent servers.
You can also use different encryption for different modules. This tool is way faster than those other on the market.
What exactly comes in package ?
Silkroad client libraries (silkroad, sro_client) built to fit your specific needs (you can also forbid botting and any other kinds of activity some server owners consider as cheating)
Server side (ServerListenerConsole). Can be split between multiple node servers (lets say gateway listener at one host, and agent listener at another).
Setup guide
Life-time license (unless you want some custom updates which are not coming in common build)
Which modules are supported ?
Modules supported: GatewayServer, DownloadServer, AgentServer (may also hook module-module communication if needed, for additional price).
Only Vietnam version 188 is supported at the moment.
How often updates are released ?
Every sunday. Hotfixes may come out even more often (if required). Also, your encryption can be changed every week (with updates).
Can I have some custom features ?
It all depends what exactly you need. This features might be in-game bug fixes and such. Ofcourse, it will cost you some money.
Future plans ?
Implementing traffic processing on server side through module network core hooks (higher performance). Well, that doesen't really matter at the moment, because .NET asynchronous sockets
uses IOCP just perfectly.
Implementing multiple server/client version support.
Does it support multiple agents / gameservers ?
Yes, it does.
What is the price and how can I pay ?
Only Western Union is accepted at the moment.
The price is $125 for normal build.
License is limited to 2 server machines.
Contacts
Skype: z3r0n1337
Please, specify what exactly you want in contact request message.
Wednesday, December 10, 2014
Friday, October 10, 2014
srSquirrelSniffer
So ye, im currently working on packet sniffer for silkroad server modules / client. I would like to hear suggestions for feature implementation. At the moment im going to add such stuff as opcode filter, type guessing, output pausing and such. So if you got any good ideas for this project, feel free to post them here.
Sunday, August 17, 2014
Some Silkroad workarounds
Silkroad workarounds will go in this blog message.
Lets start with item variance parameter decoding. Code is pretty much hack-n-slash, but at least u can see how its made.
Here is way to decode item variance writen at PHP. Ye, u have to fix some lil shit, plus its writen asap... but it wont be hard to fix all the problems it has.
[item_stats.class.php]
<?php
class CItemInfo
{
private $m_ItemType = 0;
private $m_nCurParam = 0;
private $m_CurStatParams = array();
public static $s_WeaponStatNames =
array('Durability', 'PhyReinforce', 'MagReinforce', 'HitRatio', 'PhyAttack', 'MagAttack', 'CriticalRatio');
public static $s_EquipmentStatNames =
array('Durability', 'PhyReinforce', 'MagReinforce', 'PhyDefense', 'MagDefense', 'ParryRatio');
public static $s_ShieldStatNames =
array('Durability', 'PhyReinforce', 'MagReinforce', 'BlockRatio', 'PhyDefense', 'MagDefense');
public static $s_AccessoryStatNames =
array('PhyAbsorb', 'MagAbsorb');
public function __construct($item_type)
{
if($item_type > 3 || $item_type < 0) die("Item with type > 4 or < 0 !!1 (CItemInfo)!!");
$this -> m_ItemType = $item_type;
}
public function AddParam($param_value)
{
$this -> m_CurStatParams[$this -> m_nCurParam++] = $param_value;
}
public function GetParamCountForItem()
{
switch($this -> m_ItemType)
{
case 0:
{
return count(self::$s_WeaponStatNames);
}
break;
case 1:
{
return count(self::$s_EquipmentStatNames);
}
break;
case 2:
{
return count(self::$s_ShieldStatNames);
}
break;
case 3:
{
return count(self::$s_AccessoryStatNames);
}
break;
}
}
public function GetParams()
{
$result = array(array());
switch($this -> m_ItemType)
{
case 0:
{
for($i = 0; $i < count (self::$s_WeaponStatNames); $i++)
{
$result[$i] =
array(self::$s_WeaponStatNames[$i] => $this -> m_CurStatParams[$i]);
}
}
break;
case 1:
{
for($i = 0; $i < count (self::$s_EquipmentStatNames); $i++)
{
$result[$i] =
array(self::$s_EquipmentStatNames[$i] => $this -> m_CurStatParams[$i]);
}
}
break;
case 2:
{
for($i = 0; $i < count (self::$s_ShieldStatNames); $i++)
{
$result[$i] =
array(self::$s_ShieldStatNames[$i] => $this -> m_CurStatParams[$i]);
}
}
break;
case 3:
{
for($i = 0; $i < count (self::$s_AccessoryStatNames); $i++)
{
$result[$i] =
array(self::$s_AccessoryStatNames[$i] => $this -> m_CurStatParams[$i]);
}
}
break;
}
return $result;
}
}
class CItemClass
{
static $s_Instance;
private function __construct()
{
}
protected function __clone()
{
}
static public function Instance()
{
if(is_null(self::$s_Instance))
{
self::$s_Instance = new self();
}
return self::$s_Instance;
}
public function PercentageFromBitvalue($bitvalue)
{
return round(($bitvalue * 100 / 31) - 0.5 , 0);
}
public function GetVarianceDump($variance, $item_type_id)
{
$result = null;
$g_Item = new CItemInfo($item_type_id);
$n = 0;
$nParams = $g_Item -> GetParamCountForItem();
while($n < $nParams)
{
$cur_stat = $variance & 0x1F;
$g_Item -> AddParam($this -> PercentageFromBitvalue($cur_stat));
$variance >>= 5;
$n++;
}
//print_r($g_Item -> GetParams());
return $g_Item -> GetParams();
}
}
?>
Usage example:
[get_whitestats.php]
<html>
<head>
<title>ohai squirl</title>
</head>
<body>
<center>
<table border = '1' cellspacing = '2' cellpadding = '2'>
<form method='post'>
<td>Variance</td><td><input type='text' name='variance'></td><tr/>
<td>ItemType</td>
<td>
<select name = 'item_type'>
<option value='0'>Weapon</option>
<option value='1'>Armor</option>
<option value='2'>Shield</option>
<option value='3'>Accessory</option>
</select>
</td>
<td><input type='submit' value='Gib meh'></td>
</form>
</table>
</center>
</body>
</html>
<?php
if(!empty($_POST['variance']))
{
include('item_stats.class.php');
$instance = CItemClass::Instance();
//$a = (long) ($_POST['variance']);
print_r(
$instance -> GetVarianceDump((float)($_POST['variance']), $_POST['item_type'])
);
}
?>
Here is way to decode item variance writen at PHP. Ye, u have to fix some lil shit, plus its writen asap... but it wont be hard to fix all the problems it has.
[item_stats.class.php]
<?php
class CItemInfo
{
private $m_ItemType = 0;
private $m_nCurParam = 0;
private $m_CurStatParams = array();
public static $s_WeaponStatNames =
array('Durability', 'PhyReinforce', 'MagReinforce', 'HitRatio', 'PhyAttack', 'MagAttack', 'CriticalRatio');
public static $s_EquipmentStatNames =
array('Durability', 'PhyReinforce', 'MagReinforce', 'PhyDefense', 'MagDefense', 'ParryRatio');
public static $s_ShieldStatNames =
array('Durability', 'PhyReinforce', 'MagReinforce', 'BlockRatio', 'PhyDefense', 'MagDefense');
public static $s_AccessoryStatNames =
array('PhyAbsorb', 'MagAbsorb');
public function __construct($item_type)
{
if($item_type > 3 || $item_type < 0) die("Item with type > 4 or < 0 !!1 (CItemInfo)!!");
$this -> m_ItemType = $item_type;
}
public function AddParam($param_value)
{
$this -> m_CurStatParams[$this -> m_nCurParam++] = $param_value;
}
public function GetParamCountForItem()
{
switch($this -> m_ItemType)
{
case 0:
{
return count(self::$s_WeaponStatNames);
}
break;
case 1:
{
return count(self::$s_EquipmentStatNames);
}
break;
case 2:
{
return count(self::$s_ShieldStatNames);
}
break;
case 3:
{
return count(self::$s_AccessoryStatNames);
}
break;
}
}
public function GetParams()
{
$result = array(array());
switch($this -> m_ItemType)
{
case 0:
{
for($i = 0; $i < count (self::$s_WeaponStatNames); $i++)
{
$result[$i] =
array(self::$s_WeaponStatNames[$i] => $this -> m_CurStatParams[$i]);
}
}
break;
case 1:
{
for($i = 0; $i < count (self::$s_EquipmentStatNames); $i++)
{
$result[$i] =
array(self::$s_EquipmentStatNames[$i] => $this -> m_CurStatParams[$i]);
}
}
break;
case 2:
{
for($i = 0; $i < count (self::$s_ShieldStatNames); $i++)
{
$result[$i] =
array(self::$s_ShieldStatNames[$i] => $this -> m_CurStatParams[$i]);
}
}
break;
case 3:
{
for($i = 0; $i < count (self::$s_AccessoryStatNames); $i++)
{
$result[$i] =
array(self::$s_AccessoryStatNames[$i] => $this -> m_CurStatParams[$i]);
}
}
break;
}
return $result;
}
}
class CItemClass
{
static $s_Instance;
private function __construct()
{
}
protected function __clone()
{
}
static public function Instance()
{
if(is_null(self::$s_Instance))
{
self::$s_Instance = new self();
}
return self::$s_Instance;
}
public function PercentageFromBitvalue($bitvalue)
{
return round(($bitvalue * 100 / 31) - 0.5 , 0);
}
public function GetVarianceDump($variance, $item_type_id)
{
$result = null;
$g_Item = new CItemInfo($item_type_id);
$n = 0;
$nParams = $g_Item -> GetParamCountForItem();
while($n < $nParams)
{
$cur_stat = $variance & 0x1F;
$g_Item -> AddParam($this -> PercentageFromBitvalue($cur_stat));
$variance >>= 5;
$n++;
}
//print_r($g_Item -> GetParams());
return $g_Item -> GetParams();
}
}
?>
Usage example:
[get_whitestats.php]
<html>
<head>
<title>ohai squirl</title>
</head>
<body>
<center>
<table border = '1' cellspacing = '2' cellpadding = '2'>
<form method='post'>
<td>Variance</td><td><input type='text' name='variance'></td><tr/>
<td>ItemType</td>
<td>
<select name = 'item_type'>
<option value='0'>Weapon</option>
<option value='1'>Armor</option>
<option value='2'>Shield</option>
<option value='3'>Accessory</option>
</select>
</td>
<td><input type='submit' value='Gib meh'></td>
</form>
</table>
</center>
</body>
</html>
<?php
if(!empty($_POST['variance']))
{
include('item_stats.class.php');
$instance = CItemClass::Instance();
//$a = (long) ($_POST['variance']);
print_r(
$instance -> GetVarianceDump((float)($_POST['variance']), $_POST['item_type'])
);
}
?>
Thursday, July 24, 2014
Work in progress on srSquirrelMod
Hello there. I would like to let you know I'm currently working on a new silkroad gameserver addon (at the moment only for v188 server files). Yes, its going to be for sale only. If you want to buy it, feel free to add me at skype - viral.leet . This post will be updated with latest news about the development. Please note you can post feature requirements in comments to this post or directly in skype (viral.leet) . Best suggestors will get the addon for free.
Current common.ini configuration file:
; srSquirrelMod configuration file [ver 0.0.1] - common.ini
;---------------------------------------------------------------------
[player]
;Character maximum level (both ch/eu)
char_max_level=110
;Character maximum mastery (ch only)
char_ch_max_mastery=360
;Disable mastery limit for eu characters (1 = yes, 0 = no)
;This means mastery limit for european chars will always be char_max_level * 2
char_eu_mastery_nolimit=1
;---------------------------------------------------------------------
[pet]
;Pet maximum level (attack pets)
pet_max_level=110
;---------------------------------------------------------------------
[fixes]
;Fix rates limit (let GS read rates over 2.5x) (1 = yes, 0 = no)
fix_rates=1
;Disable green book (1 = yes, 0 = no)
disable_green_book=1
;Disable gs writing log messages to its window (1 = yes, 0 = no)
disable_window_msg=1
;Disable BSOBJ msgbox (appears on GS load, when there are DB errors usually) (1 = yes, 0 = no)
disable_bsobj_msgbox=1
;Disable char stuff logging into LOG DB (1 = yes, 0 = no)
disable_char_log_db=1
;Disable fortress stuff logging into LOG DB (1 = yes, 0 = no)
disable_fort_log_db=1
;Disable item stuff logging into LOG DB (1 = yes, 0 = no)
disable_item_log_db=1
;Disable event stuff logging into LOG DB (1 = yes, 0 = no)
disable_event_log_db=1
;Disable schedule stuff logging into LOG DB (1 = yes, 0 = no)
disable_schedule_log_db=1
;Disable dump file creation - 1st handler
disable_dump_creation_first=1
;Disable dump file creation - 2nd handler
disable_dump_creation_second=1
;---------------------------------------------------------------------
Current common.ini configuration file:
; srSquirrelMod configuration file [ver 0.0.1] - common.ini
;---------------------------------------------------------------------
[player]
;Character maximum level (both ch/eu)
char_max_level=110
;Character maximum mastery (ch only)
char_ch_max_mastery=360
;Disable mastery limit for eu characters (1 = yes, 0 = no)
;This means mastery limit for european chars will always be char_max_level * 2
char_eu_mastery_nolimit=1
;---------------------------------------------------------------------
[pet]
;Pet maximum level (attack pets)
pet_max_level=110
;---------------------------------------------------------------------
[fixes]
;Fix rates limit (let GS read rates over 2.5x) (1 = yes, 0 = no)
fix_rates=1
;Disable green book (1 = yes, 0 = no)
disable_green_book=1
;Disable gs writing log messages to its window (1 = yes, 0 = no)
disable_window_msg=1
;Disable BSOBJ msgbox (appears on GS load, when there are DB errors usually) (1 = yes, 0 = no)
disable_bsobj_msgbox=1
;Disable char stuff logging into LOG DB (1 = yes, 0 = no)
disable_char_log_db=1
;Disable fortress stuff logging into LOG DB (1 = yes, 0 = no)
disable_fort_log_db=1
;Disable item stuff logging into LOG DB (1 = yes, 0 = no)
disable_item_log_db=1
;Disable event stuff logging into LOG DB (1 = yes, 0 = no)
disable_event_log_db=1
;Disable schedule stuff logging into LOG DB (1 = yes, 0 = no)
disable_schedule_log_db=1
;Disable dump file creation - 1st handler
disable_dump_creation_first=1
;Disable dump file creation - 2nd handler
disable_dump_creation_second=1
;---------------------------------------------------------------------
Saturday, June 14, 2014
HTC Desire 310 random crash / soft reboot problem - solved
Hello there. Few days ago i bought a brand new HTC Desire 310 phone, and in few days i met a pretty interesting issue - my phone was randomly crashing (rebooting) time to time on various actions. I was even thinking about getting a new phone using my warranty card, but then I found a simple solution in about 5 minutes of actually being non-lazy, lol. The problem is the default screen lock on this phone (prolly, firmware fault). This problem is easily solved by going to
Settings -> Security -> Screen lock
and setting your Screen lock to anything but not Slide :). I've seen people with this problem around, and here is the solution. I hope HTC takes care of this issue in the next firmware update.
Settings -> Security -> Screen lock
and setting your Screen lock to anything but not Slide :). I've seen people with this problem around, and here is the solution. I hope HTC takes care of this issue in the next firmware update.
Tuesday, May 20, 2014
Announcing .NET Native Preview
Wow, that sounds nice... Microsoft announced .NET Native compiler and I didnt even know until today ?! Anyway, here is the article from msdn:
http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx
http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx
Tuesday, March 4, 2014
Back to work on mu2core MU2 C# (.NET 4.0) server emulator
So, finally I have free time to work on the project I started some time ago - mu2 server emulator writen on c#, .NET Framework v4.0 :). I was expecting a new client version released at ragezone or any other places so I can see if there are any new features and stuff, but seems like it's ok to work on the current client. News / screenshots coming soon.
Sunday, January 12, 2014
The story of 1000 and 1 squirrel
Once upon a time a little squirrel lived. It had a great hollow and had a huge bunch of nuts. Once a little squirrel woke up, and noticed all her nuts have disappeared and there was a little note left in the place she stored them. "Im evil squirrel nut stealer, come and take your nuts or you will die because of hunger"... Squirrel had nothing else to do than finding out where Tyrael (the name which was writen at the back side of the note) lives at. So she went to the squirrel air force base and asked if someone knows him. When squirrel army knew about the issue, they initiated the Red Nut code war sequence. Over 15 air carriers including "Admiral Squirrelish", 8000 jets (Squirrel-Pak-Sukhoi T350) and 500 000 troops were involved in this operation. Operation did succeed. Next day after Tyrael was found, squirrels had to build a time machine to travel back to ancient china where the Tyrael was found, but only 10 squirrels could pass the gate between dimensions. The robbered squirrel came as one of them. When they appeared near ancient China Jangan, squirrels were really confused - walking monsters made of grass, lots of trees with no nuts at all. After few days of searching, they finally found the lair of Tyrael. It was made of stone and squirrel furs. It was just terrible to see for our dear squirrel warriors. Squirrels entered the lair, and saw Tyrael sitting on he's throne. Robbered squirrel came close and said, "You will pay for what you have done !". The epic battle began. After 30 minutes of battle 9 of 10 squirrels have died with great glory. Only one squirrel left, and it was the one which got robbered. Then our dear squirrel decided to use the ancient technique named "The fatality of 1 000 000 squirrels", and used the scroll which summoned them. Then they tool Tyraels nuts and shared them on 1000 and 1 peaces. Each of the peaces was actually a portal to the future. Squirrels rubbed the parts of hes balls and moved back to the future where there was no single squirrel robbered, threatened or kidnapped ever. The perfect world with no war.
Tuesday, January 7, 2014
ZeonProxy - A small, asynchronous proxy writen at c# (.NET 4.0)
Here is my new little tool writen to prevent small DoS / DDoS attacks (or just relaying traffic through). ZeonProxy is a program (asynchronous proxy) which allows you to limit bytes per second / packets per second going through it to your destination host/port. The logic is simple - user (client) connects to proxy, and proxy connects to remote host/port. All traffic goes through the proxy, so, it can easily set the limits for it. ZeonProxy supports multiple relays.
Sources are included (c#, .NET 4.0)
Version 1.0.5
Sources are included (c#, .NET 4.0)
Version 1.0.5
Subscribe to:
Comments (Atom)




