Compare commits

..

No commits in common. "master" and "v1.0" have entirely different histories.
master ... v1.0

7 changed files with 157 additions and 409 deletions

1
.gitignore vendored
View file

@ -50,4 +50,3 @@ modules.order
Module.symvers Module.symvers
Mkfile.old Mkfile.old
dkms.conf dkms.conf
.vs/*

View file

@ -1,36 +1,35 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 16
VisualStudioVersion = 16.0.30114.105 VisualStudioVersion = 16.0.30114.105
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinecraftEducationEdition", "MinecraftEducationEdition\MinecraftEducationEdition.vcxproj", "{917B2AEB-964D-4499-8108-4E356C91D5E9}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinecraftEducationEdition", "MinecraftEducationEdition\MinecraftEducationEdition.vcxproj", "{917B2AEB-964D-4499-8108-4E356C91D5E9}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64 Debug|x64 = Debug|x64
Debug|x86 = Debug|x86 Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64 Release|x64 = Release|x64
Release|x86 = Release|x86 Release|x86 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{917B2AEB-964D-4499-8108-4E356C91D5E9}.Debug|Any CPU.ActiveCfg = Debug|Win32 {917B2AEB-964D-4499-8108-4E356C91D5E9}.Debug|Any CPU.ActiveCfg = Debug|Win32
{917B2AEB-964D-4499-8108-4E356C91D5E9}.Debug|x64.ActiveCfg = Debug|x64 {917B2AEB-964D-4499-8108-4E356C91D5E9}.Debug|x64.ActiveCfg = Debug|x64
{917B2AEB-964D-4499-8108-4E356C91D5E9}.Debug|x64.Build.0 = Debug|x64 {917B2AEB-964D-4499-8108-4E356C91D5E9}.Debug|x64.Build.0 = Debug|x64
{917B2AEB-964D-4499-8108-4E356C91D5E9}.Debug|x86.ActiveCfg = Debug|Win32 {917B2AEB-964D-4499-8108-4E356C91D5E9}.Debug|x86.ActiveCfg = Debug|Win32
{917B2AEB-964D-4499-8108-4E356C91D5E9}.Debug|x86.Build.0 = Debug|Win32 {917B2AEB-964D-4499-8108-4E356C91D5E9}.Debug|x86.Build.0 = Debug|Win32
{917B2AEB-964D-4499-8108-4E356C91D5E9}.Release|Any CPU.ActiveCfg = Release|Win32 {917B2AEB-964D-4499-8108-4E356C91D5E9}.Release|Any CPU.ActiveCfg = Release|Win32
{917B2AEB-964D-4499-8108-4E356C91D5E9}.Release|Any CPU.Build.0 = Release|Win32 {917B2AEB-964D-4499-8108-4E356C91D5E9}.Release|x64.ActiveCfg = Release|x64
{917B2AEB-964D-4499-8108-4E356C91D5E9}.Release|x64.ActiveCfg = Release|x64 {917B2AEB-964D-4499-8108-4E356C91D5E9}.Release|x64.Build.0 = Release|x64
{917B2AEB-964D-4499-8108-4E356C91D5E9}.Release|x64.Build.0 = Release|x64 {917B2AEB-964D-4499-8108-4E356C91D5E9}.Release|x86.ActiveCfg = Release|Win32
{917B2AEB-964D-4499-8108-4E356C91D5E9}.Release|x86.ActiveCfg = Release|Win32 {917B2AEB-964D-4499-8108-4E356C91D5E9}.Release|x86.Build.0 = Release|Win32
{917B2AEB-964D-4499-8108-4E356C91D5E9}.Release|x86.Build.0 = Release|Win32 EndGlobalSection
EndGlobalSection GlobalSection(SolutionProperties) = preSolution
GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE
HideSolutionNode = FALSE EndGlobalSection
EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution
GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CBDDD1CF-AD3F-4107-B580-BFACEB76CBFF}
SolutionGuid = {CBDDD1CF-AD3F-4107-B580-BFACEB76CBFF} EndGlobalSection
EndGlobalSection EndGlobal
EndGlobal

View file

@ -2,33 +2,23 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <windows.h> #include <windows.h>
#include <io.h>
#include <psapi.h> #include <psapi.h>
#include <wchar.h>
#include <string.h>
#include <TlHelp32.h> #include <TlHelp32.h>
int* pointer_path; int* pointer_path;
int num_ptr; int num_ptr;
/*
* Gets the base address of the main module for any process id HMODULE* GetProcessBaseAddress(HANDLE process) // from stackoverflow
* I totally didnt steal this from StackOverflow.
*/
uintptr_t GetProcessBaseAddress(DWORD processId)
{ {
/* DWORD_PTR baseAddress = 0;
* Open the process HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS,TRUE,process);
*/
uintptr_t baseAddress = 0;
HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, processId);
HMODULE* moduleArray; HMODULE* moduleArray;
LPBYTE moduleArrayBytes; LPBYTE moduleArrayBytes;
DWORD bytesRequired; DWORD bytesRequired;
if (processHandle) if (processHandle)
{ {
// Enumarate through all process modules
if (EnumProcessModules(processHandle, NULL, 0, &bytesRequired)) if (EnumProcessModules(processHandle, NULL, 0, &bytesRequired))
{ {
if (bytesRequired) if (bytesRequired)
@ -42,11 +32,9 @@ uintptr_t GetProcessBaseAddress(DWORD processId)
moduleCount = bytesRequired / sizeof(HMODULE); moduleCount = bytesRequired / sizeof(HMODULE);
moduleArray = (HMODULE*)moduleArrayBytes; moduleArray = (HMODULE*)moduleArrayBytes;
// Get the first module in the process (main exe)
if (EnumProcessModules(processHandle, moduleArray, bytesRequired, &bytesRequired)) if (EnumProcessModules(processHandle, moduleArray, bytesRequired, &bytesRequired))
{ {
baseAddress = (uintptr_t)(moduleArray[0]); baseAddress = moduleArray[0];
} }
LocalFree(moduleArrayBytes); LocalFree(moduleArrayBytes);
@ -60,378 +48,203 @@ uintptr_t GetProcessBaseAddress(DWORD processId)
return baseAddress; return baseAddress;
} }
/*
* Obtains a process id from
* a given executable name
* (eg, Minecraft.Windows.exe)
* Returns NULL if not found.
*/
DWORD GetProcId(WCHAR* name)
{
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
// Save a snapshot of all open processes
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
// Get the first process
if (Process32First(snapshot, &entry) == TRUE)
{
// Enumerate through all processes
while (Process32Next(snapshot, &entry) == TRUE)
{
// Check if the file name matches
if (wcscmp(entry.szExeFile, name) == 0)
{
return entry.th32ProcessID;
}
}
}
// Remove the snapshot.
CloseHandle(snapshot);
return 0;
}
/*
* Entry Point - Runs when the program starts
*/
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
HWND hWnd = NULL;
FILE* ptr_file; FILE* ptr_file;
char MEE_POINTER_FILE[0x2048]; char MEE_POINTER_FILE[0x2048];
int LOGIN_STEP_VALUE = -1;
char* tmp;
#ifdef _WIN64 #ifdef _WIN64
printf_s("!!! x64 Version can ONLY be used for the 64 Bit Versions of the game!\n"); printf_s("!!! x64 Version can ONLY be used for the 64 Bit Versions of the game!\n");
#else #else
printf_s("!!! x86 Version can ONLY be used for the 32 Bit Versions of the game!\n"); printf_s("!!! x86 Version can ONLY be used for the 32 Bit Versions of the game!\n");
#endif #endif
/*
* Check for command line arguments:
*
* --help - Shows list of commands
* --ptr - Sets the filename to read pointer paths from
* --lstep - What to set the login step value to.
*/
strncpy_s(MEE_POINTER_FILE, 0x2048, "mee.ptr", 0x2048); if (argc == 1)
if(argc > 1)
{ {
for (int i = 0; i < argc; i++) strncpy_s(MEE_POINTER_FILE, 0x2048, "mee.ptr", 0x2048);
{ }
else
if (strcmp(argv[i], "--help") == 0) {
{ strncpy_s(MEE_POINTER_FILE, 0x2048, argv[1], 0x2048);
printf_s("--ptr <mee.ptr file>\n");
printf_s("--lstep <custom login step value>\n");
return;
}
if(strcmp(argv[i],"--ptr") == 0)
strncpy_s(MEE_POINTER_FILE, 0x2048, argv[i+1], 0x2048);
if (strcmp(argv[i], "--lstep") == 0)
LOGIN_STEP_VALUE = strtol(argv[i + 1], &tmp, 10);
}
printf_s("MEE.PTR FILE : %s\nLOGIN STEP VALUE: %i\n", MEE_POINTER_FILE, LOGIN_STEP_VALUE);
} }
/* // Read text file
* Parse Pointer Path File (mee.ptr)
* ASCII Hex Numbers, seperated by " > "
* And converts it to a array of intergers.
*/
printf_s("Loading %s\n", MEE_POINTER_FILE); printf_s("Loading %s\n", MEE_POINTER_FILE);
if ((_access(MEE_POINTER_FILE, 0)) != -1) // If the mee.ptr file exists AND the process has permission to read it.. if ((access(MEE_POINTER_FILE, 0)) != -1)
{ {
// Open the pointer file
fopen_s(&ptr_file, MEE_POINTER_FILE, "r"); fopen_s(&ptr_file, MEE_POINTER_FILE, "r");
/*
* This next part just gets the size
* of mee.ptr file
*/
// Seek to the end of the file
fseek(ptr_file, 0, SEEK_END); fseek(ptr_file, 0, SEEK_END);
// Get the current position
int sz = ftell(ptr_file)+1; int sz = ftell(ptr_file)+1;
// Seek to the start of the file
fseek(ptr_file, 0, SEEK_SET); fseek(ptr_file, 0, SEEK_SET);
/*
* Allocate a buffer the size of mee.ptr
* then read the contents of the mee.ptr file
* into that buffer
*/
// Allocate (sz) bytes of memory for the buffer.
char* file_contents = (char*)malloc(sz); char* file_contents = (char*)malloc(sz);
// Set the newly allocated buffer to all 0x00
memset(file_contents, 0x00, sz); memset(file_contents, 0x00, sz);
// Read the contents of mee.ptr into the buffer.
fread(file_contents, sz, 1, ptr_file); fread(file_contents, sz, 1, ptr_file);
/*
* Create a copy of the pointer path file buffer
* This is so we can scan through and mess with the pointers to it
* Without messing up the our original copy
*/
// Allocate (sz) bytes of memory for the buffer
char* work_buf = (char*)malloc(sz); char* work_buf = (char*)malloc(sz);
// Copy contents of previously read file into the new buffer
memcpy_s(work_buf, sz, file_contents, sz); memcpy_s(work_buf, sz, file_contents, sz);
/* num_ptr = 0;
* Count the total number of elements char* next_token1 = NULL;
* From mee.ptr file.
*/
// Set the total number of elements in the pointer path to 0
num_ptr = 0;
// Pointer to the next element, NULL for now.
char* next_token1 = NULL;
// Get a pointer to the first occurance of " > "
char* token = strtok_s(work_buf, " > ", &next_token1); char* token = strtok_s(work_buf, " > ", &next_token1);
// Repeat this until there is no more " > " left // Count number of ptrs
while (token != NULL) { while (token != NULL) {
// Get the pointer to the next " > ".
token = strtok_s(NULL, " > ",&next_token1); token = strtok_s(NULL, " > ",&next_token1);
// Add 1 to the total number of elements num_ptr += 1;
num_ptr ++;
} }
// Free up memory used for counting the list of elements
free(work_buf);
/*
* Create a new 2nd copy of the pointer path file buffer
*/
// Allocate buffer the size of the mee.ptr file
work_buf = (char*)malloc(sz);
// Copy contents of mee.ptr file into new buffer
memcpy_s(work_buf, sz, file_contents, sz);
/*
* Allocate the memory required for the interger array
* Then convert each ASCII Hex Code to an int
* And store it in the pointer paths array.
*/
// Allocate memory buffer the size of the required int array
pointer_path = (int*)malloc(num_ptr * sizeof(int)); pointer_path = (int*)malloc(num_ptr * sizeof(int));
// Pointer to the next element, NULL for now. work_buf = (char*)malloc(sz);
memcpy_s(work_buf, sz, file_contents, sz);
char* next_token2 = NULL; char* next_token2 = NULL;
// Get the pointer to the first element (seperated by " > ") char* tmp;
char* ptrs = strtok_s(work_buf, " > ",&next_token2); char* ptrs = strtok_s(work_buf, " > ",&next_token2);
// Convert the ascii string to a int value, and put it into the int array
pointer_path[0] = (int)strtol(ptrs, &tmp, 16); pointer_path[0] = (int)strtol(ptrs, &tmp, 16);
// Repeat until read all pointers // Use ptr
for(int i = 1; i < num_ptr; i++){ for(int i = 1; i < num_ptr; i++){
// Read the next element (seperated by " > ")
ptrs = strtok_s(NULL, " > ", &next_token2); ptrs = strtok_s(NULL, " > ", &next_token2);
// Convert the ascii string to a int value, and put it into the int array
pointer_path[i] = (int)strtol(ptrs, &tmp, 16); pointer_path[i] = (int)strtol(ptrs, &tmp, 16);
} }
// Finally close the mee.ptr file
fclose(ptr_file); fclose(ptr_file);
// Free up memory used for reading the list of elements
free(work_buf);
// Free up memory used for the file contents
free(file_contents);
printf_s("Loaded %s!\n", MEE_POINTER_FILE); printf_s("Loaded %s!\n", MEE_POINTER_FILE);
} }
else // If no mee.ptr file is found ... OR the process dont have permission to read it else
{ {
// Set number of elements to a default number printf_s("Failed, using default pointer path (MCEE 1.12.60 UWP x64)\n");
num_ptr = 8; num_ptr = 8;
// Allocate enough space for an int array of that size
pointer_path = (int*)malloc(num_ptr * sizeof(int)); pointer_path = (int*)malloc(num_ptr * sizeof(int));
#ifdef _WIN64 // This code is only included if the project is built as win64 version
printf_s("Failed, using default pointer path (MCEE 1.17.30 UWP x64)\n"); pointer_path[0] = 0x025949E0;
// Use a default pointer path. pointer_path[1] = 0x120;
pointer_path[0] = 0x3607D48; pointer_path[2] = 0x08;
pointer_path[1] = 0x0; pointer_path[3] = 0x38;
pointer_path[2] = 0x50; pointer_path[4] = 0x30;
pointer_path[3] = 0xA8; pointer_path[5] = 0x58;
pointer_path[4] = 0xE8; pointer_path[6] = 0x480;
pointer_path[5] = 0x0; pointer_path[7] = 0x0;
pointer_path[6] = 0x630;
pointer_path[7] = 0x10;
#else // if its NOT the win64 version..
printf_s("Failed, using default pointer path (MCEE 1.17.30 Win32 x86)\n");
// Use a default pointer path.
pointer_path[0] = 0x2CBF0FC;
pointer_path[1] = 0x0;
pointer_path[2] = 0x7C;
pointer_path[3] = 0x0;
pointer_path[4] = 0x68;
pointer_path[5] = 0xC;
pointer_path[6] = 0x2E4;
pointer_path[7] = 0x8;
#endif
} }
/* printf_s("\nPointer Path: ");
* Print the currently in use for (int i = 0; i < num_ptr; i++)
* pointer path to the output of the terminal
*/
// Print "Pointer Path: "
printf_s("\nPointer Path: ");
for (int i = 0; i < num_ptr; i++) // Repeat for all elements in the path
{ {
// Print the hex encoding of the current element printf_s("%x", pointer_path[i]);
printf_s("%x", pointer_path[i]); if (i != num_ptr - 1)
if (i != num_ptr - 1) // if its not the last element
{ {
// Print " > " printf_s(" > ");
printf_s(" > ");
} }
} }
// Print a newline printf_s("\n");
printf_s("\n");
/* // Hack the universe.
* This part is the part that actually patches
* Education edition's memory space
*/
// Process ID of minecraft educattion ediion application, (currently 0)
DWORD proc_id = 0;
printf_s("\nPlease open Minecraft Education Edition\n");
/* printf_s("\n\nPlease open Minecraft Education Edition\n");
* Repeatidly check if "Minecraft.Windows.exe" or "Minecraft.Win10.DX11.exe" is open while (hWnd == NULL)
*/
while (proc_id == 0)
{ {
proc_id = GetProcId(L"Minecraft.Windows.exe"); // Try to get the process ID for "Minecraft.Windows" hWnd = FindWindow(0, L"Minecraft: Education Edition");
if (proc_id == 0) // If the process ID is NULL (process not found)
proc_id = GetProcId(L"Minecraft.Win10.DX11.exe"); // Try to get the process ID for "Minecrat.Win10.DX11.exe"
} }
// Print the process ID printf_s("MCEE Window Handle: %x\n", hWnd);
DWORD proc_id;
GetWindowThreadProcessId(hWnd, &proc_id);
printf_s("MCEE Process ID: %x\n", proc_id); printf_s("MCEE Process ID: %x\n", proc_id);
// Try to open the process.
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, proc_id); HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, proc_id);
// Print the process handle printf_s("MCEE Process Handle: %x\n", hProcess);
printf_s("MCEE Process Handle: 0x%p\n", hProcess); #ifdef _WIN64
long long int baseAddress = (long long int)GetProcessBaseAddress(proc_id);
printf_s("MCEE Base Addr: %llx\n", baseAddress);
#else
int baseAddress = (int)GetProcessBaseAddress(hProcess);
printf_s("MCEE Base Addr: %x\n", baseAddress);
#endif
if (!hProcess) // If failed to open the process (eg no permission) if (!hProcess)
{ {
// Display a message box saying to try with admin rights
MessageBox(NULL, L"Cannot open process!\r\nTry \"Run as administrator\"", L"Error!", MB_OK + MB_ICONERROR); MessageBox(NULL, L"Cannot open process!\r\nTry \"Run as administrator\"", L"Error!", MB_OK + MB_ICONERROR);
} }
else else
{ {
// Base Address of the minecraft education edition process (NULL for now) // Read first ptr
uintptr_t baseAddress = 0; printf_s("Waiting for game to Initalize.\n");
while(baseAddress == 0) // Repeat until the base address is not NULL. #ifdef _WIN64
// Try to get the base address of the Minecraft Education Edition Process long long int cur_ptr = baseAddress + pointer_path[0];
baseAddress = GetProcessBaseAddress(proc_id); long long int ptr = 0;
#else
int cur_ptr = baseAddress + pointer_path[0];
int ptr = 0;
#endif
printf_s("MCEE Base Addr: 0x%p\n", (void*)baseAddress); while (ptr == 0)
printf_s("Waiting for game to initalize....\n");
read_ptr_path:
// recalculate base address idk why but this seems to be required.
baseAddress = GetProcessBaseAddress(proc_id);
// Read first element
uintptr_t first_ptr = pointer_path[0];
uintptr_t cur_ptr = baseAddress + first_ptr;
uintptr_t ptr = 0;
uintptr_t new_ptr = 0;
// Read first element from the games memory
ReadProcessMemory(hProcess, (LPCVOID)cur_ptr, &ptr, sizeof(uintptr_t), 0);
if (ptr == 0)
goto read_ptr_path;
/*
* Follow all elements
* in the path, until you reach
* the pointer to the login step value.
*/
for (int i = 1; i < num_ptr-1; i++)
{ {
#ifdef _WIN64
ReadProcessMemory(hProcess, cur_ptr, &ptr, sizeof(long long int), 0);
#else
ReadProcessMemory(hProcess, cur_ptr, &ptr, sizeof(int), 0);
#endif
}
printf_s("Pointer 1: %x == %x\n", cur_ptr, ptr);
for (int i = 1; i < num_ptr-1; i++) // Follow path...
{
#ifdef _WIN64
long long int new_ptr = 0;
#else
int new_ptr = 0;
#endif
cur_ptr = ptr + pointer_path[i]; cur_ptr = ptr + pointer_path[i];
ReadProcessMemory(hProcess, (LPCVOID)cur_ptr, &new_ptr, sizeof(uintptr_t), 0); #ifdef _WIN64
ReadProcessMemory(hProcess, cur_ptr, &new_ptr, sizeof(long long int), 0);
#else
ReadProcessMemory(hProcess, cur_ptr, &new_ptr, sizeof(int), 0);
#endif
if (new_ptr == 0) { if (new_ptr == 0) {
i -= 1; i -= 1;
goto read_ptr_path; continue;
} }
else else
{ {
ptr = new_ptr; ptr = new_ptr;
}
}
printf_s("Pointer %i: %x == %x\n", i, cur_ptr, ptr);
} }
// final addition // Wait for 0x1
ptr += pointer_path[num_ptr-1]; printf_s("Waiting for login screen.\n");
int login_stage = 0;
// Wait for Welcome Screen. while (1)
int login_step_value = 0;
ReadProcessMemory(hProcess, (LPCVOID)ptr, &login_step_value, sizeof(int), 0);
if (login_step_value != 0x0)
{ {
ReadProcessMemory(hProcess, (void*)ptr, &login_stage, sizeof(int), 0);
printf_s("Final Ptr: 0x%p\n", (void*)ptr); if (login_stage == 0x1 || login_stage == 0x4)
printf_s("Current Login Step: %i\n", login_step_value);
if (LOGIN_STEP_VALUE != -1)
{ {
printf_s("Trying login stage %i", LOGIN_STEP_VALUE); printf_s("Trying login stage 6...\n"); // Backwards Comp (1.9 and lower)
WriteProcessMemory(hProcess, (LPVOID)ptr, &LOGIN_STEP_VALUE, sizeof(int), 0); int login_success = 6;
goto finish; WriteProcessMemory(hProcess, (void*)ptr, &login_success, sizeof(int), 0);
Sleep(1 * 500);
printf_s("Trying login stage 8...\n");
login_success = 8;
WriteProcessMemory(hProcess, (void*)ptr, &login_success, sizeof(int), 0);
break;
} }
printf_s("Trying login stage 5...\n"); // Backwards Comp (0.xx)
int login_step_value = 5;
WriteProcessMemory(hProcess, (LPVOID)ptr, &login_step_value, sizeof(int), 0);
Sleep(1 * 200);
printf_s("Trying login stage 6...\n"); // Backwards Comp (1.9 and lower)
login_step_value = 6;
WriteProcessMemory(hProcess, (LPVOID)ptr, &login_step_value, sizeof(int), 0);
Sleep(1 * 200);
printf_s("Trying login stage 8...\n");
login_step_value = 8;
WriteProcessMemory(hProcess, (LPVOID)ptr, &login_step_value, sizeof(int), 0);
} }
else
goto read_ptr_path;
finish:
CloseHandle(hProcess); CloseHandle(hProcess);
printf_s("\nBlessed Be!\n"); printf_s("\nBlessed Be!\n");
Sleep(5 * 1000);
return 0; return 0;
} }
} }

View file

@ -23,33 +23,33 @@
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<ProjectGuid>{917b2aeb-964d-4499-8108-4e356c91d5e9}</ProjectGuid> <ProjectGuid>{917b2aeb-964d-4499-8108-4e356c91d5e9}</ProjectGuid>
<RootNamespace>MinecraftEducationEdition</RootNamespace> <RootNamespace>MinecraftEducationEdition</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
<ProjectName>MinecraftEducationEditionLoginSkip</ProjectName> <ProjectName>MinecraftEducationEdition</ProjectName>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
@ -91,10 +91,6 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<DebugInformationFormat>None</DebugInformationFormat>
<Optimization>MaxSpeed</Optimization>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
@ -138,7 +134,6 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>

View file

@ -12,55 +12,6 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS #undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (United States) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,5,0,0
PRODUCTVERSION 1,5,0,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "140904b0"
BEGIN
VALUE "CompanyName", "SilicaAndPina"
VALUE "FileDescription", "Skip the login screen in Minecraft Education Edition."
VALUE "FileVersion", "1.5.0.0"
VALUE "InternalName", "MEELoginSkip.exe"
VALUE "LegalCopyright", "MIT Licensed (2021)"
VALUE "OriginalFilename", "MEELoginSkip.exe"
VALUE "ProductName", "Minecarft Education Edtion Login Skip"
VALUE "ProductVersion", "1.5.0.0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x1409, 1200
END
END
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// English (United Kingdom) resources // English (United Kingdom) resources

View file

@ -1,11 +1,2 @@
# MCEELoginSkip # MCEELoginSkip
Skip Login Screen on Minecraft Education Edition Skip Login Screen on Minecraft Education Edition
you may need to open mee.ptr in notepad, and copy paste whatever ptr path for the version you are using,
for a somewhat-complete list, see here: https://gist.github.com/KuromeSan/73d76f784bdecedf4c571332572ebc63
arguments:
--help - show help screen
--lstep - set login step to a specific value
--ptr - use custom file as mee.ptr.