Add GM6
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
*/obj/*
|
||||||
|
*/bin/*
|
||||||
|
*/Release/*
|
||||||
|
*/Debug/*
|
317
Button.pdn
|
@ -1 +0,0 @@
|
||||||
Subproject commit d4bc191fed7b91c9859920e2e1b13974a2e6e7ce
|
|
|
@ -4,7 +4,7 @@
|
||||||
<datafile>
|
<datafile>
|
||||||
<name>libeay32.dll</name>
|
<name>libeay32.dll</name>
|
||||||
<filename>libeay32.dll</filename>
|
<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>
|
<exists>-1</exists>
|
||||||
<size>1207808</size>
|
<size>1207808</size>
|
||||||
<exportAction>2</exportAction>
|
<exportAction>2</exportAction>
|
||||||
|
@ -18,7 +18,7 @@
|
||||||
<datafile>
|
<datafile>
|
||||||
<name>UGP.dll</name>
|
<name>UGP.dll</name>
|
||||||
<filename>UGP.dll</filename>
|
<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>
|
<exists>-1</exists>
|
||||||
<size>93696</size>
|
<size>93696</size>
|
||||||
<exportAction>2</exportAction>
|
<exportAction>2</exportAction>
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
<datafile>
|
<datafile>
|
||||||
<name>ModuleDownloader.exe</name>
|
<name>ModuleDownloader.exe</name>
|
||||||
<filename>ModuleDownloader.exe</filename>
|
<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>
|
<exists>-1</exists>
|
||||||
<size>2146816</size>
|
<size>2146816</size>
|
||||||
<exportAction>2</exportAction>
|
<exportAction>2</exportAction>
|
||||||
|
|
|
@ -85,9 +85,12 @@ file_delete("ModuleDownloader.exe");
|
||||||
<arguments>
|
<arguments>
|
||||||
<argument>
|
<argument>
|
||||||
<kind>1</kind>
|
<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.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.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;
|
global.download_exports = false;
|
||||||
|
|
||||||
instance_create((room_width-(44/2))-10, (room_height-(44/2))-10, obj_mute);
|
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>
|
<kind>1</kind>
|
||||||
<string>global.active = "";
|
<string>global.active = "";
|
||||||
text = generate_gm5(obj_textinput_name_keygen.text, real(obj_textinput_version_keygen.text));
|
text = generate_gm5(obj_textinput_name_keygen.text, real(obj_textinput_version_keygen.text));
|
||||||
|
|
||||||
</string>
|
</string>
|
||||||
</argument>
|
</argument>
|
||||||
</arguments>
|
</arguments>
|
||||||
|
|
|
@ -179,8 +179,20 @@ global.flashing_msg = '"'+inputid+'"'+" Copied to clipboard!";
|
||||||
<arguments>
|
<arguments>
|
||||||
<argument>
|
<argument>
|
||||||
<kind>1</kind>
|
<kind>1</kind>
|
||||||
<string>global.active = inputid;
|
<string>/*
|
||||||
|
global.active = inputid;
|
||||||
keyboard_string = text;
|
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>
|
</string>
|
||||||
</argument>
|
</argument>
|
||||||
</arguments>
|
</arguments>
|
||||||
|
|
|
@ -16,7 +16,6 @@ total = 0;
|
||||||
multi = 1;
|
multi = 1;
|
||||||
for(i = 1; i <= string_length(name); i+=1) {
|
for(i = 1; i <= string_length(name); i+=1) {
|
||||||
c = ord(string_char_at(name, i));
|
c = ord(string_char_at(name, i));
|
||||||
show_debug_message("c "+string(i)+": "+string(c));
|
|
||||||
|
|
||||||
total += (c - 64) * multi;
|
total += (c - 64) * multi;
|
||||||
multi *= 30;
|
multi *= 30;
|
||||||
|
|
|
@ -19,6 +19,8 @@ var key_part_3;
|
||||||
var checksum;
|
var checksum;
|
||||||
var key;
|
var key;
|
||||||
|
|
||||||
|
var ename;
|
||||||
|
|
||||||
name = argument0;
|
name = argument0;
|
||||||
version = argument1;
|
version = argument1;
|
||||||
|
|
||||||
|
@ -26,13 +28,24 @@ version = argument1;
|
||||||
// Pad name out with "X" (if its < 5 chars long)
|
// Pad name out with "X" (if its < 5 chars long)
|
||||||
new_name = string_upper(pad(name, 5, "X"));
|
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 5 characters from the end
|
||||||
start = (string_length(new_name) - 5)+1;
|
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
|
// Extract last 5 characters, into a 2 char and 3 char string
|
||||||
part_1 = string_copy(new_name, start, 2);
|
part_1 = string_copy(new_name, start, 2);
|
||||||
part_2 = string_copy(new_name, start+2, 3);
|
part_2 = string_copy(new_name, start+2, 3);
|
||||||
|
|
||||||
|
|
||||||
// Encode the name with base 0x1E
|
// Encode the name with base 0x1E
|
||||||
encoded_name_1 = encode_name_part(part_1, version);
|
encoded_name_1 = encode_name_part(part_1, version);
|
||||||
encoded_name_2 = encode_name_part(part_2, 0);
|
encoded_name_2 = encode_name_part(part_2, 0);
|
||||||
|
@ -55,6 +68,8 @@ while(check_blacklist(key)){
|
||||||
key = generate_gm5(name, version);
|
key = generate_gm5(name, version);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return key;
|
||||||
|
|
||||||
|
|
||||||
return key;
|
return key;
|
||||||
|
|
||||||
|
|
22
UGP.gmx/scripts/generate_gm6.gml
Normal file
|
@ -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;
|
17
UGP.gmx/scripts/script20.gml
Normal file
|
@ -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 |
25
Visual Studio Projects/ModuleDownloader/DownloadModules.sln
Normal file
|
@ -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
|
186
Visual Studio Projects/ModuleDownloader/DownloadModules/CDN.cs
Normal file
|
@ -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>
|
77
Visual Studio Projects/ModuleDownloader/DownloadModules/Form1.Designer.cs
generated
Normal file
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
1253
Visual Studio Projects/ModuleDownloader/DownloadModules/Form1.resx
Normal file
|
@ -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>
|
21
Visual Studio Projects/ModuleDownloader/LICENSE
Normal file
|
@ -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.
|
15
Visual Studio Projects/ModuleDownloader/README.md
Normal file
|
@ -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
|
BIN
gm5-sel.png
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
gm5-unsel.png
Normal file
After Width: | Height: | Size: 67 KiB |