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.
Chernobyl's blog
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
Subscribe to:
Posts (Atom)




