Unity3dでのリバースエンジニアリングとパッチゲーム

この記事は、経験のない読者を対象としています。 ハッキングや「悪い」パッチの説明は含まれていません。

まえがき


Unity3dエンジン上に構築されたUnturnedというゲームに出会ったことがあります。 後に、彼女には欠陥がないわけではないことが判明しました。 これはアルファ版であるため、サーバーは別のキャラクターの殺害についてプレイヤーに通知することすらしません。これは、PvPバトルでは便利ではありませんでした。 このケースの前は、Cileアプリケーション、特にUnityのリバースエンジニアリングの経験がありませんでした。

必要なソフトウェア




プログラムを開きます


興味のあるコードはAssembly-CSharp.dllファイルにあります。
ためらうことなく、dotPeekで開き、次のように表示します。

画像

すべてのコードを逆コンパイルし、プロジェクトをスタジオにロードして、多くのエラーを取得しようとします。 Visual Studioは、1 UTF-8文字の名前を持つ一連の変数を処理できませんでした。

さて、別の方法を試してみましょう:ildasmを開いてファイルをロードし、dumpをクリックして、便利な場所に保存します。 たくさんのCILコードを入手しました。 CILコードは.NETのアセンブラーに似ていますが、はるかに簡単です。

今、あなたはそれをdllにコンパイルして戻そうとする必要があります。さもないと、さらなるアクションが無駄になります。

コンソールを開き、次のように記述します。

ilasm /DLL < /.cil>

やった! 判明した。 これで、コードを変更してコンパイルし直すことができます。
dotPeekに入り、dieを検索して特定のLife :: die()を見つけ、コードを見て、これが何かではないことを理解します。
さて、ダイ、シンボルの使用法を右クリックし、いくつかのライフに移動します::ダメージ()
引数として、この関数は文字列を受け取り、[シンボルの使用]をクリックして、たとえばshootPlayer()に移動し、コードを確認します。

string[] strArray = new string[7];
int index1 = 0;
string str2 = "You were shot in the ";
strArray[index1] = str2;
int index2 = 1;
string str3 = str1;
strArray[index2] = str3;
int index3 = 2;
string str4 = " with the ";
strArray[index3] = str4;
int index4 = 3;
string name = ItemName.getName(this.GetComponent().\u0014);
strArray[index4] = name;

int index5 = 4;
string str5 = " by ";
strArray[index5] = str5;
int index6 = 5;
string str6 = this.GetComponent().\u0841.\u0887;
strArray[index6] = str6;

int index7 = 6;
string str7 = "!";
strArray[index7] = str7;
string str8 = string.Concat(strArray);
component.damage(num2, str8);

, " DEAD ( 2)".
, shootPlayer():

NetworkTools.kick(this.networkView.owner, "Kicking " + this.name + " for cheating their ammo.");

cil:

IL_002f: ldstr "Kicking "
IL_0034: ldarg.0
IL_0035: call instance string [UnityEngine]UnityEngine.Object::get_name()
IL_003a: ldstr " for cheating their ammo."
IL_003f: call string [mscorlib]System.String::Concat(string,
string,
string)
IL_0044: call void NetworkTools::kick(valuetype [UnityEngine]UnityEngine.NetworkPlayer,
string)

.
cil "connceted."", :

call void NetworkChat::sendAlert(string)


Life::damage() CIL.
die :

ldarg.0 // 0
call instance string [UnityEngine]UnityEngine.Object::get_name() // ( )
ldstr " DEAD (" //
ldarg.2 // 2 ( )
ldstr ")" //
call string [mscorlib]System.String::Concat(string, //
string,
string,
string)
call void NetworkChat::sendAlert(string) //

ilasm, , , , .... 3 , 1- 2 .
damage() 1.
:

ldarg.1 // 1 ( )
ldc.i4.s 1 // 1
ble.s IL_0061 // IL_0061
ldarg.0 // 0
call instance string [UnityEngine]UnityEngine.Object::get_name() // ( )
ldstr " DEAD (" //
ldarg.2 // 2 ( )
ldstr ")" //
call string [mscorlib]System.String::Concat(string, //
string,
string,
string)
call void NetworkChat::sendAlert(string) //
IL_0061:


CIL .

string name = ItemName.getName(this.GetComponent().\u0014);
strArray[index4] = name;

int index5 = 4;
string str5 = " by ";
strArray[index5] = str5;
int index6 = 5;
string str6 = this.GetComponent().\u0841.\u0887;
strArray[index6] = str6;

int index7 = 6;
string str7 = "!";
strArray[index7] = str7;
string str8 = string.Concat(strArray);
component.damage(num2, str8);

, " DEAD ( 2)".
, shootPlayer():

NetworkTools.kick(this.networkView.owner, "Kicking " + this.name + " for cheating their ammo.");

cil:

IL_002f: ldstr "Kicking "
IL_0034: ldarg.0
IL_0035: call instance string [UnityEngine]UnityEngine.Object::get_name()
IL_003a: ldstr " for cheating their ammo."
IL_003f: call string [mscorlib]System.String::Concat(string,
string,
string)
IL_0044: call void NetworkTools::kick(valuetype [UnityEngine]UnityEngine.NetworkPlayer,
string)

.
cil "connceted."", :

call void NetworkChat::sendAlert(string)


Life::damage() CIL.
die :

ldarg.0 // 0
call instance string [UnityEngine]UnityEngine.Object::get_name() // ( )
ldstr " DEAD (" //
ldarg.2 // 2 ( )
ldstr ")" //
call string [mscorlib]System.String::Concat(string, //
string,
string,
string)
call void NetworkChat::sendAlert(string) //

ilasm, , , , .... 3 , 1- 2 .
damage() 1.
:

ldarg.1 // 1 ( )
ldc.i4.s 1 // 1
ble.s IL_0061 // IL_0061
ldarg.0 // 0
call instance string [UnityEngine]UnityEngine.Object::get_name() // ( )
ldstr " DEAD (" //
ldarg.2 // 2 ( )
ldstr ")" //
call string [mscorlib]System.String::Concat(string, //
string,
string,
string)
call void NetworkChat::sendAlert(string) //
IL_0061:


CIL .

string name = ItemName.getName(this.GetComponent().\u0014);
strArray[index4] = name;

int index5 = 4;
string str5 = " by ";
strArray[index5] = str5;
int index6 = 5;
string str6 = this.GetComponent().\u0841.\u0887;
strArray[index6] = str6;

int index7 = 6;
string str7 = "!";
strArray[index7] = str7;
string str8 = string.Concat(strArray);
component.damage(num2, str8);

, " DEAD ( 2)".
, shootPlayer():

NetworkTools.kick(this.networkView.owner, "Kicking " + this.name + " for cheating their ammo.");

cil:

IL_002f: ldstr "Kicking "
IL_0034: ldarg.0
IL_0035: call instance string [UnityEngine]UnityEngine.Object::get_name()
IL_003a: ldstr " for cheating their ammo."
IL_003f: call string [mscorlib]System.String::Concat(string,
string,
string)
IL_0044: call void NetworkTools::kick(valuetype [UnityEngine]UnityEngine.NetworkPlayer,
string)

.
cil "connceted."", :

call void NetworkChat::sendAlert(string)


Life::damage() CIL.
die :

ldarg.0 // 0
call instance string [UnityEngine]UnityEngine.Object::get_name() // ( )
ldstr " DEAD (" //
ldarg.2 // 2 ( )
ldstr ")" //
call string [mscorlib]System.String::Concat(string, //
string,
string,
string)
call void NetworkChat::sendAlert(string) //

ilasm, , , , .... 3 , 1- 2 .
damage() 1.
:

ldarg.1 // 1 ( )
ldc.i4.s 1 // 1
ble.s IL_0061 // IL_0061
ldarg.0 // 0
call instance string [UnityEngine]UnityEngine.Object::get_name() // ( )
ldstr " DEAD (" //
ldarg.2 // 2 ( )
ldstr ")" //
call string [mscorlib]System.String::Concat(string, //
string,
string,
string)
call void NetworkChat::sendAlert(string) //
IL_0061:


CIL .

string name = ItemName.getName(this.GetComponent().\u0014);
strArray[index4] = name;

int index5 = 4;
string str5 = " by ";
strArray[index5] = str5;
int index6 = 5;
string str6 = this.GetComponent().\u0841.\u0887;
strArray[index6] = str6;

int index7 = 6;
string str7 = "!";
strArray[index7] = str7;
string str8 = string.Concat(strArray);
component.damage(num2, str8);

, " DEAD ( 2)".
, shootPlayer():

NetworkTools.kick(this.networkView.owner, "Kicking " + this.name + " for cheating their ammo.");

cil:

IL_002f: ldstr "Kicking "
IL_0034: ldarg.0
IL_0035: call instance string [UnityEngine]UnityEngine.Object::get_name()
IL_003a: ldstr " for cheating their ammo."
IL_003f: call string [mscorlib]System.String::Concat(string,
string,
string)
IL_0044: call void NetworkTools::kick(valuetype [UnityEngine]UnityEngine.NetworkPlayer,
string)

.
cil "connceted."", :

call void NetworkChat::sendAlert(string)


Life::damage() CIL.
die :

ldarg.0 // 0
call instance string [UnityEngine]UnityEngine.Object::get_name() // ( )
ldstr " DEAD (" //
ldarg.2 // 2 ( )
ldstr ")" //
call string [mscorlib]System.String::Concat(string, //
string,
string,
string)
call void NetworkChat::sendAlert(string) //

ilasm, , , , .... 3 , 1- 2 .
damage() 1.
:

ldarg.1 // 1 ( )
ldc.i4.s 1 // 1
ble.s IL_0061 // IL_0061
ldarg.0 // 0
call instance string [UnityEngine]UnityEngine.Object::get_name() // ( )
ldstr " DEAD (" //
ldarg.2 // 2 ( )
ldstr ")" //
call string [mscorlib]System.String::Concat(string, //
string,
string,
string)
call void NetworkChat::sendAlert(string) //
IL_0061:


CIL .

string name = ItemName.getName(this.GetComponent().\u0014);
strArray[index4] = name;

int index5 = 4;
string str5 = " by ";
strArray[index5] = str5;
int index6 = 5;
string str6 = this.GetComponent().\u0841.\u0887;
strArray[index6] = str6;

int index7 = 6;
string str7 = "!";
strArray[index7] = str7;
string str8 = string.Concat(strArray);
component.damage(num2, str8);

, " DEAD ( 2)".
, shootPlayer():

NetworkTools.kick(this.networkView.owner, "Kicking " + this.name + " for cheating their ammo.");

cil:

IL_002f: ldstr "Kicking "
IL_0034: ldarg.0
IL_0035: call instance string [UnityEngine]UnityEngine.Object::get_name()
IL_003a: ldstr " for cheating their ammo."
IL_003f: call string [mscorlib]System.String::Concat(string,
string,
string)
IL_0044: call void NetworkTools::kick(valuetype [UnityEngine]UnityEngine.NetworkPlayer,
string)

.
cil "connceted."", :

call void NetworkChat::sendAlert(string)


Life::damage() CIL.
die :

ldarg.0 // 0
call instance string [UnityEngine]UnityEngine.Object::get_name() // ( )
ldstr " DEAD (" //
ldarg.2 // 2 ( )
ldstr ")" //
call string [mscorlib]System.String::Concat(string, //
string,
string,
string)
call void NetworkChat::sendAlert(string) //

ilasm, , , , .... 3 , 1- 2 .
damage() 1.
:

ldarg.1 // 1 ( )
ldc.i4.s 1 // 1
ble.s IL_0061 // IL_0061
ldarg.0 // 0
call instance string [UnityEngine]UnityEngine.Object::get_name() // ( )
ldstr " DEAD (" //
ldarg.2 // 2 ( )
ldstr ")" //
call string [mscorlib]System.String::Concat(string, //
string,
string,
string)
call void NetworkChat::sendAlert(string) //
IL_0061:


CIL .

Source: https://habr.com/ru/post/J234101/


All Articles