Research and analysis of TricksterWorkTool.exe

Newbie Spellweaver
Joined
Nov 15, 2015
Messages
36
Reaction score
15
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 Englishtt1:
 

Attachments

You must be registered for see attachments list
Newbie Spellweaver
Joined
Nov 15, 2015
Messages
36
Reaction score
15
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.

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
15
If anyone can't build the csproj file, check the Path in the "TricksterWorkTool-org-.csproj" file as it may be the cause.



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.


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
15
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.

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




do you know password?

 

Attachments

You must be registered for see attachments list
Upvote 0
Experienced Elementalist
Joined
Oct 2, 2005
Messages
234
Reaction score
48
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