├── .github
├── dependabot.yml
└── workflows
│ └── ci.yml
├── .gitignore
├── LICENSE
├── README.md
├── Toolbox.KeyGenerator
├── Program.cs
└── Toolbox.KeyGenerator.csproj
├── Toolbox.ScriptSigner
├── Program.cs
└── Toolbox.ScriptSigner.csproj
└── Toolbox.sln
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: "github-actions"
4 | directory: "/"
5 | schedule:
6 | interval: "daily"
7 | - package-ecosystem: "nuget"
8 | directory: "/"
9 | schedule:
10 | interval: "daily"
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 | on: [push]
3 |
4 | jobs:
5 | build:
6 | strategy:
7 | matrix:
8 | platform: [win-x64, linux-x64]
9 |
10 | name: Build
11 | runs-on: ubuntu-latest
12 |
13 | steps:
14 | - uses: actions/checkout@v4
15 | - uses: actions/setup-dotnet@v4
16 | with:
17 | dotnet-version: 7.0
18 |
19 | - name: Build
20 | run: dotnet publish -r ${{ matrix.platform }} -c Release --no-self-contained -p:PublishDir=../publish/${{ matrix.platform }}
21 |
22 | - name: Upload
23 | uses: actions/upload-artifact@v4
24 | with:
25 | name: ${{ matrix.platform }}
26 | path: publish/${{ matrix.platform }}/*
27 |
28 | release:
29 | name: Release
30 | runs-on: ubuntu-latest
31 |
32 | needs: build
33 | if: startsWith(github.ref, 'refs/tag/v')
34 |
35 | steps:
36 | - name: Download release artifacts
37 | uses: actions/download-artifact@v4
38 | with:
39 | path: x64
40 |
41 | - name: Rename artifacts
42 | run: |
43 | mv x64/win-x64.zip toolbox-${{ github.ref_name }}-win-x64.zip
44 | mv x64/linux-x64.zip toolbox-${{ github.ref_name }}-linux-x64.zip
45 |
46 | - name: Create release draft
47 | uses: softprops/action-gh-release@v1
48 | with:
49 | name: ${{ github.ref_name }}
50 | draft: true
51 | files: |
52 | toolbox-${{ github.ref_name }}-win-x64.zip
53 | toolbox-${{ github.ref_name }}-linux-x64.zip
54 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | .vscode/
7 |
8 | # User-specific files
9 | *.rsuser
10 | *.suo
11 | *.user
12 | *.userosscache
13 | *.sln.docstates
14 |
15 | # User-specific files (MonoDevelop/Xamarin Studio)
16 | *.userprefs
17 |
18 | # Mono auto generated files
19 | mono_crash.*
20 |
21 | # Build results
22 | [Dd]ebug/
23 | [Dd]ebugPublic/
24 | [Rr]elease/
25 | [Rr]eleases/
26 | x64/
27 | x86/
28 | [Ww][Ii][Nn]32/
29 | [Aa][Rr][Mm]/
30 | [Aa][Rr][Mm]64/
31 | bld/
32 | [Bb]in/
33 | [Oo]bj/
34 | [Ll]og/
35 | [Ll]ogs/
36 |
37 | # Visual Studio 2015/2017 cache/options directory
38 | .vs/
39 | # Uncomment if you have tasks that create the project's static files in wwwroot
40 | #wwwroot/
41 |
42 | # Visual Studio 2017 auto generated files
43 | Generated\ Files/
44 |
45 | # MSTest test Results
46 | [Tt]est[Rr]esult*/
47 | [Bb]uild[Ll]og.*
48 |
49 | # NUnit
50 | *.VisualState.xml
51 | TestResult.xml
52 | nunit-*.xml
53 |
54 | # Build Results of an ATL Project
55 | [Dd]ebugPS/
56 | [Rr]eleasePS/
57 | dlldata.c
58 |
59 | # Benchmark Results
60 | BenchmarkDotNet.Artifacts/
61 |
62 | # .NET Core
63 | project.lock.json
64 | project.fragment.lock.json
65 | artifacts/
66 |
67 | # ASP.NET Scaffolding
68 | ScaffoldingReadMe.txt
69 |
70 | # StyleCop
71 | StyleCopReport.xml
72 |
73 | # Files built by Visual Studio
74 | *_i.c
75 | *_p.c
76 | *_h.h
77 | *.ilk
78 | *.meta
79 | *.obj
80 | *.iobj
81 | *.pch
82 | *.pdb
83 | *.ipdb
84 | *.pgc
85 | *.pgd
86 | *.rsp
87 | *.sbr
88 | *.tlb
89 | *.tli
90 | *.tlh
91 | *.tmp
92 | *.tmp_proj
93 | *_wpftmp.csproj
94 | *.log
95 | *.vspscc
96 | *.vssscc
97 | .builds
98 | *.pidb
99 | *.svclog
100 | *.scc
101 |
102 | # Chutzpah Test files
103 | _Chutzpah*
104 |
105 | # Visual C++ cache files
106 | ipch/
107 | *.aps
108 | *.ncb
109 | *.opendb
110 | *.opensdf
111 | *.sdf
112 | *.cachefile
113 | *.VC.db
114 | *.VC.VC.opendb
115 |
116 | # Visual Studio profiler
117 | *.psess
118 | *.vsp
119 | *.vspx
120 | *.sap
121 |
122 | # Visual Studio Trace Files
123 | *.e2e
124 |
125 | # TFS 2012 Local Workspace
126 | $tf/
127 |
128 | # Guidance Automation Toolkit
129 | *.gpState
130 |
131 | # ReSharper is a .NET coding add-in
132 | _ReSharper*/
133 | *.[Rr]e[Ss]harper
134 | *.DotSettings.user
135 |
136 | # TeamCity is a build add-in
137 | _TeamCity*
138 |
139 | # DotCover is a Code Coverage Tool
140 | *.dotCover
141 |
142 | # AxoCover is a Code Coverage Tool
143 | .axoCover/*
144 | !.axoCover/settings.json
145 |
146 | # Coverlet is a free, cross platform Code Coverage Tool
147 | coverage*.json
148 | coverage*.xml
149 | coverage*.info
150 |
151 | # Visual Studio code coverage results
152 | *.coverage
153 | *.coveragexml
154 |
155 | # NCrunch
156 | _NCrunch_*
157 | .*crunch*.local.xml
158 | nCrunchTemp_*
159 |
160 | # MightyMoose
161 | *.mm.*
162 | AutoTest.Net/
163 |
164 | # Web workbench (sass)
165 | .sass-cache/
166 |
167 | # Installshield output folder
168 | [Ee]xpress/
169 |
170 | # DocProject is a documentation generator add-in
171 | DocProject/buildhelp/
172 | DocProject/Help/*.HxT
173 | DocProject/Help/*.HxC
174 | DocProject/Help/*.hhc
175 | DocProject/Help/*.hhk
176 | DocProject/Help/*.hhp
177 | DocProject/Help/Html2
178 | DocProject/Help/html
179 |
180 | # Click-Once directory
181 | publish/
182 |
183 | # Publish Web Output
184 | *.[Pp]ublish.xml
185 | *.azurePubxml
186 | # Note: Comment the next line if you want to checkin your web deploy settings,
187 | # but database connection strings (with potential passwords) will be unencrypted
188 | *.pubxml
189 | *.publishproj
190 |
191 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
192 | # checkin your Azure Web App publish settings, but sensitive information contained
193 | # in these scripts will be unencrypted
194 | PublishScripts/
195 |
196 | # NuGet Packages
197 | *.nupkg
198 | # NuGet Symbol Packages
199 | *.snupkg
200 | # The packages folder can be ignored because of Package Restore
201 | **/[Pp]ackages/*
202 | # except build/, which is used as an MSBuild target.
203 | !**/[Pp]ackages/build/
204 | # Uncomment if necessary however generally it will be regenerated when needed
205 | #!**/[Pp]ackages/repositories.config
206 | # NuGet v3's project.json files produces more ignorable files
207 | *.nuget.props
208 | *.nuget.targets
209 |
210 | # Microsoft Azure Build Output
211 | csx/
212 | *.build.csdef
213 |
214 | # Microsoft Azure Emulator
215 | ecf/
216 | rcf/
217 |
218 | # Windows Store app package directories and files
219 | AppPackages/
220 | BundleArtifacts/
221 | Package.StoreAssociation.xml
222 | _pkginfo.txt
223 | *.appx
224 | *.appxbundle
225 | *.appxupload
226 |
227 | # Visual Studio cache files
228 | # files ending in .cache can be ignored
229 | *.[Cc]ache
230 | # but keep track of directories ending in .cache
231 | !?*.[Cc]ache/
232 |
233 | # Others
234 | ClientBin/
235 | ~$*
236 | *~
237 | *.dbmdl
238 | *.dbproj.schemaview
239 | *.jfm
240 | *.pfx
241 | *.publishsettings
242 | orleans.codegen.cs
243 |
244 | # Including strong name files can present a security risk
245 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
246 | #*.snk
247 |
248 | # Since there are multiple workflows, uncomment next line to ignore bower_components
249 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
250 | #bower_components/
251 |
252 | # RIA/Silverlight projects
253 | Generated_Code/
254 |
255 | # Backup & report files from converting an old project file
256 | # to a newer Visual Studio version. Backup files are not needed,
257 | # because we have git ;-)
258 | _UpgradeReport_Files/
259 | Backup*/
260 | UpgradeLog*.XML
261 | UpgradeLog*.htm
262 | ServiceFabricBackup/
263 | *.rptproj.bak
264 |
265 | # SQL Server files
266 | *.mdf
267 | *.ldf
268 | *.ndf
269 |
270 | # Business Intelligence projects
271 | *.rdl.data
272 | *.bim.layout
273 | *.bim_*.settings
274 | *.rptproj.rsuser
275 | *- [Bb]ackup.rdl
276 | *- [Bb]ackup ([0-9]).rdl
277 | *- [Bb]ackup ([0-9][0-9]).rdl
278 |
279 | # Microsoft Fakes
280 | FakesAssemblies/
281 |
282 | # GhostDoc plugin setting file
283 | *.GhostDoc.xml
284 |
285 | # Node.js Tools for Visual Studio
286 | .ntvs_analysis.dat
287 | node_modules/
288 |
289 | # Visual Studio 6 build log
290 | *.plg
291 |
292 | # Visual Studio 6 workspace options file
293 | *.opt
294 |
295 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
296 | *.vbw
297 |
298 | # Visual Studio LightSwitch build output
299 | **/*.HTMLClient/GeneratedArtifacts
300 | **/*.DesktopClient/GeneratedArtifacts
301 | **/*.DesktopClient/ModelManifest.xml
302 | **/*.Server/GeneratedArtifacts
303 | **/*.Server/ModelManifest.xml
304 | _Pvt_Extensions
305 |
306 | # Paket dependency manager
307 | .paket/paket.exe
308 | paket-files/
309 |
310 | # FAKE - F# Make
311 | .fake/
312 |
313 | # CodeRush personal settings
314 | .cr/personal
315 |
316 | # Python Tools for Visual Studio (PTVS)
317 | __pycache__/
318 | *.pyc
319 |
320 | # Cake - Uncomment if you are using it
321 | # tools/**
322 | # !tools/packages.config
323 |
324 | # Tabs Studio
325 | *.tss
326 |
327 | # Telerik's JustMock configuration file
328 | *.jmconfig
329 |
330 | # BizTalk build output
331 | *.btp.cs
332 | *.btm.cs
333 | *.odx.cs
334 | *.xsd.cs
335 |
336 | # OpenCover UI analysis results
337 | OpenCover/
338 |
339 | # Azure Stream Analytics local run output
340 | ASALocalRun/
341 |
342 | # MSBuild Binary and Structured Log
343 | *.binlog
344 |
345 | # NVidia Nsight GPU debugger configuration file
346 | *.nvuser
347 |
348 | # MFractors (Xamarin productivity tool) working folder
349 | .mfractor/
350 |
351 | # Local History for Visual Studio
352 | .localhistory/
353 |
354 | # BeatPulse healthcheck temp database
355 | healthchecksdb
356 |
357 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
358 | MigrationBackup/
359 |
360 | # Ionide (cross platform F# VS Code tools) working folder
361 | .ionide/
362 |
363 | # Fody - auto-generated XML schema
364 | FodyWeavers.xsd
365 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022-2023 Legacy Roblox Reverse Engineers
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Toolbox
2 | [](https://github.com/lrre-foss/toolbox/blob/trunk/LICENSE)
3 | [](https://github.com/lrre-foss/toolbox/actions)
4 | [](https://github.com/lrre-foss/toolbox/stargazers)
5 |
6 | Assortment of tools used for modifying legacy Roblox client binaries
7 |
8 | ```
9 | Toolbox
10 | ↳ Toolbox.ScriptSigner
11 | ↳ Toolbox.KeyGenerator
12 | ```
13 |
14 | ## Build
15 |
16 | 1. Open `Toolbox.sln`
17 | 2. Run a NuGet package restore
18 | 3. Build Solution
19 |
20 | ## License
21 |
22 | Toolbox is licensed under the [MIT license](https://github.com/lrre-foss/Toolbox/blob/trunk/LICENSE). A copy of it has been included with Toolbox.
--------------------------------------------------------------------------------
/Toolbox.KeyGenerator/Program.cs:
--------------------------------------------------------------------------------
1 | using System.Text;
2 | using System.Security.Cryptography;
3 |
4 | namespace Toolbox.KeyGenerator
5 | {
6 | internal class Program
7 | {
8 | static void Main(string[] args)
9 | {
10 | int size = 1024;
11 | string path = Directory.GetCurrentDirectory();
12 |
13 | if (args.Length > 0 && Directory.Exists(args[0]))
14 | {
15 | path = args[0];
16 | }
17 |
18 | if (args.Length > 1 && int.TryParse(args[1], out int result))
19 | {
20 | size = result;
21 | }
22 |
23 | Console.Write("status: generating keys...");
24 |
25 | using RSACryptoServiceProvider rsa = new(size);
26 |
27 | byte[] publicKeyBlob = rsa.ExportCspBlob(false);
28 | byte[] privateKeyBlob = rsa.ExportCspBlob(true);
29 |
30 | string publicKeyPem = rsa.ExportRSAPublicKeyPem();
31 | string privateKeyPem = rsa.ExportRSAPrivateKeyPem();
32 |
33 | Console.WriteLine("done!");
34 |
35 | File.WriteAllBytes(Path.Combine(path, "public.bin"), Encoding.UTF8.GetBytes(Convert.ToBase64String(publicKeyBlob)));
36 | File.WriteAllBytes(Path.Combine(path, "private.bin"), Encoding.UTF8.GetBytes(Convert.ToBase64String(privateKeyBlob)));
37 |
38 | File.WriteAllBytes(Path.Combine(path, "public.pem"), Encoding.UTF8.GetBytes(publicKeyPem));
39 | File.WriteAllBytes(Path.Combine(path, "private.pem"), Encoding.UTF8.GetBytes(privateKeyPem));
40 |
41 | Console.WriteLine("success: wrote all keys!");
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/Toolbox.KeyGenerator/Toolbox.KeyGenerator.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | net7.0
6 | enable
7 | enable
8 | true
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/Toolbox.ScriptSigner/Program.cs:
--------------------------------------------------------------------------------
1 | using System.Text;
2 | using System.Reflection;
3 | using System.Security.Cryptography;
4 |
5 | namespace Toolbox.ScriptSigner
6 | {
7 | internal class Program
8 | {
9 | static void Main(string[] args)
10 | {
11 | string path = Directory.GetCurrentDirectory();
12 | string format = "--rbxsig%{0}%{1}";
13 |
14 | using RSACryptoServiceProvider rsa = new();
15 |
16 | Console.WriteLine("status: loading private key from current working directory...");
17 |
18 | if (File.Exists(Path.Combine(path, "private.pem")))
19 | {
20 | rsa.ImportFromPem(File.ReadAllText(Path.Combine(path, "private.pem")));
21 | }
22 | else
23 | {
24 | Console.WriteLine("warn: private.pem not found -- looking for private key blob (private.bin)...");
25 |
26 | if (File.Exists(Path.Combine(path, "private.bin")))
27 | {
28 | byte[] bytes = File.ReadAllBytes(Path.Combine(path, "private.bin"));
29 |
30 | if (bytes[^1] == '=' && bytes[^2] == '=')
31 | {
32 | bytes = Convert.FromBase64String(Encoding.UTF8.GetString(bytes));
33 | }
34 |
35 | rsa.ImportCspBlob(bytes);
36 | }
37 | else
38 | {
39 | Console.WriteLine("error: private key not found!");
40 | Environment.Exit(1);
41 | }
42 | }
43 |
44 | Console.WriteLine("status: signing all scripts...");
45 |
46 | foreach (string filename in args)
47 | {
48 | if (!File.Exists(filename))
49 | {
50 | Console.WriteLine($"warn: {filename} not found -- skipping...");
51 | continue;
52 | }
53 |
54 | Console.Write($"status: signing {filename}...");
55 |
56 | string script = "\r\n" + File.ReadAllText(filename);
57 | byte[] signature = rsa.SignData(Encoding.Default.GetBytes(script), SHA1.Create());
58 |
59 | File.WriteAllText(filename, string.Format(format, Convert.ToBase64String(signature), script));
60 |
61 | Console.WriteLine("signed!");
62 | }
63 |
64 | Console.WriteLine("success: finished signing all scripts!");
65 | }
66 | }
67 | }
--------------------------------------------------------------------------------
/Toolbox.ScriptSigner/Toolbox.ScriptSigner.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | net7.0
6 | enable
7 | enable
8 | true
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/Toolbox.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.6.33801.468
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Toolbox.KeyGenerator", "Toolbox.KeyGenerator\Toolbox.KeyGenerator.csproj", "{D5F9673D-F2E5-495C-B5F6-E17D2AD49C13}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Toolbox.ScriptSigner", "Toolbox.ScriptSigner\Toolbox.ScriptSigner.csproj", "{457D94A3-6073-4786-A954-C310C7318124}"
9 | EndProject
10 | Global
11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 | Debug|Any CPU = Debug|Any CPU
13 | Release|Any CPU = Release|Any CPU
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {D5F9673D-F2E5-495C-B5F6-E17D2AD49C13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17 | {D5F9673D-F2E5-495C-B5F6-E17D2AD49C13}.Debug|Any CPU.Build.0 = Debug|Any CPU
18 | {D5F9673D-F2E5-495C-B5F6-E17D2AD49C13}.Release|Any CPU.ActiveCfg = Release|Any CPU
19 | {D5F9673D-F2E5-495C-B5F6-E17D2AD49C13}.Release|Any CPU.Build.0 = Release|Any CPU
20 | {457D94A3-6073-4786-A954-C310C7318124}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21 | {457D94A3-6073-4786-A954-C310C7318124}.Debug|Any CPU.Build.0 = Debug|Any CPU
22 | {457D94A3-6073-4786-A954-C310C7318124}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 | {457D94A3-6073-4786-A954-C310C7318124}.Release|Any CPU.Build.0 = Release|Any CPU
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | GlobalSection(ExtensibilityGlobals) = postSolution
29 | SolutionGuid = {91948721-D2B2-4C34-99AD-27F436CE6B7C}
30 | EndGlobalSection
31 | EndGlobal
32 |
--------------------------------------------------------------------------------