ModSecret.vb 15 KB

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