From 0cb9d28feefc54cad8d7173c3cc9f65e95b49019 Mon Sep 17 00:00:00 2001 From: heqyou_free Date: Fri, 23 Aug 2019 16:21:53 +0800 Subject: [PATCH] init --- ModifyBH.csproj | 13 + Program.cs | 487 +++++++++++++++++++++ README.md | 40 ++ Rsa.cs | 63 +++ lib/UnityAssetBundleTool.dll | Bin 0 -> 102400 bytes package.json | 23 + rule.js | 60 +++ "\345\210\235\345\247\213\345\214\226.bat" | 3 + "\345\220\257\345\212\250.bat" | 4 + 9 files changed, 693 insertions(+) create mode 100644 ModifyBH.csproj create mode 100644 Program.cs create mode 100644 README.md create mode 100644 Rsa.cs create mode 100644 lib/UnityAssetBundleTool.dll create mode 100644 package.json create mode 100644 rule.js create mode 100644 "\345\210\235\345\247\213\345\214\226.bat" create mode 100644 "\345\220\257\345\212\250.bat" diff --git a/ModifyBH.csproj b/ModifyBH.csproj new file mode 100644 index 0000000..b92f669 --- /dev/null +++ b/ModifyBH.csproj @@ -0,0 +1,13 @@ + + + + Exe + netcoreapp2.2 + + + + .\lib\UnityAssetBundleTool.dll + + + + diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..0377263 --- /dev/null +++ b/Program.cs @@ -0,0 +1,487 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO; +using System.Net; +using System.Security.Cryptography; +using System.Text.RegularExpressions; +using UABT; +using bh3tool; +using System.Threading; +using System.Diagnostics; + +namespace ModifyBH +{ + class Program + { + public static DateTime oldTime; + public static bool firstUpdate_a = true; + public static bool firstUpdate_i = true; + Dictionary mod_servers = new Dictionary + { + { "android01", new Server_modinfo(Gameserver.android01) }, + { "bb01", new Server_modinfo(Gameserver.bb01) }, + { "hun01", new Server_modinfo(Gameserver.hun01) }, + { "hun02", new Server_modinfo(Gameserver.hun02) }, + { "ios01", new Server_modinfo(Gameserver.ios01) }, + { "yyb01", new Server_modinfo(Gameserver.yyb01) } + }; + + static void Main(string[] args) + { + Console.WriteLine("bh3tool is running"); + oldTime = DateTime.Now; + + Timer timer = new Timer(new TimerCallback((o) => { + Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "[FileUpdate] It is time to update"); + ModFile(true, false); + GC.Collect(); + ModFile(true, true); + GC.Collect(); + }), null, 0, 900 * 1000); + while (true) + { + string s = Console.ReadLine(); + if (s == "exit") + { + return; + } + if (s == "update") + { + ModFile(true, false); + GC.Collect(); + ModFile(true, true); + GC.Collect(); + } + } + } + + public static void Update () + { + + + } + bool Getseverinfo(string se) + { + //用于匹配数据的正则 + Regex reg_serverurl = new Regex("(dispatch_url\":\")(.*?)\""); + Regex reg_gameserver = new Regex("(gameserver\":)(\\{.*?\\})"); + Regex reg_geteway = new Regex("(gateway\":)(\\{.*?\\})"); + Regex reg_oaserver = new Regex("(oaserver_url\":)(\".*?\")"); + + WebClient client = new WebClient(); + try + { + //note version number + string version = "?version=3.3.0_" + GetserverStr(mod_servers[se].server); + string globaleDispatchUrl = "http://global1.bh3.com/query_dispatch" + version; + + string rsp = client.DownloadString(globaleDispatchUrl); + //get dispatch_url + string dispatch_url = reg_serverurl.Match(rsp).Groups[2].Value; + + string qserverurl = dispatch_url + version; + //get server rsponse + string qrsp = client.DownloadString(qserverurl); + //match server ip + string gameserver = reg_gameserver.Match(qrsp).Groups[2].Value; + string getway = reg_geteway.Match(qrsp).Groups[2].Value; + string oa = reg_oaserver.Match(qrsp).Groups[2].Value; + + mod_servers[se].gameserver_url = dispatch_url; + mod_servers[se].gameserver_rsp = qrsp; + mod_servers[se].server_ip = gameserver; + mod_servers[se].getway_ip = getway; + mod_servers[se].oa_ip = oa; + //Replace "https" with "http" + mod_servers[se].mod_gameserver_rsp = qrsp.Replace("https://bundle.bh3.com", "http://bundle.bh3.com"); + } + catch + { + return false; + } + return true; + } + string GetserverStr(Gameserver server) + { + switch (server) + { + case Gameserver.android01: return "gf_android"; + case Gameserver.bb01: return "bilibili"; + case Gameserver.hun01: return "oppo"; + case Gameserver.hun02: return "xiaomi"; + case Gameserver.ios01: return "gf_ios"; + case Gameserver.yyb01: return "tencent"; + default: return "gf_android"; + } + + } + public static void ModFile(bool forceUpdate, bool isIOS) + { + if (firstUpdate_a) + { + forceUpdate = true; + firstUpdate_a = false; + } else + { + if (firstUpdate_i) + { + forceUpdate = true; + firstUpdate_i = false; + } + } + Console.WriteLine("--------------------------------------------------------"); + Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "[FileUpdate] Updating " + (isIOS ? "IOS" : "Android")); + //file url + string baseurl = isIOS ? "https://bundle.bh3.com/asset_bundle/ios01/1.0" : "https://bundle.bh3.com/asset_bundle/android01/1.0"; + string settingurl = isIOS ? "/data/iphone_compressed/data/setting_" : "/data/android_compressed/data/setting_"; + string excelurl = isIOS ? "/data/iphone_compressed/data/excel_output_" : "/data/android_compressed/data/excel_output_"; + string dataurl = isIOS ? "/data/iphone_compressed/DataVersion.unity3d" : "/data/android_compressed/DataVersion.unity3d"; + + string RSAkey = @"rXoKWm82JSX4UYihkt2FSjrp3pZqTxt6AyJ0ZexHssStYesCFuUOmDBrk0nxPTY2r7oB4ZC9tDhHzmA66Me56wkD47Z3fCEBfLFxmEVdUCvM1RIFdQxQCB7CMaFWXHoVfBhNcD60OtXD71vFusBLioa6HDHbKk8LdgWdV10OWaE=EQ==

16GiwrgCGvcYbgSZOBJRx4G9kioGgexLSyW62iK4EuT0Xu9xyflBDaC4yooFkxrflqEAIiEfTqNGlYeJks+5qw==

zfQY4dWi/Dlo38y6xvX4pUEAj1hbeFo/Qiy7H00P089W0KC6Mdi+GY4UuRGJtgX7UZfGQdHRj8mBjijFyhUl4w==cihlOejyDkaUdnrntEXvD0Svp7vlU9dzJ8iuNz+OoJdUMkKHiQt8yvq8Lv3Gt0p2Xs20xsY9wDhSi2Xfa9diSw==GDrVwDdAWeii7SclCFksT61LXCiDO1XpUxRSP+ryzZ/sGIthMwpwt7ZcynqIrAC0J7eAvHMJmHIPPeat24oEdQ==P4/vgq1XF77N8K/OxTbcjWFCC1d+v3W5xWQJbmU3KfVF2wOStZeILT2X12s7AHD+uUfN9O/xdEBIeqcSLVxWjw==o0WvZCxvMgWeatrybBvIvlWQ0X6CLFYYe2u42GXpILkbp3PFuzHvnkuwip/yG35RllS2efGjfHE0hgA3cazrNgM6gBDcFa7iznviIiQTySxFuzy3mXpjSQFaGgdvmuUQLgg5qahcdGgT455Fzo5GSu+IyTpD+dNoKy79NLTbvjE=
"; + + WebClient client = new WebClient(); + //Download DataVersion.unity3d. + byte[] dataversion = client.DownloadData(baseurl + dataurl); + string[] key = client.ResponseHeaders.AllKeys; + //Check Last-Modified time. + DateTime time = new DateTime(0); + for (int i = 0; i < key.Length; i++) + { + if (key[i] == "Last-Modified") + { + time = DateTime.Parse(client.ResponseHeaders.Get(i)); + } + } + if (!forceUpdate) + { + bool a = DateTime.Compare(oldTime, time) >= 0; + if (a) + { + Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "[FileUpdate] No update"); + return; + } + } + + Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "[FileUpdate] Start update"); + + Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "[FileUpdate] edit dataversion.unity3d"); + + //Decrypt DataVersion.unity3d + for (int i = 0; i < dataversion.Length; i++) dataversion[i] = (byte)(dataversion[i] ^ 0xA5); + //load bundle asset + BundleFile dataversionBundle = new BundleFile(dataversion); + SerializedFile dataversionFile = new SerializedFile("dataversion", new EndianBinaryReader(dataversionBundle.fileList[0].stream)); + //get textasset bytes + long Pid = dataversionFile.GetPathIDByName("packageversion.txt"); + var packageversion = dataversionFile.m_Objects.Find(x => x.m_PathID == Pid); + //load textasset + Textasset textasset = new Textasset(packageversion.data); + + string[] versiontext = textasset.text.Split('\n'); + //Get AES key IV and HMACSHA1 key + var rsa = RSA.Create(); + rsa.FromXmlStringA(RSAkey); + byte[] AES_SHA = rsa.Decrypt(Hex2bytes(versiontext[0]), RSAEncryptionPadding.Pkcs1); + //AES_SHA 56 bytes, AES key 32 bytes|AES IV 16 bytes|HMACSHA1 8 bytes + byte[] AESkey = AES_SHA.Take(32).ToArray(); + byte[] AESIV = AES_SHA.Skip(32).Take(16).ToArray(); + byte[] SHA = AES_SHA.Skip(48).Take(8).ToArray(); + + Regex regexCS = new Regex("(CS\":\")([1-9]\\d*)"); + Regex regexCRC = new Regex("(CRC\":\")([0-9A-Z]*)"); + + string settingCRC; + string excelCRC; + int settingindex; + int excelindex; + //Get File CRC + if (versiontext[1].Contains("excel_output")) + { + excelindex = 1; + settingindex = 2; + } + else + { + excelindex = 2; + settingindex = 1; + } + excelCRC = regexCRC.Match(versiontext[excelindex]).Groups[2].Value; + settingCRC = regexCRC.Match(versiontext[settingindex]).Groups[2].Value; + + + //Download setting.unity3d and excel_output.unity3d + Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "[FileUpdate] download setting"); + byte[] settingbytes = client.DownloadData(baseurl + settingurl + settingCRC); + Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "[FileUpdate] download excel_output"); + byte[] excelbytes = client.DownloadData(baseurl + excelurl + excelCRC); + client.Dispose(); + + GC.Collect(); + + //Decrypt File + Aes Aes = Aes.Create(); + var AES_Encryptor = Aes.CreateEncryptor(AESkey, AESIV); + + var AES_Decryptor = Aes.CreateDecryptor(AESkey, AESIV); + settingbytes = AES_Decryptor.TransformFinalBlock(settingbytes, 0, settingbytes.Length); + + AES_Decryptor = Aes.CreateDecryptor(AESkey, AESIV); + excelbytes = AES_Decryptor.TransformFinalBlock(excelbytes, 0, excelbytes.Length); + + #region Modify setting.unity3d + + Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "[FileUpdate] edit setting"); + + BundleFile settingBundle = new BundleFile(settingbytes); + SerializedFile setting = new SerializedFile("setting", new EndianBinaryReader(settingBundle.fileList[0].stream)); + + #region Edit miscdata.txt + //Get miscdata.txt from bundle + long miscid = setting.GetPathIDByName("miscdata.txt"); + var misc = setting.m_Objects.Find(x => x.m_PathID == miscid); + Textasset miscasset = new Textasset(misc.data); + //Enable All BodyPort Touch + Regex regexMISC = new Regex("(Face|Chest|Private|Arm|Leg)(\" *\t*: )(false)"); + miscasset.text = regexMISC.Replace(miscasset.text, "$1$2true"); + misc.data = miscasset.GetBytes(); + #endregion + + #region Edit uiluadesign_x_x.lua.txt + //version number + long uiluaid = setting.GetPathIDByName("uiluadesign_3_3.lua.txt"); + var uilua = setting.m_Objects.Find(x => x.m_PathID == uiluaid); + Textasset uiluaasset = new Textasset(uilua.data); + //insert Lua code to function UITable.ModuleEndHandlePacket + List list = new List(uiluaasset.text.Split('\n')); + int index = list.FindIndex(x => x.Contains("UITable.ModuleEndHandlePacket")); + //Handle NetPacketV1 for GalTouchModule,and set GalTouchModule._canGalTouch to true + string insertStr = "\tif moduleName == \"GalTouchModule\" and packet:getCmdId() == 111 then\n\t\tlocal gal = __singletonManagerType.GetSingletonInstance(\"MoleMole.GalTouchModule\")\n\t\tif gal == nil then\n\t\t\treturn\n\t\tend\n\t\tgal._canGalTouch = true\n\tend\n"; + list.Insert(index + 1, insertStr); + uiluaasset.text = String.Join("\n", list); + uilua.data = uiluaasset.GetBytes(); + #endregion + + #region Edit luahackconfig.txt + //Add "GalTouchModule" to "UILuaPatchModuleList" + long luahackpid = setting.GetPathIDByName("luahackconfig.txt"); + var luahack = setting.m_Objects.Find(x => x.m_PathID == luahackpid); + Textasset hack = new Textasset(luahack.data); + string inserthack = " \"GalTouchModule\","; + list = new List(hack.text.Split('\n')); + index = list.FindIndex(x => x.Contains("UILuaPatchModuleList")); + list.Insert(index + 2, inserthack); + hack.text = string.Join("\n", list); + luahack.data = hack.GetBytes(); + #endregion + + //pack to assetbundle + misc.data = miscasset.GetBytes(); + settingBundle.fileList[0].stream = new MemoryStream(setting.Pack()); + settingbytes = settingBundle.RePack(); + //ENCRYPT + settingbytes = AES_Encryptor.TransformFinalBlock(settingbytes, 0, settingbytes.Length); + #endregion + + GC.Collect(); + + #region Edit excel_output.unity3d + // + Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "[FileUpdate] edit excel"); + + BundleFile excelBundle = new BundleFile(excelbytes); + SerializedFile excel = new SerializedFile("excel", new EndianBinaryReader(excelBundle.fileList[0].stream)); + //Edit touch buff + long touchbuffid = excel.GetPathIDByName("touchbuffdata.asset"); + var bf = excel.m_Objects.Find(x => x.m_PathID == touchbuffid); + bf.data = TouchBuff.GetNew(bf.data); + excelBundle.fileList[0].stream = new MemoryStream(excel.Pack()); + excelbytes = excelBundle.RePack(); + //Encrypt excel_output.unity3d + AES_Encryptor = Aes.CreateEncryptor(AESkey, AESIV); + excelbytes = AES_Encryptor.TransformFinalBlock(excelbytes, 0, excelbytes.Length); + #endregion + + GC.Collect(); + + Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "[FileUpdate] edit dataversion"); + + //compute new CRC(hmac-SHA1) + HMACSHA1 hMACSHA1 = new HMACSHA1(SHA); + settingCRC = BitConverter.ToString(hMACSHA1.ComputeHash(settingbytes)).Replace("-", ""); + excelCRC = BitConverter.ToString(hMACSHA1.ComputeHash(excelbytes)).Replace("-", ""); + + //Replace fileSize("CS") and SHA1("CRC") + versiontext[excelindex] = regexCRC.Replace(versiontext[1], "CRC\":\"" + excelCRC); + versiontext[excelindex] = regexCS.Replace(versiontext[1], "CS\":\"" + excelbytes.Length.ToString()); + versiontext[settingindex] = regexCRC.Replace(versiontext[2], "CRC\":\"" + settingCRC); + versiontext[settingindex] = regexCS.Replace(versiontext[2], "CS\":\"" + settingbytes.Length.ToString()); + + //string[] to string + textasset.text = string.Join("\n", versiontext); + //get textasset bytes + packageversion.data = textasset.GetBytes(); + //pack + dataversionBundle.fileList[0].stream = new MemoryStream(dataversionFile.Pack()); + byte[] dz = dataversionBundle.RePack(); + //encrypt dataversion.unity3d + for (int i = 0; i < dz.Length; i++) dz[i] = (byte)(dz[i] ^ 0xA5); + Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "[FileUpdate] Update file success"); + ByteToFile(dz, isIOS ? "i_DataVersion.unity3d" : "a_DataVersion.unity3d"); + ByteToFile(excelbytes, isIOS ? "i_excel_output.unity3d" : "a_excel_output.unity3d"); + ByteToFile(settingbytes, isIOS ? "i_setting.unity3d" : "a_setting.unity3d"); + GC.Collect(); + } + + /// + /// HEX string to byte[] + /// + /// + /// + private static byte[] Hex2bytes(string hex) + { + int ver = hex.Length / 2; + byte[] data = new byte[ver]; + for (int i = 0; i < ver; i++) + { + data[i] = (byte)Convert.ToInt32(hex.Substring(i * 2, 2), 16); + } + return data; + } + + public static bool ByteToFile(byte[] byteArray, string fileName) + { + bool result = false; + try + { + using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write)) + { + fs.Write(byteArray, 0, byteArray.Length); + result = true; + } + } + catch + { + result = false; + } + return result; + } + } + /// + /// edit touch buff + /// + class TouchBuff + { + static readonly int buffId = 6; + static string effect = "EmotionBuff_01"; + static string buffDetail = "TouchBuff_SKL_CHG"; + static float param1 = 0.0299999993f; + static float param1Add = 0.00999999978f; + + static public byte[] GetNew(byte[] data) + { + MemoryStream stream = new MemoryStream(data); + BinaryReader reader = new BinaryReader(stream); + reader.BaseStream.Position = 0x30; + int count = reader.ReadInt32(); + EndianBinaryWriter writer = new EndianBinaryWriter(new MemoryStream(), EndianType.LittleEndian); + reader.BaseStream.Position = 0; + byte[] header = new byte[0x34]; + reader.BaseStream.Read(header, 0, header.Length); + writer.Write(header); + for (int i = 0; i < count; i++) + { + writer.Write(buffId); + writer.WriteAlignedString(effect); + writer.WriteAlignedString(buffDetail); + writer.Write(param1); + writer.Write(0); + writer.Write(0); + writer.Write(param1Add); + writer.Write(0); + writer.Write(0); + } + byte[] output = new byte[writer.BaseStream.Length]; + writer.BaseStream.Position = 0; + writer.BaseStream.Read(output, 0, output.Length); + return output; + } + } + + /// + /// unity TextAsset + /// + class Textasset + { + public string name; + public string text; + /// + /// TextAsset + /// + /// + public Textasset(byte[] data) + { + EndianBinaryReader reader = new EndianBinaryReader(new MemoryStream(data), EndianType.LittleEndian); + name = reader.ReadAlignedString(); + text = reader.ReadAlignedString(); + } + /// + /// TextAsset to byte[] + /// + /// + public byte[] GetBytes() + { + EndianBinaryWriter writer = new EndianBinaryWriter(new MemoryStream(), EndianType.LittleEndian); + writer.WriteAlignedString(name); + writer.WriteAlignedString(text); + writer.Position = 0; + byte[] data = new byte[writer.BaseStream.Length]; + writer.BaseStream.Read(data, 0, data.Length); + return data; + } + } + + /// + /// serverinfo + /// + public class Server_modinfo + { + /// + /// Server + /// + public Gameserver server; + /// + /// Enable? + /// + public bool Enabletouch; + public string gameserver_url; + public string gameserver_rsp; + public string server_ip; + public string getway_ip; + public string oa_ip; + /// + /// modified response + /// + public string mod_gameserver_rsp; + + public Server_modinfo(Gameserver sser) + { + server = sser; + } + } + + /// + /// Server + /// + public enum Gameserver + { + android01, + ios01, + hun01, + hun02, + bb01, + yyb01 + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..56526dd --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +# ModifyBH + +本文按照原生系统来编写,非原生请自行摸索 +需要安装证书,Android 7或以上需要root(小米不能用自带的root) + +## 大致流程 +1. 设置代理 +2. 安装证书 +3. 进入游戏更新配置 + +## 代理设置 +### Wi-Fi +1. 打开设置,进入Wi-Fi +2. 长按当前Wi-Fi,点击修改(Pie以上点击当前Wi-Fi,然后点右上角的小笔) +3. 代理方式选择手动,写上代理地址和端口 +4. 保存退出 +### 流量(不推荐) +1. 打开设置,进入移动网络 +2. 展开高级菜单,进入接入点名称(APN) +3. 记住你当前的APN,然后点击右上角的加号添加APN +4. 名称随便,APN填上之前的,写上代理和端口 +5. 保存退出 + +## 安装证书 +### Android 6或以下安装方法: +1. 下载证书 +原生系统只需第2步即可,国内rom跳到第3步 +2. 直接点击下载的证书安装,证书名字随便输,用途默认 +3. 在设置中搜索“从SD卡安装”(安全/凭据储存) +4. 选择下载的证书安装,证书名字随便输,用途默认 + +### Android 7或以上安装方法(小米不能用自带的root): +1. 下载证书 +2. 重命名为 8208f87d.0 +3. 复制到 /system/etc/security/cacerts/ + +如果有Xposed的话JustTrustMe应该可以不用安装证书 + +有终端的小伙伴可以执行下面的命令来安装证书(记得mount system) +mv /sdcard/Download/rootCA.crt /system/etc/security/cacerts/8208f87d.0 diff --git a/Rsa.cs b/Rsa.cs new file mode 100644 index 0000000..47e5081 --- /dev/null +++ b/Rsa.cs @@ -0,0 +1,63 @@ +using System; +using System.IO; +using System.Security.Cryptography; +using System.Xml; + +namespace bh3tool +{ + public static class RsaExtention + { + + public static void FromXmlStringA(this RSA rsa, string xmlString) + { + RSAParameters parameters = new RSAParameters(); + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(xmlString); + if (xmlDoc.DocumentElement.Name.Equals("RSAKeyValue")) + { + foreach (XmlNode node in xmlDoc.DocumentElement.ChildNodes) + { + switch (node.Name) + { + case "Modulus": parameters.Modulus = Convert.FromBase64String(node.InnerText); break; + case "Exponent": parameters.Exponent = Convert.FromBase64String(node.InnerText); break; + case "P": parameters.P = Convert.FromBase64String(node.InnerText); break; + case "Q": parameters.Q = Convert.FromBase64String(node.InnerText); break; + case "DP": parameters.DP = Convert.FromBase64String(node.InnerText); break; + case "DQ": parameters.DQ = Convert.FromBase64String(node.InnerText); break; + case "InverseQ": parameters.InverseQ = Convert.FromBase64String(node.InnerText); break; + case "D": parameters.D = Convert.FromBase64String(node.InnerText); break; + } + } + } + else + { + throw new Exception("Invalid XML RSA key."); + } + + rsa.ImportParameters(parameters); + } + + public static string ToXmlString(this RSA rsa, bool includePrivateParameters) + { + RSAParameters parameters = rsa.ExportParameters(includePrivateParameters); + + if (includePrivateParameters) + { + return string.Format("{0}{1}

{2}

{3}{4}{5}{6}{7}
", + Convert.ToBase64String(parameters.Modulus), + Convert.ToBase64String(parameters.Exponent), + Convert.ToBase64String(parameters.P), + Convert.ToBase64String(parameters.Q), + Convert.ToBase64String(parameters.DP), + Convert.ToBase64String(parameters.DQ), + Convert.ToBase64String(parameters.InverseQ), + Convert.ToBase64String(parameters.D)); + } + return string.Format("{0}{1}", + Convert.ToBase64String(parameters.Modulus), + Convert.ToBase64String(parameters.Exponent)); + } + + } +} \ No newline at end of file diff --git a/lib/UnityAssetBundleTool.dll b/lib/UnityAssetBundleTool.dll new file mode 100644 index 0000000000000000000000000000000000000000..0c55c99797bd5700bdabdc97191de8a89fe73cae GIT binary patch literal 102400 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 z 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

%sE5C+P1IzCd;VQfMw(JfSfBVs9^| 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json new file mode 100644 index 0000000..056cb24 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "modifybh", + "version": "1.0.0", + "description": "", + "main": "anyproxy -i -r rule.js", + "directories": { + "lib": "lib" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/heqyoufree/ModifyBH.git" + }, + "author": "heqyou_free", + "license": "MIT", + "bugs": { + "url": "https://github.com/heqyoufree/ModifyBH/issues" + }, + "homepage": "https://github.com/heqyoufree/ModifyBH#readme" +} diff --git a/rule.js b/rule.js new file mode 100644 index 0000000..f3fe4e3 --- /dev/null +++ b/rule.js @@ -0,0 +1,60 @@ +const fs = require('fs') +// 免安装证书,需要合法ssl证书 +// var sslServer = '' +module.exports = { + summary: 'ModifyBH by heqyou_free', + * beforeSendRequest (requestDetail) { + if (requestDetail.url.indexOf('_compressed/DataVersion.unity3d') > -1) { + if (requestDetail.url.indexOf('android') > -1) { + return returnFileAsResponse('a_DataVersion.unity3d') + } + if (requestDetail.url.indexOf('iphone') > -1) { + return returnFileAsResponse('i_DataVersion.unity3d') + } + } + if (requestDetail.url.indexOf('excel_output_') > -1) { + if (requestDetail.url.indexOf('android') > -1) { + return returnFileAsResponse('a_excel_output.unity3d') + } + if (requestDetail.url.indexOf('iphone') > -1) { + return returnFileAsResponse('i_excel_output.unity3d') + } + } + if (requestDetail.url.indexOf('setting_') > -1) { + if (requestDetail.url.indexOf('android') > -1) { + return returnFileAsResponse('a_setting.unity3d') + } + if (requestDetail.url.indexOf('iphone') > -1) { + return returnFileAsResponse('i_setting.unity3d') + } + } + }, + * beforeSendResponse (requestDetail, responseDetail) { + // 免安装证书,要把beforeSendRequest注释掉 + // if (requestDetail.url.indexOf('query_gameserver') > -1) { + // console.log('requested gameserver') + // var newResponse = Object.assign({}, responseDetail.response) + // var json = JSON.parse(newResponse.body) + // json.asset_boundle_url = json.asset_boundle_url.replace('bundle.bh3.com', sslServer) + // var str = JSON.stringify(json) + // newResponse.body = str + // return { + // response: newResponse + // } + // } + } +} +function returnFileAsResponse (name) { + console.log(`requested ${name}`) + var resp = fs.readFileSync(`${name}`) + return { + response: { + statusCode: 200, + header: { + 'Accept-Ranges': 'bytes', + 'Content-Type': 'application/octet-stream' + }, + body: resp + } + } +} diff --git "a/\345\210\235\345\247\213\345\214\226.bat" "b/\345\210\235\345\247\213\345\214\226.bat" new file mode 100644 index 0000000..d298fc7 --- /dev/null +++ "b/\345\210\235\345\247\213\345\214\226.bat" @@ -0,0 +1,3 @@ +@echo off +npm install anyproxy -g +node cert.js \ No newline at end of file diff --git "a/\345\220\257\345\212\250.bat" "b/\345\220\257\345\212\250.bat" new file mode 100644 index 0000000..80a36b7 --- /dev/null +++ "b/\345\220\257\345\212\250.bat" @@ -0,0 +1,4 @@ +@echo off +start ModifyBH.exe +node cert.js +anyproxy -i -r rule.js \ No newline at end of file