Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

Research and analysis of TricksterWorkTool.exe

Newbie Spellweaver
Joined
Nov 15, 2015
Messages
36
Reaction score
14
Hi developers.:laugh:
If you are analyzing or researching "TricksterWorkTool.exe", why don't you exchange information?
However, I myself just machine-translated the contents of the file from Korean to English...
I'm working on that using Visual studio and dnspy.
I'm thinking of moving forward even a little, so I'm waiting for information.

sorry for my bad English:eek:tt1:
sample - Research and analysis of TricksterWorkTool.exe - RaGEZONE Forums
 

Attachments

You must be registered for see attachments list
Newbie Spellweaver
Joined
Nov 15, 2015
Messages
36
Reaction score
14
This time, I will upload the project file created with the help of two applications, dnSpy and ILSpy, and the sample before and after the change of [internal sealed class mod_Val] that can be seen when deploying from these two applications.
It is a decompiled version of the one that has not been translated into English yet, but the project file itself should be ready for debugging with Visual Studio 2019.

Perhaps the [eTO_GM_Client] folder must be in the same hierarchy as the project file folder to open it.

If there is something wrong with the modified sample in mod_Val, please point it out.:wink:

View attachment TrciksterWorkTool_DC_projectfile.zip

View attachment class mod_Val(base).txt

View attachment class mod_Val(Modified).txt
 

Attachments

You must be registered for see attachments list
Last edited:
Upvote 0
Newbie Spellweaver
Joined
Nov 15, 2015
Messages
36
Reaction score
14
If anyone can't build the csproj file, check the Path in the "TricksterWorkTool-org-.csproj" file as it may be the cause.

csprojpath - Research and analysis of TricksterWorkTool.exe - RaGEZONE Forums

By the way, I can connect by entering the SQL login ID and password, but the next thing that is displayed is "'uspt_select_goods_version' does not exist".
There is a table related to version called [tbl_goods_version] of [gmg_account], so I created a stored procedure that refers to this table.

Code:
USE [gmg_account]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[uspt_select_goods_version]
WITH EXECUTE AS CALLER
AS
set nocount on
set lock_timeout 10000

    select version_code, version_num, version_date, version_desc from tbl_goods_version

GO

First of all, I think that one has started, but there is one question regarding the database to connect to. I think the location in the image below should be gmg_account.

Unclear point 1 - Research and analysis of TricksterWorkTool.exe - RaGEZONE Forums
So, I will change the connection destination to gmg_account once and then proceed with the work.
If you find something wrong, please point it out.
 

Attachments

You must be registered for see attachments list
Upvote 0
Newbie Spellweaver
Joined
Nov 15, 2015
Messages
36
Reaction score
14
For reference, I will introduce the part that I referred to in dnSpy (decompiled source) when creating a stored procedure called "uspt_select_goods_version".

Code:
// TricksterWorkTool.clsChargedItem
// Token: 0x06000030 RID: 48 RVA: 0x00004740 File Offset: 0x00002940
public SqlDataReader SelectGoodsVersion(ref SqlConnection dbCon)
{
   this.sqlCmd = new SqlCommand("uspt_select_goods_version", dbCon);
   this.sqlCmd.CommandType = CommandType.StoredProcedure;
   SqlDataReader result;
   try
    {
        result = this.sqlCmd.ExecuteReader();
    }
    catch (Exception ex)
   {
       MessageBox.Show(ex.ToString());
   }
   return result;
}
Code:
// TricksterWorkTool.frmChargedItem
// Token: 0x060002C8 RID: 712 RVA: 0x0001F298 File Offset: 0x0001D498
private void LoadGoodsVersionList()
{    short num = 0;
    this.trvVersion.Nodes.Clear();
    this.trvVersion.Nodes.Add(new TreeNode("ALL"));
    clsChargedItem clsChargedItem = this.objChargedItem;
    SqlConnection cnGoodsDB = mod_Val.gCn.CnGoodsDB;
    SqlDataReader sqlDataReader = clsChargedItem.SelectGoodsVersion(ref cnGoodsDB);
    Array.Clear(this.objGoodsVersion, 0, 255);
    checked
    {
        while (sqlDataReader.Read())
        {            this.VersionIndex[(int)sqlDataReader.GetInt16(1)] = num;
            this.objGoodsVersion[(int)num] = new frmChargedItem.CGoodsVersion(sqlDataReader.GetInt16(0), sqlDataReader.GetInt16(1), sqlDataReader.GetDateTime(2), sqlDataReader.GetString(3));
            this.LatestVersion = sqlDataReader.GetInt16(1);
            this.trvVersion.Nodes[0].Nodes.Add(new TreeNode(Conversions.ToString((int)sqlDataReader.GetInt16(1)) + ". Next Patch"));
            num += 1;
        }
        sqlDataReader.Close();
    }
}
These are the above two locations.
Especially for LoadGoodsVersionList ()
Code:
This.objGoodsVersion [(int) num] = new frmChargedItem.CGoodsVersion (sqlDataReader.GetInt16 (0), sqlDataReader.GetInt16 (1), sqlDataReader.GetDateTime (2), sqlDataReader.GetString (3));
Because there is a line I thought that "tbl_goods_version"should be read in each column with a SELECT statement.



(Since no one has pointed out to the DB of the connection destination, I will continue the work with changing gmg_account.)

When I add the stored procedure "uspt_select_goods_version" mentioned above and start the program again, the message "'uspt_select_goods_ini_info' does not exist" is displayed this time.

Since there is no table such as "tbl_goods_ini" or "tbl_goods_ini_info" in the gmg_account table, create a stored procedure while referring to the decompiled source as in "uspt_select_goods_version".

The following location refers to "uspt_select_goods_ini_info".
Code:
// TricksterWorkTool.clsChargedItem
// Token: 0x06000033 RID: 51 RVA: 0x00004B24 File Offset: 0x00002D24
public DataSet SelectGoodsAll(int goods_category, int goods_category0, int goods_category1, int goods_category2, ref SqlConnection dbCon)
{
    this.sqlCmd = new SqlCommand("uspt_select_goods_ini_info", dbCon);
    this.sqlCmd.CommandType = CommandType.StoredProcedure;
    this.sqlParam = new SqlParameter();
    this.sqlParam.ParameterName =  [USER=336895]goods[/USER]_category";
    this.sqlParam.SqlDbType = SqlDbType.TinyInt;
    this.sqlParam.Direction = ParameterDirection.Input;
    this.sqlParam.Value = goods_category;
    this.sqlCmd.Parameters.Add(this.sqlParam);
    this.sqlParam = new SqlParameter();
    this.sqlParam.ParameterName =  [USER=336895]goods[/USER]_category0";
    this.sqlParam.SqlDbType = SqlDbType.TinyInt;
    this.sqlParam.Direction = ParameterDirection.Input;
    this.sqlParam.Value = goods_category0;
    this.sqlCmd.Parameters.Add(this.sqlParam);
    this.sqlParam = new SqlParameter();
    this.sqlParam.ParameterName =  [USER=336895]goods[/USER]_category1";
    this.sqlParam.SqlDbType = SqlDbType.TinyInt;
    this.sqlParam.Direction = ParameterDirection.Input;
    this.sqlParam.Value = goods_category1;
    this.sqlCmd.Parameters.Add(this.sqlParam);
    this.sqlParam = new SqlParameter();
    this.sqlParam.ParameterName =  [USER=336895]goods[/USER]_category2";
    this.sqlParam.SqlDbType = SqlDbType.TinyInt;
    this.sqlParam.Direction = ParameterDirection.Input;
    this.sqlParam.Value = goods_category2;
    this.sqlCmd.Parameters.Add(this.sqlParam);
    this.sqlDA = new SqlDataAdapter(this.sqlCmd);
    this.sqlDS = new DataSet("GoodsAllForVersion");
    DataSet result;
    try
    {
        this.sqlDA.Fill(this.sqlDS, "GoodsAllForCategory");
        result = this.sqlDS;
    }
    catch (SqlException ex)
    {
        MessageBox.Show(ex.ToString(), "SQL Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
    }
    return result;
}

And the following place displays the data in a tree.
Code:
// TricksterWorkTool.frmChargedItem
// Token: 0x060002C3 RID: 707 RVA: 0x0001E38C File Offset: 0x0001C58C
private void DisplayGoods(int Cate, int Cate0, int Cate1, int Cate2)
{
    ButtonCellType buttonCellType = new ButtonCellType();
    buttonCellType.ButtonColor = Color.LightSlateGray;
    buttonCellType.TextColor = Color.White;
    buttonCellType.Text = "DEL";
    buttonCellType.Text = "INSERT";
    this.spnGoodsSelect_Sheet1.Columns.Get(5).CellType = buttonCellType;
    this.spnGoodsSelect_Sheet1.Columns.Get(5).HorizontalAlignment = CellHorizontalAlignment.Center;
    this.spnGoodsSelect_Sheet1.Columns.Get(5).Label = " -";
    this.spnGoodsSelect_Sheet1.Columns.Get(5).VerticalAlignment = CellVerticalAlignment.Center;
    this.spnGoodsSelect_Sheet1.Columns.Get(5).Width = 70f;
    this.spncGoodsList.Sheets[0].RowCount = 0;
    SheetView sheetView = this.spncGoodsList.Sheets[0];
    clsChargedItem clsChargedItem = this.objChargedItem;
    SqlConnection cnGoodsDB = mod_Val.gCn.CnGoodsDB;
    sheetView.DataSource = clsChargedItem.SelectGoodsAll(Cate, Cate0, Cate1, Cate2, ref cnGoodsDB);
    int num = 0;
    checked
    {
        int num2 = this.spncGoodsList.Sheets[0].RowCount - 1;
        for (int i = num; i <= num2; i++)
        {
            if (Operators.ConditionalCompareObjectEqual(this.spncGoodsList.Sheets[0].GetValue(i, 12), "0", false))
            {
                this.spncGoodsList.Sheets[0].SetValue(i, 14, this.Category1[Conversions.ToInteger(Operators.SubtractObject(this.spncGoodsList.Sheets[0].GetValue(i, 13), 1)), Conversions.ToInteger(Operators.SubtractObject(this.spncGoodsList.Sheets[0].GetValue(i, 14), 1))]);
                this.spncGoodsList.Sheets[0].SetValue(i, 13, this.Category0[Conversions.ToInteger(this.spncGoodsList.Sheets[0].GetValue(i, 12)), Conversions.ToInteger(Operators.SubtractObject(this.spncGoodsList.Sheets[0].GetValue(i, 13), 1))]);
                this.spncGoodsList.Sheets[0].SetValue(i, 12, "Characters");
            }
            else
            {
                this.spncGoodsList.Sheets[0].SetValue(i, 14, this.Category1[Conversions.ToInteger(Operators.AddObject(this.spncGoodsList.Sheets[0].GetValue(i, 13), 5)), Conversions.ToInteger(Operators.SubtractObject(this.spncGoodsList.Sheets[0].GetValue(i, 14), 1))]);
                this.spncGoodsList.Sheets[0].SetValue(i, 13, this.Category0[Conversions.ToInteger(this.spncGoodsList.Sheets[0].GetValue(i, 12)), Conversions.ToInteger(Operators.SubtractObject(this.spncGoodsList.Sheets[0].GetValue(i, 13), 1))]);
                this.spncGoodsList.Sheets[0].SetValue(i, 12, "My Camp");
            }
        }
    }
}

I created a stored procedure "uspt_select_goods_ini_info" based on the above two.
Code:
USE [gmg_account]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[uspt_select_goods_ini_info]
    [USER=336895]goods[/USER]_category [tinyint],
    [USER=336895]goods[/USER]_category0 [tinyint], 
    [USER=336895]goods[/USER]_category1 [tinyint],
    [USER=336895]goods[/USER]_category2 [tinyint]
WITH EXECUTE AS CALLER
AS
set nocount on
set lock_timeout 10000
BEGIN
    select * from tbl_goods 
    where       goods_category = [USER=336895]goods[/USER]_category 
    and goods_category0 = [USER=336895]goods[/USER]_category0
    and goods_category1 = [USER=336895]goods[/USER]_category1 
    and goods_category2 = [USER=336895]goods[/USER]_category2
    END
GO

If you add the stored procedure "uspt_select_goods_ini_info",You should see a new error "System.IndexOutOfRangeException".
However, if you ignore the error and execute it, you will see a screen like this.
categorytab(but error) - Research and analysis of TricksterWorkTool.exe - RaGEZONE Forums
Now we need to resolve this error.
 

Attachments

You must be registered for see attachments list
Upvote 0
Initiate Mage
Joined
Aug 8, 2020
Messages
1
Reaction score
0
ruthstrom - Research and analysis of TricksterWorkTool.exe - RaGEZONE Forums




do you know password?

password.PNG - Research and analysis of TricksterWorkTool.exe - RaGEZONE Forums
 

Attachments

You must be registered for see attachments list
Upvote 0
Experienced Elementalist
Joined
Oct 2, 2005
Messages
234
Reaction score
47
user: ADMIN
pass:
4fv5gb6hn

user:
KOR
pass: gksrnr

user:
CHN
pass: wndrnr

user:
JPN
pass: dlfqhs

user:
TWN
pass: eoaks

user:
USA
pass: alrnr

user:
THAI
pass: xornr

user:
NTREEV
pass: ntreev
 
Upvote 0
Back
Top