ModSecret.vb 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. '由于包含加解密等安全信息,本文件中的部分代码已被删除
  2. Imports System.Net
  3. Imports System.Reflection
  4. Imports System.Security.Cryptography
  5. Friend Module ModSecret
  6. #Region "杂项"
  7. '在开源版的注册表与常规版的注册表隔离,以防数据冲突
  8. Public Const RegFolder As String = "PCLDebug"
  9. '用于微软登录的 ClientId
  10. Public Const OAuthClientId As String = ""
  11. 'CurseForge API Key
  12. Public Const CurseForgeAPIKey As String = ""
  13. Friend Sub SecretOnApplicationStart()
  14. '提升 UI 线程优先级
  15. Thread.CurrentThread.Priority = ThreadPriority.Highest
  16. '确保 .NET Framework 版本
  17. Try
  18. Dim VersionTest As New FormattedText("", Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, Fonts.SystemTypefaces.First, 96, New MyColor, DPI)
  19. Catch ex As UriFormatException '修复 #3555
  20. Environment.SetEnvironmentVariable("windir", Environment.GetEnvironmentVariable("SystemRoot"), EnvironmentVariableTarget.User)
  21. Dim VersionTest As New FormattedText("", Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, Fonts.SystemTypefaces.First, 96, New MyColor, DPI)
  22. End Try
  23. '检测当前文件夹权限
  24. Try
  25. Directory.CreateDirectory(Path & "PCL")
  26. Catch ex As Exception
  27. MsgBox($"PCL 无法创建 PCL 文件夹({Path & "PCL"}),请尝试:" & vbCrLf &
  28. "1. 将 PCL 移动到其他文件夹" & If(Path.StartsWithF("C:", True), ",例如 C 盘和桌面以外的其他位置。", "。") & vbCrLf &
  29. "2. 删除当前目录中的 PCL 文件夹,然后再试。" & vbCrLf &
  30. "3. 右键 PCL 选择属性,打开 兼容性 中的 以管理员身份运行此程序。",
  31. MsgBoxStyle.Critical, "运行环境错误")
  32. Environment.[Exit](Result.Cancel)
  33. End Try
  34. If Not CheckPermission(Path & "PCL") Then
  35. MsgBox("PCL 没有对当前文件夹的写入权限,请尝试:" & vbCrLf &
  36. "1. 将 PCL 移动到其他文件夹" & If(Path.StartsWithF("C:", True), ",例如 C 盘和桌面以外的其他位置。", "。") & vbCrLf &
  37. "2. 删除当前目录中的 PCL 文件夹,然后再试。" & vbCrLf &
  38. "3. 右键 PCL 选择属性,打开 兼容性 中的 以管理员身份运行此程序。",
  39. MsgBoxStyle.Critical, "运行环境错误")
  40. Environment.[Exit](Result.Cancel)
  41. End If
  42. '开源版本提示
  43. MyMsgBox($"该版本中无法使用以下特性:
  44. - CurseForge API 调用:需要你自行申请 API Key,然后添加到 ModSecret.vb 的开头
  45. - 正版登录:需要你自行申请 Client ID,然后添加到 ModSecret.vb 的开头
  46. - 更新与联网通知:避免滥用隐患
  47. - 主题切换:这是需要赞助解锁的纪念性质的功能,别让赞助者太伤心啦……
  48. - 百宝箱:开发早期往里面塞了些开发工具,整理起来太麻烦了", "开源版本说明")
  49. End Sub
  50. ''' <summary>
  51. ''' 获取设备标识码。
  52. ''' </summary>
  53. Friend Function SecretGetUniqueAddress() As String
  54. Return "0000-0000-0000-0000"
  55. End Function
  56. Friend Sub SecretLaunchJvmArgs(ByRef DataList As List(Of String))
  57. Dim DataJvmCustom As String = Setup.Get("VersionAdvanceJvm", Version:=McVersionCurrent)
  58. DataList.Insert(0, If(DataJvmCustom = "", Setup.Get("LaunchAdvanceJvm"), DataJvmCustom)) '可变 JVM 参数
  59. McLaunchLog("当前剩余内存:" & Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10 & "G")
  60. DataList.Add("-Xmn" & Math.Floor(PageVersionSetup.GetRam(McVersionCurrent) * 1024 * 0.15) & "m")
  61. DataList.Add("-Xmx" & Math.Floor(PageVersionSetup.GetRam(McVersionCurrent) * 1024) & "m")
  62. If Not DataList.Any(Function(d) d.Contains("-Dlog4j2.formatMsgNoLookups=true")) Then DataList.Add("-Dlog4j2.formatMsgNoLookups=true")
  63. End Sub
  64. ''' <summary>
  65. ''' 打码字符串中的 AccessToken。
  66. ''' </summary>
  67. Friend Function SecretFilter(Raw As String, FilterChar As Char) As String
  68. '打码 "accessToken " 后的内容
  69. If Raw.Contains("accessToken ") Then
  70. For Each Token In RegexSearch(Raw, "(?<=accessToken ([^ ]{5}))[^ ]+(?=[^ ]{5})")
  71. Raw = Raw.Replace(Token, New String(FilterChar, Token.Count))
  72. Next
  73. End If
  74. '打码当前登录的结果
  75. Dim AccessToken As String = McLoginLoader.Output.AccessToken
  76. If AccessToken Is Nothing OrElse AccessToken.Length < 10 OrElse Not Raw.ContainsF(AccessToken, True) OrElse
  77. McLoginLoader.Output.Uuid = McLoginLoader.Output.AccessToken Then 'UUID 和 AccessToken 一样则不打码
  78. Return Raw
  79. Else
  80. Return Raw.Replace(AccessToken, Left(AccessToken, 5) & New String(FilterChar, AccessToken.Length - 10) & Right(AccessToken, 5))
  81. End If
  82. End Function
  83. #End Region
  84. #Region "网络鉴权"
  85. Friend Function SecretCdnSign(UrlWithMark As String)
  86. If Not UrlWithMark.EndsWithF("{CDN}") Then Return UrlWithMark
  87. Return UrlWithMark.Replace("{CDN}", "").Replace(" ", "%20")
  88. End Function
  89. ''' <summary>
  90. ''' 设置 Headers 的 UA、Referer。
  91. ''' </summary>
  92. Friend Sub SecretHeadersSign(Url As String, ByRef Client As WebClient, Optional UseBrowserUserAgent As Boolean = False)
  93. If Url.Contains("baidupcs.com") OrElse Url.Contains("baidu.com") Then
  94. Client.Headers("User-Agent") = "LogStatistic" '#4951
  95. ElseIf UseBrowserUserAgent Then
  96. Client.Headers("User-Agent") = "PCL2/" & VersionStandardCode & " Mozilla/5.0 AppleWebKit/537.36 Chrome/63.0.3239.132 Safari/537.36"
  97. Else
  98. Client.Headers("User-Agent") = "PCL2/" & VersionStandardCode
  99. End If
  100. Client.Headers("Referer") = "http://" & VersionCode & ".pcl2.open.server/"
  101. If Url.Contains("api.curseforge") Then
  102. Client.Headers("x-api-key") = CurseForgeAPIKey
  103. End If
  104. End Sub
  105. ''' <summary>
  106. ''' 设置 Headers 的 UA、Referer。
  107. ''' </summary>
  108. Friend Sub SecretHeadersSign(Url As String, ByRef Request As HttpWebRequest, Optional UseBrowserUserAgent As Boolean = False)
  109. If Url.Contains("baidupcs.com") OrElse Url.Contains("baidu.com") Then
  110. Request.UserAgent = "LogStatistic" '#4951
  111. ElseIf UseBrowserUserAgent Then
  112. Request.UserAgent = "PCL2/" & VersionStandardCode & " Mozilla/5.0 AppleWebKit/537.36 Chrome/63.0.3239.132 Safari/537.36"
  113. Else
  114. Request.UserAgent = "PCL2/" & VersionStandardCode
  115. End If
  116. Request.Referer = "http://" & VersionCode & ".pcl2.open.server/"
  117. If Url.Contains("api.curseforge") Then
  118. Request.Headers("x-api-key") = CurseForgeAPIKey
  119. End If
  120. End Sub
  121. #End Region
  122. #Region "字符串加解密"
  123. ''' <summary>
  124. ''' 获取八位密钥。
  125. ''' </summary>
  126. Private Function SecretKeyGet(Key As String) As String
  127. Return "00000000"
  128. End Function
  129. ''' <summary>
  130. ''' 加密字符串。
  131. ''' </summary>
  132. Friend Function SecretEncrypt(SourceString As String, Optional Key As String = "") As String
  133. Key = SecretKeyGet(Key)
  134. Dim btKey As Byte() = Encoding.UTF8.GetBytes(Key)
  135. Dim btIV As Byte() = Encoding.UTF8.GetBytes("87160295")
  136. Dim des As New DESCryptoServiceProvider
  137. Using MS As New MemoryStream
  138. Dim inData As Byte() = Encoding.UTF8.GetBytes(SourceString)
  139. Using cs As New CryptoStream(MS, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write)
  140. cs.Write(inData, 0, inData.Length)
  141. cs.FlushFinalBlock()
  142. Return Convert.ToBase64String(MS.ToArray())
  143. End Using
  144. End Using
  145. End Function
  146. ''' <summary>
  147. ''' 解密字符串。
  148. ''' </summary>
  149. Friend Function SecretDecrypt(SourceString As String, Optional Key As String = "") As String
  150. Key = SecretKeyGet(Key)
  151. Dim btKey As Byte() = Encoding.UTF8.GetBytes(Key)
  152. Dim btIV As Byte() = Encoding.UTF8.GetBytes("87160295")
  153. Dim des As New DESCryptoServiceProvider
  154. Using MS As New MemoryStream
  155. Dim inData As Byte() = Convert.FromBase64String(SourceString)
  156. Using cs As New CryptoStream(MS, des.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write)
  157. cs.Write(inData, 0, inData.Length)
  158. cs.FlushFinalBlock()
  159. Return Encoding.UTF8.GetString(MS.ToArray())
  160. End Using
  161. End Using
  162. End Function
  163. #End Region
  164. #Region "主题"
  165. Public Color1 As New MyColor(52, 61, 74)
  166. Public Color2 As New MyColor(11, 91, 203)
  167. Public Color3 As New MyColor(19, 112, 243)
  168. Public Color4 As New MyColor(72, 144, 245)
  169. Public Color5 As New MyColor(150, 192, 249)
  170. Public Color6 As New MyColor(213, 230, 253)
  171. Public Color7 As New MyColor(222, 236, 253)
  172. Public Color8 As New MyColor(234, 242, 254)
  173. Public ColorBg0 As New MyColor(150, 192, 249)
  174. Public ColorBg1 As New MyColor(190, Color7)
  175. Public ColorGray1 As New MyColor(64, 64, 64)
  176. Public ColorGray2 As New MyColor(115, 115, 115)
  177. Public ColorGray3 As New MyColor(140, 140, 140)
  178. Public ColorGray4 As New MyColor(166, 166, 166)
  179. Public ColorGray5 As New MyColor(204, 204, 204)
  180. Public ColorGray6 As New MyColor(235, 235, 235)
  181. Public ColorGray7 As New MyColor(240, 240, 240)
  182. Public ColorGray8 As New MyColor(245, 245, 245)
  183. Public ColorSemiTransparent As New MyColor(1, Color8)
  184. Public ThemeNow As Integer = -1
  185. Public ColorHue As Integer = 210, ColorSat As Integer = 85, ColorLightAdjust As Integer = 0, ColorHueTopbarDelta As Object = 0
  186. Public ThemeDontClick As Integer = 0
  187. Public Sub ThemeRefresh(Optional NewTheme As Integer = -1)
  188. Hint("该版本中不包含主题功能……")
  189. End Sub
  190. Public Sub ThemeRefreshMain()
  191. RunInUi(
  192. Sub()
  193. If Not FrmMain.IsLoaded Then Exit Sub
  194. '顶部条背景
  195. Dim Brush = New LinearGradientBrush With {.EndPoint = New Point(1, 0), .StartPoint = New Point(0, 0)}
  196. If ThemeNow = 5 Then
  197. Brush.GradientStops.Add(New GradientStop With {.Offset = 0, .Color = New MyColor().FromHSL2(ColorHue, ColorSat, 25)})
  198. Brush.GradientStops.Add(New GradientStop With {.Offset = 0.5, .Color = New MyColor().FromHSL2(ColorHue, ColorSat, 15)})
  199. Brush.GradientStops.Add(New GradientStop With {.Offset = 1, .Color = New MyColor().FromHSL2(ColorHue, ColorSat, 25)})
  200. FrmMain.PanTitle.Background = Brush
  201. FrmMain.PanTitle.Background.Freeze()
  202. ElseIf Not (ThemeNow = 12 OrElse ThemeDontClick = 2) Then
  203. If TypeOf ColorHueTopbarDelta Is Integer Then
  204. Brush.GradientStops.Add(New GradientStop With {.Offset = 0, .Color = New MyColor().FromHSL2(ColorHue - ColorHueTopbarDelta, ColorSat, 48 + ColorLightAdjust)})
  205. Brush.GradientStops.Add(New GradientStop With {.Offset = 0.5, .Color = New MyColor().FromHSL2(ColorHue, ColorSat, 54 + ColorLightAdjust)})
  206. Brush.GradientStops.Add(New GradientStop With {.Offset = 1, .Color = New MyColor().FromHSL2(ColorHue + ColorHueTopbarDelta, ColorSat, 48 + ColorLightAdjust)})
  207. Else
  208. Brush.GradientStops.Add(New GradientStop With {.Offset = 0, .Color = New MyColor().FromHSL2(ColorHue + ColorHueTopbarDelta(0), ColorSat, 48 + ColorLightAdjust)})
  209. Brush.GradientStops.Add(New GradientStop With {.Offset = 0.5, .Color = New MyColor().FromHSL2(ColorHue + ColorHueTopbarDelta(1), ColorSat, 54 + ColorLightAdjust)})
  210. Brush.GradientStops.Add(New GradientStop With {.Offset = 1, .Color = New MyColor().FromHSL2(ColorHue + ColorHueTopbarDelta(2), ColorSat, 48 + ColorLightAdjust)})
  211. End If
  212. FrmMain.PanTitle.Background = Brush
  213. FrmMain.PanTitle.Background.Freeze()
  214. Else
  215. Brush.GradientStops.Add(New GradientStop With {.Offset = 0, .Color = New MyColor().FromHSL2(ColorHue - 21, ColorSat, 53 + ColorLightAdjust)})
  216. Brush.GradientStops.Add(New GradientStop With {.Offset = 0.33, .Color = New MyColor().FromHSL2(ColorHue - 7, ColorSat, 47 + ColorLightAdjust)})
  217. Brush.GradientStops.Add(New GradientStop With {.Offset = 0.67, .Color = New MyColor().FromHSL2(ColorHue + 7, ColorSat, 47 + ColorLightAdjust)})
  218. Brush.GradientStops.Add(New GradientStop With {.Offset = 1, .Color = New MyColor().FromHSL2(ColorHue + 21, ColorSat, 53 + ColorLightAdjust)})
  219. FrmMain.PanTitle.Background = Brush
  220. End If
  221. '主页面背景
  222. If Setup.Get("UiBackgroundColorful") Then
  223. Brush = New LinearGradientBrush With {.EndPoint = New Point(0.1, 1), .StartPoint = New Point(0.9, 0)}
  224. Brush.GradientStops.Add(New GradientStop With {.Offset = -0.1, .Color = New MyColor().FromHSL2(ColorHue - 20, Math.Min(60, ColorSat) * 0.5, 80)})
  225. Brush.GradientStops.Add(New GradientStop With {.Offset = 0.4, .Color = New MyColor().FromHSL2(ColorHue, ColorSat * 0.9, 90)})
  226. Brush.GradientStops.Add(New GradientStop With {.Offset = 1.1, .Color = New MyColor().FromHSL2(ColorHue + 20, Math.Min(60, ColorSat) * 0.5, 80)})
  227. FrmMain.PanForm.Background = Brush
  228. Else
  229. FrmMain.PanForm.Background = New MyColor(245, 245, 245)
  230. End If
  231. FrmMain.PanForm.Background.Freeze()
  232. End Sub)
  233. End Sub
  234. Public Sub ThemeCheckAll(EffectSetup As Boolean)
  235. End Sub
  236. Public Function ThemeCheckOne(Id As Integer) As Boolean
  237. Return True
  238. End Function
  239. Friend Function ThemeUnlock(Id As Integer, Optional ShowDoubleHint As Boolean = True, Optional UnlockHint As String = Nothing) As Boolean
  240. Return False
  241. End Function
  242. Public Function ThemeCheckGold(Optional Code As String = Nothing) As Boolean
  243. Return False
  244. End Function
  245. Public Function DonateCodeInput() As Boolean?
  246. Return Nothing
  247. End Function
  248. #End Region
  249. #Region "更新"
  250. Public IsUpdateStarted As Boolean = False
  251. Public IsUpdateWaitingRestart As Boolean = False
  252. Public Sub UpdateCheckByButton()
  253. Hint("该版本中不包含更新功能……")
  254. End Sub
  255. Public Sub UpdateStart(BaseUrl As String, Slient As Boolean, Optional ReceivedKey As String = Nothing, Optional ForceValidated As Boolean = False)
  256. End Sub
  257. Public Sub UpdateRestart(TriggerRestartAndByEnd As Boolean)
  258. End Sub
  259. Public Sub UpdateReplace(ProcessId As Integer, OldFileName As String, NewFileName As String, TriggerRestart As Boolean)
  260. End Sub
  261. #End Region
  262. #Region "联网通知"
  263. Public ServerLoader As New LoaderTask(Of Integer, Integer)("PCL 服务", Sub() Log("[Server] 该版本中不包含更新通知功能……"), Priority:=ThreadPriority.BelowNormal)
  264. #End Region
  265. End Module