Add GM6
|
@ -0,0 +1,4 @@
|
|||
*/obj/*
|
||||
*/bin/*
|
||||
*/Release/*
|
||||
*/Debug/*
|
317
Button.pdn
|
@ -1 +0,0 @@
|
|||
Subproject commit d4bc191fed7b91c9859920e2e1b13974a2e6e7ce
|
|
@ -4,7 +4,7 @@
|
|||
<datafile>
|
||||
<name>libeay32.dll</name>
|
||||
<filename>libeay32.dll</filename>
|
||||
<origname>C:\Users\User\Documents\git\UGP\UGP.gmx\datafiles\libeay32.dll</origname>
|
||||
<origname>C:\Users\User\Documents\git\UGP\UGP.gmx\\\datafiles\libeay32.dll</origname>
|
||||
<exists>-1</exists>
|
||||
<size>1207808</size>
|
||||
<exportAction>2</exportAction>
|
||||
|
@ -18,7 +18,7 @@
|
|||
<datafile>
|
||||
<name>UGP.dll</name>
|
||||
<filename>UGP.dll</filename>
|
||||
<origname>C:\Users\User\Documents\git\UGP\UGP.gmx\datafiles\UGP.dll</origname>
|
||||
<origname>C:\Users\User\Documents\git\UGP\UGP.gmx\\\datafiles\UGP.dll</origname>
|
||||
<exists>-1</exists>
|
||||
<size>93696</size>
|
||||
<exportAction>2</exportAction>
|
||||
|
@ -32,7 +32,7 @@
|
|||
<datafile>
|
||||
<name>ModuleDownloader.exe</name>
|
||||
<filename>ModuleDownloader.exe</filename>
|
||||
<origname>C:\Users\User\Documents\git\UGP\UGP.gmx\datafiles\ModuleDownloader.exe</origname>
|
||||
<origname>C:\Users\User\Documents\git\UGP\UGP.gmx\\\datafiles\ModuleDownloader.exe</origname>
|
||||
<exists>-1</exists>
|
||||
<size>2146816</size>
|
||||
<exportAction>2</exportAction>
|
||||
|
|
|
@ -85,9 +85,12 @@ file_delete("ModuleDownloader.exe");
|
|||
<arguments>
|
||||
<argument>
|
||||
<kind>1</kind>
|
||||
<string>global.getMachineGuid = external_define("UGP.dll","GetMachineGuid",dll_cdecl,ty_string,0);
|
||||
<string>//UGP.DLL imports
|
||||
global.getMachineGuid = external_define("UGP.dll","GetMachineGuid",dll_cdecl,ty_string,0);
|
||||
global.MD5 = external_define("UGP.dll","MD5",dll_cdecl,ty_string,1,ty_string);
|
||||
global.setBinKey = external_define("UGP.dll","SetBinKey",dll_cdecl,ty_real,3,ty_string, ty_string, ty_string);
|
||||
global.generateGM6Key = external_define("UGP.dll","GenerateGM6Key",dll_cdecl,ty_string,1,ty_string);
|
||||
|
||||
global.download_exports = false;
|
||||
|
||||
instance_create((room_width-(44/2))-10, (room_height-(44/2))-10, obj_mute);
|
||||
|
|
|
@ -127,7 +127,6 @@ global.flashing_msg = '"'+inputid+'"'+" Copied to clipboard!";
|
|||
<kind>1</kind>
|
||||
<string>global.active = "";
|
||||
text = generate_gm5(obj_textinput_name_keygen.text, real(obj_textinput_version_keygen.text));
|
||||
|
||||
</string>
|
||||
</argument>
|
||||
</arguments>
|
||||
|
|
|
@ -179,8 +179,20 @@ global.flashing_msg = '"'+inputid+'"'+" Copied to clipboard!";
|
|||
<arguments>
|
||||
<argument>
|
||||
<kind>1</kind>
|
||||
<string>global.active = inputid;
|
||||
<string>/*
|
||||
global.active = inputid;
|
||||
keyboard_string = text;
|
||||
*/
|
||||
|
||||
global.active = "";
|
||||
if(text == "5"){
|
||||
text = "6";
|
||||
}
|
||||
else if(text == "6"){
|
||||
text = "5";
|
||||
}
|
||||
|
||||
obj_textinput_key_keygen.text = generate_gm5(obj_textinput_name_keygen.text, real(obj_textinput_version_keygen.text));
|
||||
</string>
|
||||
</argument>
|
||||
</arguments>
|
||||
|
|
|
@ -16,7 +16,6 @@ total = 0;
|
|||
multi = 1;
|
||||
for(i = 1; i <= string_length(name); i+=1) {
|
||||
c = ord(string_char_at(name, i));
|
||||
show_debug_message("c "+string(i)+": "+string(c));
|
||||
|
||||
total += (c - 64) * multi;
|
||||
multi *= 30;
|
||||
|
|
|
@ -19,6 +19,8 @@ var key_part_3;
|
|||
var checksum;
|
||||
var key;
|
||||
|
||||
var ename;
|
||||
|
||||
name = argument0;
|
||||
version = argument1;
|
||||
|
||||
|
@ -26,13 +28,24 @@ version = argument1;
|
|||
// Pad name out with "X" (if its < 5 chars long)
|
||||
new_name = string_upper(pad(name, 5, "X"));
|
||||
|
||||
// Remove " " from the name
|
||||
new_name = string_replace_all(new_name, " ", "");
|
||||
|
||||
// Start 5 characters from the end
|
||||
start = (string_length(new_name) - 5)+1;
|
||||
|
||||
|
||||
if(version == 6){
|
||||
ename = string_copy(new_name, start, 5);
|
||||
return external_call(global.generateGM6Key, ename);
|
||||
}
|
||||
|
||||
|
||||
// Extract last 5 characters, into a 2 char and 3 char string
|
||||
part_1 = string_copy(new_name, start, 2);
|
||||
part_2 = string_copy(new_name, start+2, 3);
|
||||
|
||||
|
||||
// Encode the name with base 0x1E
|
||||
encoded_name_1 = encode_name_part(part_1, version);
|
||||
encoded_name_2 = encode_name_part(part_2, 0);
|
||||
|
@ -55,6 +68,8 @@ while(check_blacklist(key)){
|
|||
key = generate_gm5(name, version);
|
||||
}
|
||||
|
||||
return key;
|
||||
|
||||
|
||||
return key;
|
||||
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
///generate_gm6(name)
|
||||
var name;
|
||||
var new_name;
|
||||
var start;
|
||||
var encname;
|
||||
var gm6key;
|
||||
|
||||
name = argument0;
|
||||
|
||||
// Pad name out with "X" (if its < 5 chars long)
|
||||
new_name = string_upper(pad(name, 5, "X"));
|
||||
|
||||
// Start 5 characters from the end
|
||||
start = (string_length(new_name) - 5)+1;
|
||||
|
||||
// Extract last 5 characters, into a 5 char string
|
||||
encname = string_copy(new_name, start, 5);
|
||||
|
||||
// Call from UGP.dll, for implementation see gm6.c inside UGP.dll code.
|
||||
gm6key = external_call(global.generateGM6Key, encname);
|
||||
|
||||
return gm6key;
|
|
@ -0,0 +1,17 @@
|
|||
///generate_gm6(name)
|
||||
var name;
|
||||
var new_name;
|
||||
var start;
|
||||
var encname;
|
||||
|
||||
// Pad name out with "X" (if its < 5 chars long)
|
||||
new_name = string_upper(pad(name, 5, "X"));
|
||||
|
||||
// Start 5 characters from the end
|
||||
start = (string_length(new_name) - 5)+1;
|
||||
|
||||
// Extract last 5 characters, into a 2 char and 3 char string
|
||||
encname = string_copy(new_name, start, 2);
|
||||
|
||||
external_call(global.generateGM6Key, argument0);
|
||||
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
@ -0,0 +1,25 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.31229.75
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DownloadModules", "DownloadModules\DownloadModules.csproj", "{0E6EE240-2E74-4408-A256-2EEE45DCFFF1}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{0E6EE240-2E74-4408-A256-2EEE45DCFFF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{0E6EE240-2E74-4408-A256-2EEE45DCFFF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{0E6EE240-2E74-4408-A256-2EEE45DCFFF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{0E6EE240-2E74-4408-A256-2EEE45DCFFF1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {1AFA50AC-0335-4463-AC99-6645819D74FC}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,186 @@
|
|||
using HtmlAgilityPack;
|
||||
using Org.BouncyCastle.Crypto.Digests;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Net.Cache;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace GMTools
|
||||
{
|
||||
class CDNUrls
|
||||
{
|
||||
//GMS14
|
||||
public const String GMS14 = "http://store.yoyogames.com/downloads/gm-studio/update-studio.rss";
|
||||
public const String GMS14EA = "https://pastebin.com/raw/XN4gPX4u";
|
||||
|
||||
//GMS2
|
||||
public const String GMS2 = "http://gms.yoyogames.com/Zeus-Runtime.rss";
|
||||
public const String GMS2Beta = "http://gms.yoyogames.com/Zeus-Runtime-Beta.rss";
|
||||
|
||||
|
||||
public static String FromIndex(int cdnIndex)
|
||||
{
|
||||
switch (cdnIndex)
|
||||
{
|
||||
case 1:
|
||||
return CDNUrls.GMS14;
|
||||
case 2:
|
||||
return CDNUrls.GMS14EA;
|
||||
case 3:
|
||||
return CDNUrls.GMS2;
|
||||
case 4:
|
||||
return CDNUrls.GMS2Beta;
|
||||
}
|
||||
return "NF";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class CDN
|
||||
{
|
||||
private static string xmlData = "";
|
||||
|
||||
private static string bypassAuthentication(string url)
|
||||
{
|
||||
if (url.StartsWith("https://updater.yoyogames.com") && !url.Contains("original"))
|
||||
{
|
||||
return "http://updatecdn.yoyogames.com/" + Path.GetFileName(url);
|
||||
}
|
||||
else
|
||||
{
|
||||
return url;
|
||||
}
|
||||
}
|
||||
|
||||
private static string getOriginalUrl(string version)
|
||||
{
|
||||
if (version.StartsWith("1."))
|
||||
{
|
||||
return "https://updater.yoyogames.com/api/download/original?filename=Original-" + version + ".zip";
|
||||
}
|
||||
else if (version.StartsWith("2."))
|
||||
{
|
||||
var doc = new HtmlAgilityPack.HtmlDocument();
|
||||
doc.LoadHtml(xmlData);
|
||||
var versions = doc.DocumentNode.SelectNodes("/rss/channel/item/enclosure");
|
||||
foreach (HtmlNode ver in versions)
|
||||
{
|
||||
string verName = ver.GetAttributeValue("sparkle:version", "0.0.0.0");
|
||||
if (verName == version)
|
||||
{
|
||||
return ver.GetAttributeValue("url", "http://example.com/").ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
return "NF";
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static void UseCDN(String CDN)
|
||||
{
|
||||
try
|
||||
{
|
||||
WebClient wc = new WebClient();
|
||||
wc.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
|
||||
xmlData = wc.DownloadString(CDN);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
MessageBox.Show("Could not connect to: " + CDN, "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static String GetModuleForVersion(String Version, String Module)
|
||||
{
|
||||
|
||||
Module = Module.ToLower();
|
||||
|
||||
if (Module == "original")
|
||||
return getOriginalUrl(Version);
|
||||
|
||||
var doc = new HtmlAgilityPack.HtmlDocument();
|
||||
doc.LoadHtml(xmlData);
|
||||
var versions = doc.DocumentNode.SelectNodes("/rss/channel/item/enclosure");
|
||||
|
||||
|
||||
foreach (HtmlNode version in versions)
|
||||
{
|
||||
string verName = version.GetAttributeValue("sparkle:version", "0.0.0.0");
|
||||
if (verName == Version)
|
||||
{
|
||||
var modules = version.Elements("module");
|
||||
foreach (var module in modules)
|
||||
{
|
||||
string moduleName = module.GetAttributeValue("name", "Original").ToLower();
|
||||
string moduleUrl = module.GetAttributeValue("url", "http://127.0.0.1");
|
||||
if (moduleName.ToLower() == Module.ToLower())
|
||||
{
|
||||
return bypassAuthentication(moduleUrl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
return "NF"; // Not Found
|
||||
}
|
||||
|
||||
|
||||
public static String[] GetVersions(String Filter = "")
|
||||
{
|
||||
var doc = new HtmlAgilityPack.HtmlDocument();
|
||||
doc.LoadHtml(xmlData);
|
||||
var versions = doc.DocumentNode.SelectNodes("/rss/channel/item/enclosure");
|
||||
|
||||
List<string> verList = new List<string>();
|
||||
|
||||
foreach (HtmlNode version in versions)
|
||||
{
|
||||
string versionName = version.GetAttributeValue("sparkle:version", "0.0.0.0");
|
||||
|
||||
if (Filter == "")
|
||||
{
|
||||
verList.Add(versionName);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GetModuleForVersion(versionName, Filter) != "NF")
|
||||
{
|
||||
verList.Add(versionName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return verList.ToArray();
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static String GetPassword(String ZipName)
|
||||
{
|
||||
if (ZipName.ToLower().StartsWith("original") || ZipName.ToLower().StartsWith("gmstudio"))
|
||||
{
|
||||
return "12#_p@o3w$ir_ADD-_$#";
|
||||
}
|
||||
MD5Digest md5Digest = new MD5Digest();
|
||||
byte[] array = new byte[16];
|
||||
byte[] bytes = Encoding.UTF8.GetBytes("MRJA" + Path.GetFileName(ZipName) + "PHMD");
|
||||
md5Digest.Reset();
|
||||
md5Digest.BlockUpdate(bytes, 0, bytes.Length);
|
||||
md5Digest.Finish();
|
||||
md5Digest.DoFinal(array, 0);
|
||||
string password = Convert.ToBase64String(array);
|
||||
return password;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,88 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{0E6EE240-2E74-4408-A256-2EEE45DCFFF1}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<RootNamespace>DownloadModules</RootNamespace>
|
||||
<AssemblyName>DownloadModules</AssemblyName>
|
||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<Deterministic>true</Deterministic>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="BouncyCastle.Crypto">
|
||||
<HintPath>..\..\..\..\AppData\Roaming\GameMaker-Studio\BouncyCastle.Crypto.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="HtmlAgilityPack, Version=1.11.33.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\HtmlAgilityPack.1.11.33\lib\Net35\HtmlAgilityPack.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Ionic.Zip, Version=1.9.1.8, Culture=neutral, PublicKeyToken=edbe51ad942a3f5c, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\DotNetZip.1.9.1.8\lib\net20\Ionic.Zip.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="CDN.cs" />
|
||||
<Compile Include="downloadForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Form1.Designer.cs">
|
||||
<DependentUpon>downloadForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<EmbeddedResource Include="Form1.resx">
|
||||
<DependentUpon>downloadForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<Compile Include="Properties\Settings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
|
@ -0,0 +1,77 @@
|
|||
|
||||
namespace DownloadModules
|
||||
{
|
||||
partial class downloadForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(downloadForm));
|
||||
this.downloadProgress = new System.Windows.Forms.ProgressBar();
|
||||
this.downloadStatus = new System.Windows.Forms.Label();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// downloadProgress
|
||||
//
|
||||
this.downloadProgress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.downloadProgress.Location = new System.Drawing.Point(12, 25);
|
||||
this.downloadProgress.Name = "downloadProgress";
|
||||
this.downloadProgress.Size = new System.Drawing.Size(828, 23);
|
||||
this.downloadProgress.TabIndex = 0;
|
||||
//
|
||||
// downloadStatus
|
||||
//
|
||||
this.downloadStatus.AutoSize = true;
|
||||
this.downloadStatus.Location = new System.Drawing.Point(12, 9);
|
||||
this.downloadStatus.Name = "downloadStatus";
|
||||
this.downloadStatus.Size = new System.Drawing.Size(104, 13);
|
||||
this.downloadStatus.TabIndex = 1;
|
||||
this.downloadStatus.Text = "Reading license.plist";
|
||||
//
|
||||
// downloadForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(852, 62);
|
||||
this.Controls.Add(this.downloadStatus);
|
||||
this.Controls.Add(this.downloadProgress);
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.Name = "downloadForm";
|
||||
this.Text = "GameMaker Exports Downloader";
|
||||
this.Load += new System.EventHandler(this.downloadForm_Load);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.ProgressBar downloadProgress;
|
||||
private System.Windows.Forms.Label downloadStatus;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace DownloadModules
|
||||
{
|
||||
static class Program
|
||||
{
|
||||
/// <summary>
|
||||
/// The main entry point for the application.
|
||||
/// </summary>
|
||||
[STAThread]
|
||||
static void Main()
|
||||
{
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
Application.Run(new downloadForm());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("DownloadModules")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("DownloadModules")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2021")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("0e6ee240-2e74-4408-a256-2eee45dcfff1")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
70
Visual Studio Projects/ModuleDownloader/DownloadModules/Properties/Resources.Designer.cs
generated
Normal file
|
@ -0,0 +1,70 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
namespace DownloadModules.Properties
|
||||
{
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources
|
||||
{
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager
|
||||
{
|
||||
get
|
||||
{
|
||||
if ((resourceMan == null))
|
||||
{
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DownloadModules.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture
|
||||
{
|
||||
get
|
||||
{
|
||||
return resourceCulture;
|
||||
}
|
||||
set
|
||||
{
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,117 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
29
Visual Studio Projects/ModuleDownloader/DownloadModules/Properties/Settings.Designer.cs
generated
Normal file
|
@ -0,0 +1,29 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
namespace DownloadModules.Properties
|
||||
{
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
|
||||
{
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default
|
||||
{
|
||||
get
|
||||
{
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
|
@ -0,0 +1,171 @@
|
|||
using GMTools;
|
||||
using Ionic.Zip;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using System.Xml;
|
||||
|
||||
namespace DownloadModules
|
||||
{
|
||||
public partial class downloadForm : Form
|
||||
{
|
||||
public downloadForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public List<string> Urls = new List<string>();
|
||||
public List<string> Modules = new List<string>();
|
||||
public WebClient wc = new WebClient();
|
||||
public string CurrentFile;
|
||||
public string DownloadLocation;
|
||||
int fileCount;
|
||||
int filesToDownload;
|
||||
public static Dictionary<string, string> ConvertPlistToDictionary(string _file)
|
||||
{
|
||||
XmlDocument xmlDocument = new XmlDocument();
|
||||
xmlDocument.XmlResolver = null;
|
||||
xmlDocument.LoadXml(_file);
|
||||
Dictionary<string, string> dictionary = new Dictionary<string, string>();
|
||||
XmlNode xmlNode = xmlDocument.SelectSingleNode("plist/dict");
|
||||
for (int i = 0; i < xmlNode.ChildNodes.Count; i += 2)
|
||||
{
|
||||
if (xmlNode.ChildNodes[i].Name == "key")
|
||||
{
|
||||
dictionary.Add(xmlNode.ChildNodes[i].InnerText, xmlNode.ChildNodes[i + 1].InnerText);
|
||||
}
|
||||
}
|
||||
return dictionary;
|
||||
}
|
||||
|
||||
|
||||
private string pop()
|
||||
{
|
||||
fileCount++;
|
||||
string url = Urls[0];
|
||||
Urls.RemoveAt(0);
|
||||
return url;
|
||||
}
|
||||
|
||||
private void downloadForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
string licenseFile = Path.Combine(Path.Combine(Environment.GetEnvironmentVariable("LOCALAPPDATA"), "GameMaker-Studio"), "license.plist");
|
||||
|
||||
if(File.Exists(licenseFile))
|
||||
{
|
||||
byte[] plistFileBytes = File.ReadAllBytes(licenseFile);
|
||||
string plistFile = Encoding.UTF8.GetString(plistFileBytes);
|
||||
Dictionary<string, string> dictionary = ConvertPlistToDictionary(plistFile);
|
||||
|
||||
string[] addonsArray = dictionary["Addons"].Split('.');
|
||||
foreach (string addon in addonsArray)
|
||||
{
|
||||
|
||||
switch (addon.ToLowerInvariant())
|
||||
{
|
||||
case "winphone8":
|
||||
Modules.Add("windowsphone");
|
||||
continue;
|
||||
case "free":
|
||||
case "windows":
|
||||
case "androidtest":
|
||||
case "windows8rt":
|
||||
case "yycompiler":
|
||||
continue;
|
||||
default:
|
||||
Modules.Add(addon.ToLowerInvariant());
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Version version = Assembly.LoadFile(Path.Combine(Path.Combine(Environment.GetEnvironmentVariable("APPDATA"), "GameMaker-Studio"), "GameMaker-Studio.exe")).GetName().Version;
|
||||
string cdnVersion = string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.Build);
|
||||
|
||||
CDN.UseCDN(CDNUrls.GMS14);
|
||||
foreach(string module in Modules)
|
||||
{
|
||||
string moduleUrl = CDN.GetModuleForVersion(cdnVersion, module);
|
||||
if (moduleUrl == "NF")
|
||||
continue;
|
||||
|
||||
Urls.Add(moduleUrl);
|
||||
}
|
||||
|
||||
if(Urls.Count > 0)
|
||||
{
|
||||
filesToDownload = Urls.Count;
|
||||
CurrentFile = pop();
|
||||
DownloadLocation = Path.Combine(Path.Combine(Path.Combine(Environment.GetEnvironmentVariable("LOCALAPPDATA"), "GameMaker-Studio"), "UpgradeZip"), Path.GetFileName(CurrentFile));
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(DownloadLocation));
|
||||
|
||||
wc.DownloadProgressChanged += Wc_DownloadProgressChanged;
|
||||
wc.DownloadFileCompleted += Wc_DownloadFileCompleted;
|
||||
wc.DownloadFileAsync(new Uri(CurrentFile), DownloadLocation);
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("Cannot find license.plist.", "ERROR");
|
||||
Application.Exit();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void Wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
|
||||
{
|
||||
string zipPassword = CDN.GetPassword(Path.GetFileName(CurrentFile));
|
||||
string gmsFolder = Path.Combine(Environment.GetEnvironmentVariable("APPDATA"), "GameMaker-Studio");
|
||||
downloadStatus.Text = "Extracting: " + Path.GetFileName(CurrentFile);
|
||||
Thread extractThread = new Thread(() =>
|
||||
{
|
||||
using (ZipFile archive = new ZipFile(DownloadLocation))
|
||||
{
|
||||
archive.Password = zipPassword;
|
||||
archive.Encryption = EncryptionAlgorithm.PkzipWeak;
|
||||
archive.ExtractAll(gmsFolder, ExtractExistingFileAction.OverwriteSilently);
|
||||
archive.Dispose();
|
||||
}
|
||||
try
|
||||
{
|
||||
File.Delete(DownloadLocation);
|
||||
}
|
||||
catch (Exception) { };
|
||||
|
||||
});
|
||||
|
||||
extractThread.Start();
|
||||
|
||||
while (extractThread.IsAlive)
|
||||
Application.DoEvents();
|
||||
|
||||
|
||||
if (Urls.Count > 0)
|
||||
{
|
||||
CurrentFile = pop();
|
||||
DownloadLocation = Path.Combine(Path.Combine(Path.Combine(Environment.GetEnvironmentVariable("LOCALAPPDATA"), "GameMaker-Studio"), "UpgradeZip"), Path.GetFileName(CurrentFile));
|
||||
|
||||
wc.DownloadFileAsync(new Uri(CurrentFile), DownloadLocation);
|
||||
}
|
||||
else
|
||||
{
|
||||
Application.Exit();
|
||||
}
|
||||
}
|
||||
private void Wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
|
||||
{
|
||||
downloadProgress.Value = e.ProgressPercentage;
|
||||
downloadStatus.Text = "Downloading: (File "+fileCount.ToString()+"/"+filesToDownload.ToString()+") "+Path.GetFileName(CurrentFile)+" "+e.BytesReceived.ToString()+"/"+e.TotalBytesToReceive.ToString()+" "+e.ProgressPercentage.ToString()+"%";
|
||||
Application.DoEvents();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="DotNetZip" version="1.9.1.8" targetFramework="net35" />
|
||||
<package id="HtmlAgilityPack" version="1.11.33" targetFramework="net35" />
|
||||
</packages>
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2021 Bluzume
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -0,0 +1,15 @@
|
|||
# GameMaker-Module-Downloader
|
||||
Minimalistic program to download gamemaker export modules
|
||||
|
||||
|
||||
Q) Why?
|
||||
A) Because gamemaker updater is very shit and keeps failing to download
|
||||
and modding the updater got annoying fast so i just made my own program for it ;d
|
||||
|
||||
Q) Can i pirate with this?
|
||||
A) This progrma only downloads whats set in "Addons" from license.plist.
|
||||
even if you edit the code to download everything, its not enough.
|
||||
because the 5piceIDE will check if you own the exports before enabling them
|
||||
|
||||
Q) Where does it download from?
|
||||
A) directly from YoYo Games Server.
|
BIN
Visual Studio Projects/ModuleDownloader/packages/DotNetZip.1.9.1.8/DotNetZip.1.9.1.8.nupkg
vendored
Normal file
BIN
Visual Studio Projects/ModuleDownloader/packages/DotNetZip.1.9.1.8/lib/net20/Ionic.Zip.dll
vendored
Normal file
18132
Visual Studio Projects/ModuleDownloader/packages/DotNetZip.1.9.1.8/lib/net20/Ionic.Zip.xml
vendored
Normal file
BIN
Visual Studio Projects/ModuleDownloader/packages/DotNetZip.1.9.1.8/lib/sl/Ionic.Zip.dll
vendored
Normal file
3071
Visual Studio Projects/ModuleDownloader/packages/HtmlAgilityPack.1.11.33/lib/Net35/HtmlAgilityPack.xml
vendored
Normal file
3098
Visual Studio Projects/ModuleDownloader/packages/HtmlAgilityPack.1.11.33/lib/Net40/HtmlAgilityPack.XML
vendored
Normal file
3234
Visual Studio Projects/ModuleDownloader/packages/HtmlAgilityPack.1.11.33/lib/Net45/HtmlAgilityPack.XML
vendored
Normal file
|
@ -0,0 +1,47 @@
|
|||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETStandard,Version=v2.0/",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETStandard,Version=v2.0": {},
|
||||
".NETStandard,Version=v2.0/": {
|
||||
"HtmlAgilityPack/1.11.33": {
|
||||
"dependencies": {
|
||||
"NETStandard.Library": "2.0.3"
|
||||
},
|
||||
"runtime": {
|
||||
"HtmlAgilityPack.dll": {}
|
||||
}
|
||||
},
|
||||
"Microsoft.NETCore.Platforms/1.1.0": {},
|
||||
"NETStandard.Library/2.0.3": {
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"HtmlAgilityPack/1.11.33": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"Microsoft.NETCore.Platforms/1.1.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==",
|
||||
"path": "microsoft.netcore.platforms/1.1.0",
|
||||
"hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512"
|
||||
},
|
||||
"NETStandard.Library/2.0.3": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==",
|
||||
"path": "netstandard.library/2.0.3",
|
||||
"hashPath": "netstandard.library.2.0.3.nupkg.sha512"
|
||||
}
|
||||
}
|
||||
}
|
2787
Visual Studio Projects/ModuleDownloader/packages/HtmlAgilityPack.1.11.33/lib/uap10.0/HtmlAgilityPack.XML
vendored
Normal file
|
@ -0,0 +1,35 @@
|
|||
// Test.cpp : This file contains the 'main' function. Program execution begins and ends there.
|
||||
//
|
||||
|
||||
#include <windows.h>
|
||||
#include <iostream>
|
||||
|
||||
char* GetMachineGuid()
|
||||
{
|
||||
HKEY hk;
|
||||
DWORD dwType = REG_SZ;
|
||||
static BYTE guid[0x1028];
|
||||
memset(guid, 0x00, 0x1028);
|
||||
DWORD sz = 0x1028;
|
||||
DWORD error = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Cryptography", 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &hk);
|
||||
error = RegQueryValueExW(hk, L"MachineGuid", NULL, &dwType, guid, &sz);
|
||||
RegCloseKey(hk);
|
||||
return (char*)guid;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
printf("Hello World!");
|
||||
GetMachineGuid();
|
||||
}
|
||||
|
||||
// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
|
||||
// Debug program: F5 or Debug > Start Debugging menu
|
||||
|
||||
// Tips for Getting Started:
|
||||
// 1. Use the Solution Explorer window to add/manage files
|
||||
// 2. Use the Team Explorer window to connect to source control
|
||||
// 3. Use the Output window to see build output and other messages
|
||||
// 4. Use the Error List window to view errors
|
||||
// 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
|
||||
// 6. In the future, to open this project again, go to File > Open > Project and select the .sln file
|
|
@ -0,0 +1,148 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>16.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{3b3e009b-bcef-4259-aaac-b7cd9deefd86}</ProjectGuid>
|
||||
<RootNamespace>Test</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v141_xp</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<PrecompiledHeaderFile />
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Test.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Test.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup />
|
||||
</Project>
|
|
@ -0,0 +1,39 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.3.32611.2
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UniversalGameMakerPatcher", "UniversalGameMakerPatcher.dll\UniversalGameMakerPatcher.dll.vcxproj", "{F1AB918F-7AF0-4536-A779-286A3A709558}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Test", "Test\Test.vcxproj", "{3B3E009B-BCEF-4259-AAAC-B7CD9DEEFD86}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{F1AB918F-7AF0-4536-A779-286A3A709558}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{F1AB918F-7AF0-4536-A779-286A3A709558}.Debug|x64.Build.0 = Debug|x64
|
||||
{F1AB918F-7AF0-4536-A779-286A3A709558}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{F1AB918F-7AF0-4536-A779-286A3A709558}.Debug|x86.Build.0 = Debug|Win32
|
||||
{F1AB918F-7AF0-4536-A779-286A3A709558}.Release|x64.ActiveCfg = Release|Win32
|
||||
{F1AB918F-7AF0-4536-A779-286A3A709558}.Release|x64.Build.0 = Release|Win32
|
||||
{F1AB918F-7AF0-4536-A779-286A3A709558}.Release|x86.ActiveCfg = Release|Win32
|
||||
{F1AB918F-7AF0-4536-A779-286A3A709558}.Release|x86.Build.0 = Release|Win32
|
||||
{3B3E009B-BCEF-4259-AAAC-B7CD9DEEFD86}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{3B3E009B-BCEF-4259-AAAC-B7CD9DEEFD86}.Debug|x64.Build.0 = Debug|x64
|
||||
{3B3E009B-BCEF-4259-AAAC-B7CD9DEEFD86}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{3B3E009B-BCEF-4259-AAAC-B7CD9DEEFD86}.Release|x64.ActiveCfg = Release|Win32
|
||||
{3B3E009B-BCEF-4259-AAAC-B7CD9DEEFD86}.Release|x64.Build.0 = Release|Win32
|
||||
{3B3E009B-BCEF-4259-AAAC-B7CD9DEEFD86}.Release|x86.ActiveCfg = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {722E28BC-7BCB-4A5D-B947-7B5C497AA467}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,176 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>16.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{f1ab918f-7af0-4536-a779-286a3a709558}</ProjectGuid>
|
||||
<RootNamespace>UniversalGameMakerPatcherdll</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>7.0</WindowsTargetPlatformVersion>
|
||||
<ProjectName>UniversalGameMakerPatcher</ProjectName>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v141_xp</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v141_xp</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)\..\..\UGP.gmx\datafiles</OutDir>
|
||||
<IntDir>$(SolutionDir)\$(Configuration)\</IntDir>
|
||||
<TargetName>UGP</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)\..\..\UGP.gmx\datafiles</OutDir>
|
||||
<IntDir>$(SolutionDir)\$(Configuration)\</IntDir>
|
||||
<TargetName>UGP</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;UNIVERSALGAMEMAKERPATCHERDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableUAC>false</EnableUAC>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;UNIVERSALGAMEMAKERPATCHERDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>
|
||||
</PrecompiledHeaderFile>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||
<EnableUAC>false</EnableUAC>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;UNIVERSALGAMEMAKERPATCHERDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableUAC>false</EnableUAC>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;UNIVERSALGAMEMAKERPATCHERDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableUAC>false</EnableUAC>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="framework.h" />
|
||||
<ClInclude Include="gm6.h" />
|
||||
<ClInclude Include="md5.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="dllmain.c" />
|
||||
<ClCompile Include="gm6.c" />
|
||||
<ClCompile Include="md5.c" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
|
@ -0,0 +1,39 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="framework.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="md5.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="gm6.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="dllmain.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="md5.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="gm6.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||
</PropertyGroup>
|
||||
</Project>
|
|
@ -0,0 +1,114 @@
|
|||
// dllmain.cpp : Defines the entry point for the DLL application.
|
||||
#include <windows.h>
|
||||
#include "md5.h"
|
||||
#include "gm6.h"
|
||||
|
||||
#define GMSTR __declspec(dllexport) char* __cdecl
|
||||
#define GMREAL __declspec(dllexport) double __cdecl
|
||||
|
||||
static char md5str[33];
|
||||
static BYTE guid[0x1028];
|
||||
static char gm6key[31];
|
||||
|
||||
GMSTR GetMachineGuid(void)
|
||||
{
|
||||
HKEY hk;
|
||||
DWORD dwType = REG_SZ;
|
||||
memset(guid, 0x00, 0x1028);
|
||||
DWORD sz = 0x1028;
|
||||
DWORD error = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &hk);
|
||||
error = RegQueryValueExA(hk, "MachineGuid", NULL, &dwType, guid, &sz);
|
||||
RegCloseKey(hk);
|
||||
return (char*)guid;
|
||||
}
|
||||
|
||||
GMSTR GenerateGM6Key(char* name) {
|
||||
uint8_t out_key[KEY_LEN];
|
||||
|
||||
keygen_gm6(name, out_key);
|
||||
|
||||
key_to_string(out_key, gm6key, sizeof(gm6key));
|
||||
|
||||
return gm6key;
|
||||
}
|
||||
|
||||
uint8_t* datahex(char* string) {
|
||||
|
||||
if (string == NULL)
|
||||
return NULL;
|
||||
|
||||
size_t slength = strlen(string);
|
||||
if ((slength % 2) != 0) // must be even
|
||||
return NULL;
|
||||
|
||||
size_t dlength = slength / 2;
|
||||
|
||||
uint8_t* data = malloc(dlength);
|
||||
memset(data, 0, dlength);
|
||||
|
||||
size_t index = 0;
|
||||
while (index < slength) {
|
||||
char c = string[index];
|
||||
int value = 0;
|
||||
if (c >= '0' && c <= '9')
|
||||
value = (c - '0');
|
||||
else if (c >= 'A' && c <= 'F')
|
||||
value = (10 + (c - 'A'));
|
||||
else if (c >= 'a' && c <= 'f')
|
||||
value = (10 + (c - 'a'));
|
||||
else {
|
||||
free(data);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
data[(index / 2)] += value << (((index + 1) % 2) * 4);
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
GMREAL SetBinKey(char* path, char* key, char* hexstr)
|
||||
{
|
||||
BYTE* binData = (BYTE*)datahex(hexstr);
|
||||
HKEY hk;
|
||||
DWORD dwType = REG_BINARY;
|
||||
DWORD sz = strlen(hexstr) / 2;
|
||||
DWORD error = RegOpenKeyExA(HKEY_CURRENT_USER, path, 0, KEY_SET_VALUE | KEY_CREATE_SUB_KEY | KEY_WOW64_64KEY, &hk);
|
||||
error = RegSetValueExA(hk, key, NULL, dwType, binData, sz);
|
||||
RegCloseKey(hk);
|
||||
return (double)error;
|
||||
}
|
||||
|
||||
GMSTR MD5(char* input)
|
||||
{
|
||||
MD5Context ctx;
|
||||
md5Init(&ctx);
|
||||
md5Update(&ctx, input, strlen(input));
|
||||
md5Finalize(&ctx);
|
||||
|
||||
MD5Context ctx2;
|
||||
md5Init(&ctx2);
|
||||
md5Update(&ctx2, ctx.digest, 16);
|
||||
md5Finalize(&ctx2);
|
||||
|
||||
memset(md5str, 0x00, 33);
|
||||
snprintf(md5str, 33, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", ctx2.digest[0], ctx2.digest[1], ctx2.digest[2], ctx2.digest[3], ctx2.digest[4], ctx2.digest[5], ctx2.digest[6], ctx2.digest[7], ctx2.digest[8], ctx2.digest[9], ctx2.digest[10], ctx2.digest[11], ctx2.digest[12], ctx2.digest[13], ctx2.digest[14], ctx2.digest[15]);
|
||||
return (char*)md5str;
|
||||
}
|
||||
|
||||
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
|
||||
{
|
||||
switch (ul_reason_for_call)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
case DLL_THREAD_ATTACH:
|
||||
case DLL_THREAD_DETACH:
|
||||
case DLL_PROCESS_DETACH:
|
||||
srand(time(0));
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
// Windows Header Files
|
||||
#include <windows.h>
|
|
@ -0,0 +1,447 @@
|
|||
#include "gm6.h"
|
||||
|
||||
static char key_name[6];
|
||||
|
||||
// The Mark Overmas Sequence.
|
||||
const uint8_t mark_overmars_seq[0x29] = { 0x01, 0x07, 0x11, 0x17, 0x19, 0x1b, 0x24, 0x27, 0x2b, 0x31, 0x33, 0x3d, 0x3f, 0x4d, 0x53, 0x59, 0x5e, 0x63, 0x68, 0x69, 0x76, 0x7f, 0x89, 0x8b, 0x97, 0x9b, 0x9e, 0xA6, 0xB9, 0xBD, 0xBF, 0xC6, 0xC9, 0xD3, 0xD6, 0xDE, 0xE5, 0xEA, 0xEB, 0xF5, 0xF9 };
|
||||
|
||||
|
||||
|
||||
int add_multiply(uint8_t* key_arr) {
|
||||
int sum = 0;
|
||||
for (int i = 0; i < KEY_LEN - 1; i++) {
|
||||
int c = key_arr[i];
|
||||
sum += (i + 1) * c;
|
||||
}
|
||||
return sum % 0x100;
|
||||
}
|
||||
|
||||
int check_checksum(uint8_t* key_arr) {
|
||||
int c = key_arr[KEY_LEN - 1];
|
||||
int chksum = add_multiply(key_arr);
|
||||
if (c == chksum) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
int trunc_c(int c) {
|
||||
while (c > 0xFF)
|
||||
c -= 0x100;
|
||||
|
||||
while (c < 0x100)
|
||||
c += 0x100;
|
||||
return c;
|
||||
}
|
||||
|
||||
uint8_t CheckThing(int inp)
|
||||
{
|
||||
int ret = 0;
|
||||
if (inp - 1 < 2)
|
||||
return 1;
|
||||
int max = inp - 3 + 1;
|
||||
for (int i = 2; inp % i; ++i)
|
||||
{
|
||||
if (!--max)
|
||||
return 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int IterateCheckThing(int start)
|
||||
{
|
||||
int i = 0;
|
||||
int ret = 2;
|
||||
do
|
||||
{
|
||||
if (CheckThing(++ret))
|
||||
++i;
|
||||
} while (start > i);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void gen_checksum(uint8_t* key_arr) {
|
||||
int curchk = key_arr[KEY_LEN - 1];
|
||||
int chksum = add_multiply(key_arr);
|
||||
if (curchk != chksum) {
|
||||
//printf("Updating checksum, %x -> %x\n", curchk, chksum);
|
||||
key_arr[KEY_LEN - 1] = (uint8_t)chksum;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void deobfuscate_key_pt1(uint8_t* key_arr, uint8_t* out_key, int chk2) {
|
||||
int start = 0x11;
|
||||
memcpy(out_key, key_arr, KEY_LEN);
|
||||
for (int i = 0; i < KEY_LEN; i++) {
|
||||
int32_t c = (key_arr[i] + 0x100);
|
||||
c -= (start * chk2);
|
||||
c = trunc_c(c);
|
||||
out_key[i] = (uint8_t)c;
|
||||
start += 0x1F;
|
||||
}
|
||||
}
|
||||
|
||||
void obfuscate_key_pt1(uint8_t* key_arr, uint8_t* out_key, int chk2) {
|
||||
int start = 0x11;
|
||||
memcpy(out_key, key_arr, KEY_LEN);
|
||||
for (int i = 0; i < KEY_LEN; i++) {
|
||||
int32_t c = (key_arr[i] + 0x100);
|
||||
c += (start * chk2);
|
||||
c = trunc_c(c);
|
||||
out_key[i] = (uint8_t)c;
|
||||
start += 0x1F;
|
||||
}
|
||||
}
|
||||
|
||||
void obfuscate_key_pt2(uint8_t* key_arr, uint8_t* out_key, uint8_t chk2) {
|
||||
|
||||
memcpy(out_key, key_arr, KEY_LEN);
|
||||
for (int i = 0; i < KEY_LEN; i++) {
|
||||
int res = IterateCheckThing(chk2 + ((i + 1) * (i + 1)));
|
||||
int c = (key_arr[i] + res);
|
||||
c = trunc_c(c);
|
||||
out_key[i] = (uint8_t)c;
|
||||
}
|
||||
}
|
||||
|
||||
void deobfuscate_key_pt2(uint8_t* key_arr, uint8_t* out_key, uint8_t chk2) {
|
||||
|
||||
memcpy(out_key, key_arr, KEY_LEN);
|
||||
for (int i = 0; i < KEY_LEN; i++) {
|
||||
int res = IterateCheckThing(chk2 + ((i + 1) * (i + 1)));
|
||||
int c = (key_arr[i] - res);
|
||||
c = trunc_c(c);
|
||||
out_key[i] = (uint8_t)c;
|
||||
}
|
||||
}
|
||||
|
||||
void obfuscate_key_pt3(uint8_t* key_arr, uint8_t* out_key, uint8_t chk2) {
|
||||
|
||||
memcpy(out_key, key_arr, KEY_LEN);
|
||||
|
||||
for (int i = 0; i < KEY_LEN - 1; i++) {
|
||||
int c = key_arr[i + 1] - (chk2 * key_arr[i]);
|
||||
c = trunc_c(c);
|
||||
out_key[i + 1] = (uint8_t)c;
|
||||
}
|
||||
}
|
||||
|
||||
void deobfuscate_key_pt3(uint8_t* key_arr, uint8_t* out_key, uint8_t chk2) {
|
||||
|
||||
memcpy(out_key, key_arr, KEY_LEN);
|
||||
|
||||
for (int i = 0; i < KEY_LEN - 1; i++) {
|
||||
int c = (chk2 * out_key[i]) + out_key[i + 1];
|
||||
c = trunc_c(c);
|
||||
out_key[i + 1] = (uint8_t)c;
|
||||
}
|
||||
}
|
||||
|
||||
void deobfuscate_key_pt4(uint8_t* key_arr, uint8_t* out_key, uint8_t chk1) {
|
||||
|
||||
memcpy(out_key, key_arr, KEY_LEN);
|
||||
|
||||
int seed = 1;
|
||||
for (int multi = 0x64; seed % 9 == 1; ++multi)
|
||||
seed = IterateCheckThing(multi + chk1);
|
||||
|
||||
|
||||
for (int i = 0x0; i < 0x9; i++) {
|
||||
int c = key_arr[seed * (i + 1) % 9];
|
||||
out_key[i] = (uint8_t)c;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void deobfuscate_key_pt5(uint8_t* key_arr, uint8_t* out_key, uint8_t chk1) {
|
||||
|
||||
memcpy(out_key, key_arr, KEY_LEN);
|
||||
int multi = 0xD;
|
||||
|
||||
for (int i = 0; i < KEY_LEN; i++) {
|
||||
int c = (key_arr[i] + 0x100) - (chk1 * multi);
|
||||
multi += 0x35;
|
||||
c = trunc_c(c);
|
||||
|
||||
out_key[i] = (uint8_t)c;
|
||||
}
|
||||
}
|
||||
|
||||
void obfuscate_key_pt5(uint8_t* key_arr, uint8_t* out_key, uint8_t chk1) {
|
||||
|
||||
memcpy(out_key, key_arr, KEY_LEN);
|
||||
int multi = 0xD;
|
||||
|
||||
for (int i = 0; i < KEY_LEN; i++) {
|
||||
int c = (key_arr[i] + 0x100) + (chk1 * multi);
|
||||
multi += 0x35;
|
||||
|
||||
c = trunc_c(c);
|
||||
|
||||
out_key[i] = (uint8_t)c;
|
||||
}
|
||||
}
|
||||
|
||||
void obfuscate_key_pt4(uint8_t* key_arr, uint8_t* out_key, uint8_t chk1) {
|
||||
deobfuscate_key_pt4(key_arr, out_key, chk1);
|
||||
}
|
||||
|
||||
|
||||
char* decode_name(int encoded_name)
|
||||
{
|
||||
memset(key_name, 0x00, 6);
|
||||
for (int i = 4; i >= 0; i--) {
|
||||
int c = (encoded_name % 0x1A) + 0x41;
|
||||
key_name[i] = c;
|
||||
encoded_name /= 0x1A;
|
||||
}
|
||||
return key_name;
|
||||
}
|
||||
|
||||
void sanitize_name(char* namein, char* nameout) {
|
||||
memset(nameout, 0, 6);
|
||||
|
||||
if (strlen(namein) != 5) {
|
||||
int sz = strlen(namein);
|
||||
|
||||
strncpy(nameout, "XXXXX", 5);
|
||||
|
||||
if (sz < 5) {
|
||||
memcpy(&nameout[5 - sz], namein, sz);
|
||||
}
|
||||
else if (sz > 5) {
|
||||
memcpy(nameout, &namein[sz - 5], 5);
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
strncpy(nameout, namein, 5);
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < 5; i++) {
|
||||
if (!(namein[i] >= 'A' && namein[i] <= 'Z')) {
|
||||
nameout[i] = 'X';
|
||||
}
|
||||
else {
|
||||
nameout[i] = namein[i];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int encode_name(char* name) {
|
||||
int total = 0;
|
||||
int multi = 1;
|
||||
|
||||
for (int i = strlen(name) - 1; i >= 0; i--) {
|
||||
total += (name[i] - 0x41) * multi;
|
||||
multi *= 0x1A;
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
|
||||
int final_key_check(uint8_t* key_arr, char* name, uint8_t chk2, uint8_t chk1, uint32_t exp_date, uint32_t timed) {
|
||||
|
||||
int encoded_name = 0;
|
||||
((uint8_t*)(&encoded_name))[0] = key_arr[0x5];
|
||||
((uint8_t*)(&encoded_name))[1] = key_arr[0x4];
|
||||
((uint8_t*)(&encoded_name))[2] = key_arr[0x3];
|
||||
|
||||
|
||||
int encoded_time = 0;
|
||||
((uint8_t*)(&encoded_time))[0] = key_arr[0x1];
|
||||
((uint8_t*)(&encoded_time))[1] = key_arr[0x0];
|
||||
encoded_time += 0x8EAE;
|
||||
|
||||
if (timed) {
|
||||
if (encoded_time != (exp_date + 0x8EAE)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int is_timed = key_arr[0x2];
|
||||
|
||||
if (is_timed >= 0xA && is_timed <= 0xF) {
|
||||
if (!timed) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (strcmp(decode_name(encoded_name), name) != 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t chk1chk = key_arr[0x7];
|
||||
uint8_t chk2chk = key_arr[0x8];
|
||||
|
||||
if (chk1 == chk1chk && chk2 == chk2chk) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void deobfuscate_key(uint8_t* key_arr, uint8_t* out_key, uint8_t* out_chk2, uint8_t* out_chk1) {
|
||||
char pt1_key[KEY_LEN];
|
||||
deobfuscate_key_pt1(key_arr, pt1_key, 0xD);
|
||||
uint8_t chk2 = pt1_key[0xA];
|
||||
|
||||
char pt2_key[KEY_LEN];
|
||||
deobfuscate_key_pt2(pt1_key, pt2_key, chk2);
|
||||
|
||||
|
||||
char pt3_key[KEY_LEN];
|
||||
deobfuscate_key_pt3(pt2_key, pt3_key, chk2);
|
||||
|
||||
|
||||
uint8_t chk1 = pt3_key[0x9];
|
||||
char pt4_key[KEY_LEN];
|
||||
deobfuscate_key_pt4(pt3_key, pt4_key, chk1);
|
||||
|
||||
|
||||
char pt5_key[KEY_LEN];
|
||||
deobfuscate_key_pt5(pt4_key, pt5_key, chk1);
|
||||
|
||||
|
||||
memcpy(out_key, pt5_key, KEY_LEN);
|
||||
|
||||
*out_chk2 = chk2;
|
||||
*out_chk1 = chk1;
|
||||
|
||||
|
||||
}
|
||||
|
||||
void obfuscate_key(uint8_t* key_arr, uint8_t* out_key, int chk2, int chk1) {
|
||||
|
||||
char pt5_key[KEY_LEN];
|
||||
obfuscate_key_pt5(key_arr, pt5_key, chk1);
|
||||
|
||||
char pt4_key[KEY_LEN];
|
||||
obfuscate_key_pt4(pt5_key, pt4_key, chk1);
|
||||
|
||||
pt4_key[0x9] = chk1;
|
||||
char pt3_key[KEY_LEN];
|
||||
obfuscate_key_pt3(pt4_key, pt3_key, chk2);
|
||||
|
||||
char pt2_key[KEY_LEN];
|
||||
obfuscate_key_pt2(pt3_key, pt2_key, chk2);
|
||||
pt2_key[0xA] = chk2;
|
||||
|
||||
char pt1_key[KEY_LEN];
|
||||
obfuscate_key_pt1(pt2_key, pt1_key, 0xD);
|
||||
|
||||
memcpy(out_key, pt1_key, KEY_LEN);
|
||||
|
||||
}
|
||||
|
||||
int check_key_6(uint8_t* key_arr, char* name, uint32_t exp_date, uint32_t timed) {
|
||||
if (check_checksum(key_arr)) {
|
||||
|
||||
uint8_t chk1;
|
||||
uint8_t chk2;
|
||||
uint8_t out_key[KEY_LEN];
|
||||
|
||||
deobfuscate_key(key_arr, out_key, &chk2, &chk1);
|
||||
|
||||
return final_key_check(out_key, name, chk2, chk1, exp_date, timed);
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void gen_key_6(char* name, uint8_t chk1, uint8_t chk2, uint32_t exp_date, uint32_t timed, uint8_t* out_key) {
|
||||
|
||||
uint8_t keydata[KEY_LEN];
|
||||
|
||||
for (int i = 0; i < KEY_LEN; i++) {
|
||||
keydata[i] = rand() % 0x100;
|
||||
}
|
||||
|
||||
keydata[0x7] = chk1;
|
||||
keydata[0x8] = chk2;
|
||||
|
||||
int encoded_name = encode_name(name);
|
||||
|
||||
keydata[0x5] = ((uint8_t*)(&encoded_name))[0];
|
||||
keydata[0x4] = ((uint8_t*)(&encoded_name))[1];
|
||||
keydata[0x3] = ((uint8_t*)(&encoded_name))[2];
|
||||
|
||||
|
||||
|
||||
int encoded_time = exp_date - 0x8EAE;
|
||||
keydata[0x1] = ((uint8_t*)(&encoded_time))[0];
|
||||
keydata[0x0] = ((uint8_t*)(&encoded_time))[1];
|
||||
|
||||
int is_timed = rand();
|
||||
if (timed) {
|
||||
is_timed = (rand() % 0x6) + 0xA;
|
||||
}
|
||||
else {
|
||||
is_timed = rand() % 0x100;
|
||||
if (is_timed >= 0xA && is_timed <= 0xF)
|
||||
is_timed += 0x10;
|
||||
}
|
||||
|
||||
keydata[0x2] = is_timed;
|
||||
|
||||
uint8_t obfus_key[KEY_LEN];
|
||||
obfuscate_key(keydata, obfus_key, chk2, chk1);
|
||||
gen_checksum(obfus_key);
|
||||
|
||||
memcpy(out_key, obfus_key, KEY_LEN);
|
||||
}
|
||||
|
||||
void key_to_string(uint8_t* key, char* out_str, int buffer_sz) {
|
||||
snprintf(out_str, buffer_sz, "%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X", key[0x0], key[0x1], key[0x2], key[0x3], key[0x4], key[0x5], key[0x6], key[0x7], key[0x8], key[0x9], key[0xA], key[0xB]);
|
||||
}
|
||||
|
||||
|
||||
void keygen_gm6(char* name, uint8_t* out_key) {
|
||||
char checked_name[6];
|
||||
sanitize_name(name, checked_name);
|
||||
uint8_t keybuf[KEY_LEN];
|
||||
|
||||
// the key data must survive the obfuscation step, while placing the chk1 and chk2 into the correct places
|
||||
// in the obfuscation steps, and the final checksum byte as well,
|
||||
// for this reason, key generation does not always work
|
||||
// so i simply retry forever until we find a key that does work.
|
||||
|
||||
while (1) {
|
||||
int chk1 = mark_overmars_seq[rand() % sizeof(mark_overmars_seq)];
|
||||
int chk2 = rand() % 0x100;
|
||||
int exp_date = rand() % 0xFFFF;
|
||||
|
||||
gen_key_6(checked_name, chk1, chk2, exp_date, 0, keybuf);
|
||||
if (check_key_6(keybuf, checked_name, exp_date, 0)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(out_key, keybuf, KEY_LEN);
|
||||
}
|
||||
#ifdef STANDALONE
|
||||
int main(int argc, char* argv[]) {
|
||||
srand(time(0));
|
||||
char keystr[31];
|
||||
uint8_t out_key[KEY_LEN];
|
||||
keygen_gm6(argv[1], out_key);
|
||||
key_to_string(out_key, keystr, sizeof(keystr));
|
||||
printf("Key found: %s", keystr);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// GM6 Keys
|
||||
// Freeware
|
||||
// 6f58-0ac7-90f2-533f-22f9-343a
|
||||
// Pyrofol
|
||||
// 6f58-0a44-6806-223f-22f9-3487
|
||||
// Silica
|
||||
// d655-6db3-4f53-43d4-a75f-6571
|
|
@ -0,0 +1,15 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
|
||||
#define KEY_LEN (0xC)
|
||||
//#define STANDALONE 1
|
||||
|
||||
|
||||
int check_key_6(uint8_t* key_arr, char* name, uint32_t exp_date, uint32_t timed);
|
||||
void gen_key_6(char* name, uint8_t chk1, uint8_t chk2, uint32_t exp_date, uint32_t timed, uint8_t* out_key);
|
||||
void keygen_gm6(char* name, uint8_t* out_key);
|
||||
void key_to_string(uint8_t* key, char* out_str, int buffer_sz);
|
|
@ -0,0 +1,256 @@
|
|||
/*
|
||||
* Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm
|
||||
* and modified slightly to be functionally identical but condensed into control structures.
|
||||
*/
|
||||
|
||||
#include "md5.h"
|
||||
|
||||
/*
|
||||
* Constants defined by the MD5 algorithm
|
||||
*/
|
||||
#define A 0x67452301
|
||||
#define B 0xefcdab89
|
||||
#define C 0x98badcfe
|
||||
#define D 0x10325476
|
||||
|
||||
static uint32_t S[] = { 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
|
||||
5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
|
||||
4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
|
||||
6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 };
|
||||
|
||||
static uint32_t K[] = { 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
|
||||
0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
|
||||
0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
|
||||
0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
|
||||
0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
|
||||
0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
|
||||
0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
|
||||
0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
|
||||
0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
|
||||
0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
|
||||
0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
|
||||
0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
|
||||
0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
|
||||
0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
|
||||
0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
|
||||
0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 };
|
||||
|
||||
/*
|
||||
* Padding used to make the size (in bits) of the input congruent to 448 mod 512
|
||||
*/
|
||||
static uint8_t PADDING[] = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
|
||||
/*
|
||||
* Initialize a context
|
||||
*/
|
||||
void md5Init(MD5Context* ctx) {
|
||||
ctx->size = (uint64_t)0;
|
||||
|
||||
ctx->buffer[0] = (uint32_t)A;
|
||||
ctx->buffer[1] = (uint32_t)B;
|
||||
ctx->buffer[2] = (uint32_t)C;
|
||||
ctx->buffer[3] = (uint32_t)D;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add some amount of input to the context
|
||||
*
|
||||
* If the input fills out a block of 512 bits, apply the algorithm (md5Step)
|
||||
* and save the result in the buffer. Also updates the overall size.
|
||||
*/
|
||||
|
||||
void md5Update(MD5Context* ctx, uint8_t* input_buffer, size_t input_len) {
|
||||
uint32_t input[16];
|
||||
unsigned int offset = ctx->size % 64;
|
||||
ctx->size += (uint64_t)input_len;
|
||||
|
||||
// Copy each byte in input_buffer into the next space in our context input
|
||||
for (unsigned int i = 0; i < input_len; ++i) {
|
||||
ctx->input[offset++] = (uint8_t) * (input_buffer + i);
|
||||
|
||||
// If we've filled our context input, copy it into our local array input
|
||||
// then reset the offset to 0 and fill in a new buffer
|
||||
// The local array input is a list of 16 32-bit words for use in the algorithm
|
||||
if (offset % 64 == 0) {
|
||||
for (unsigned int j = 0; j < 16; ++j) {
|
||||
// Convert to little-endian
|
||||
input[j] = (uint32_t)(ctx->input[(j * 4) + 3]) << 24 |
|
||||
(uint32_t)(ctx->input[(j * 4) + 2]) << 16 |
|
||||
(uint32_t)(ctx->input[(j * 4) + 1]) << 8 |
|
||||
(uint32_t)(ctx->input[(j * 4)]);
|
||||
}
|
||||
md5Step(ctx->buffer, input);
|
||||
offset = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Pad the current input to get to 448 bytes, append the size in bits to the very end,
|
||||
* and save the result of the final iteration into digest.
|
||||
*/
|
||||
void md5Finalize(MD5Context* ctx) {
|
||||
uint32_t input[16];
|
||||
unsigned int offset = ctx->size % 64;
|
||||
unsigned int padding_length = offset < 56 ? 56 - offset : (56 + 64) - offset;
|
||||
|
||||
// Fill in the padding andndo the changes to size that resulted from the update
|
||||
md5Update(ctx, PADDING, padding_length);
|
||||
ctx->size -= (uint64_t)padding_length;
|
||||
|
||||
// Do a final update (internal to this function)
|
||||
// Last two 32-bit words are the two halves of the size (converted from bytes to bits)
|
||||
for (unsigned int j = 0; j < 14; ++j) {
|
||||
input[j] = (uint32_t)(ctx->input[(j * 4) + 3]) << 24 |
|
||||
(uint32_t)(ctx->input[(j * 4) + 2]) << 16 |
|
||||
(uint32_t)(ctx->input[(j * 4) + 1]) << 8 |
|
||||
(uint32_t)(ctx->input[(j * 4)]);
|
||||
}
|
||||
input[14] = (uint32_t)(ctx->size * 8);
|
||||
input[15] = (uint32_t)((ctx->size * 8) >> 32);
|
||||
|
||||
md5Step(ctx->buffer, input);
|
||||
|
||||
// Move the result into digest
|
||||
// (Convert from little-endian)
|
||||
for (unsigned int i = 0; i < 4; ++i) {
|
||||
ctx->digest[(i * 4) + 0] = (uint8_t)((ctx->buffer[i] & 0x000000FF));
|
||||
ctx->digest[(i * 4) + 1] = (uint8_t)((ctx->buffer[i] & 0x0000FF00) >> 8);
|
||||
ctx->digest[(i * 4) + 2] = (uint8_t)((ctx->buffer[i] & 0x00FF0000) >> 16);
|
||||
ctx->digest[(i * 4) + 3] = (uint8_t)((ctx->buffer[i] & 0xFF000000) >> 24);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Step on 512 bits of input with the main MD5 algorithm.
|
||||
*/
|
||||
void md5Step(uint32_t* buffer, uint32_t* input) {
|
||||
uint32_t AA = buffer[0];
|
||||
uint32_t BB = buffer[1];
|
||||
uint32_t CC = buffer[2];
|
||||
uint32_t DD = buffer[3];
|
||||
|
||||
uint32_t E;
|
||||
|
||||
unsigned int j;
|
||||
|
||||
for (unsigned int i = 0; i < 64; ++i) {
|
||||
switch (i / 16) {
|
||||
case 0:
|
||||
E = F(BB, CC, DD);
|
||||
j = i;
|
||||
break;
|
||||
case 1:
|
||||
E = G(BB, CC, DD);
|
||||
j = ((i * 5) + 1) % 16;
|
||||
break;
|
||||
case 2:
|
||||
E = H(BB, CC, DD);
|
||||
j = ((i * 3) + 5) % 16;
|
||||
break;
|
||||
default:
|
||||
E = I(BB, CC, DD);
|
||||
j = (i * 7) % 16;
|
||||
break;
|
||||
}
|
||||
|
||||
uint32_t temp = DD;
|
||||
DD = CC;
|
||||
CC = BB;
|
||||
BB = BB + rotate_left(AA + E + K[i] + input[j], S[i]);
|
||||
AA = temp;
|
||||
}
|
||||
|
||||
buffer[0] += AA;
|
||||
buffer[1] += BB;
|
||||
buffer[2] += CC;
|
||||
buffer[3] += DD;
|
||||
}
|
||||
|
||||
/*
|
||||
* Functions that will return a pointer to the hash of the provided input
|
||||
*/
|
||||
uint8_t* md5String(char* input) {
|
||||
MD5Context ctx;
|
||||
md5Init(&ctx);
|
||||
md5Update(&ctx, (uint8_t*)input, strlen(input));
|
||||
md5Finalize(&ctx);
|
||||
|
||||
uint8_t* result = malloc(16);
|
||||
memcpy(result, ctx.digest, 16);
|
||||
return result;
|
||||
}
|
||||
|
||||
uint8_t* md5File(FILE* file) {
|
||||
char* input_buffer = malloc(1024);
|
||||
size_t input_size = 0;
|
||||
|
||||
MD5Context ctx;
|
||||
md5Init(&ctx);
|
||||
|
||||
while ((input_size = fread(input_buffer, 1, 1024, file)) > 0) {
|
||||
md5Update(&ctx, (uint8_t*)input_buffer, input_size);
|
||||
}
|
||||
|
||||
md5Finalize(&ctx);
|
||||
|
||||
free(input_buffer);
|
||||
|
||||
uint8_t* result = malloc(16);
|
||||
memcpy(result, ctx.digest, 16);
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* Bit-manipulation functions defined by the MD5 algorithm
|
||||
*/
|
||||
uint32_t F(uint32_t X, uint32_t Y, uint32_t Z) {
|
||||
return (X & Y) | (~X & Z);
|
||||
}
|
||||
|
||||
uint32_t G(uint32_t X, uint32_t Y, uint32_t Z) {
|
||||
return (X & Z) | (Y & ~Z);
|
||||
}
|
||||
|
||||
uint32_t H(uint32_t X, uint32_t Y, uint32_t Z) {
|
||||
return X ^ Y ^ Z;
|
||||
}
|
||||
|
||||
uint32_t I(uint32_t X, uint32_t Y, uint32_t Z) {
|
||||
return Y ^ (X | ~Z);
|
||||
}
|
||||
|
||||
/*
|
||||
* Rotates a 32-bit word left by n bits
|
||||
*/
|
||||
uint32_t rotate_left(uint32_t x, uint32_t n) {
|
||||
return (x << n) | (x >> (32 - n));
|
||||
}
|
||||
|
||||
/*
|
||||
* Printing bytes from buffers or the hash
|
||||
*/
|
||||
void print_bytes(void* p, size_t length) {
|
||||
uint8_t* pp = (uint8_t*)p;
|
||||
for (unsigned int i = 0; i < length; ++i) {
|
||||
if (i && !(i % 16)) {
|
||||
printf("\n");
|
||||
}
|
||||
printf("%02X ", pp[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void print_hash(uint8_t* p) {
|
||||
for (unsigned int i = 0; i < 16; ++i) {
|
||||
printf("%02x", p[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef struct {
|
||||
uint64_t size; // Size of input in bytes
|
||||
uint32_t buffer[4]; // Current accumulation of hash
|
||||
uint8_t input[64]; // Input to be used in the next step
|
||||
uint8_t digest[16]; // Result of algorithm
|
||||
}MD5Context;
|
||||
|
||||
void md5Init(MD5Context* ctx);
|
||||
void md5Update(MD5Context* ctx, uint8_t* input, size_t input_len);
|
||||
void md5Finalize(MD5Context* ctx);
|
||||
void md5Step(uint32_t* buffer, uint32_t* input);
|
||||
|
||||
uint8_t* md5String(char* input);
|
||||
uint8_t* md5File(FILE* file);
|
||||
|
||||
uint32_t F(uint32_t X, uint32_t Y, uint32_t Z);
|
||||
uint32_t G(uint32_t X, uint32_t Y, uint32_t Z);
|
||||
uint32_t H(uint32_t X, uint32_t Y, uint32_t Z);
|
||||
uint32_t I(uint32_t X, uint32_t Y, uint32_t Z);
|
||||
|
||||
uint32_t rotate_left(uint32_t x, uint32_t n);
|
||||
|
||||
void print_bytes(void* p, size_t length);
|
||||
void print_hash(uint8_t * p);
|
||||
#pragma once
|
After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 67 KiB |