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 .











All Articles