Minecraft exit changes; Attempt fix RSA Padding

This commit is contained in:
khanhduytran0 2020-07-26 07:53:02 +07:00
parent 65f1de276f
commit f87771b5e0
4 changed files with 61 additions and 40 deletions

View File

@ -817,6 +817,10 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener,
} }
public static void fullyExit() { public static void fullyExit() {
if (!ExitManager.isExiting()) {
ExitManager.enableSystemExit();
System.exit(0);
}
ExitManager.stopExitLoop(); ExitManager.stopExitLoop();
} }
@ -982,56 +986,73 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener,
public void fixRSAPadding() throws Exception { public void fixRSAPadding() throws Exception {
// welcome to the territory of YOLO; I'll be your tour guide for today. // welcome to the territory of YOLO; I'll be your tour guide for today.
System.out.println("Before: " + KeyFactory.getInstance("RSA") + " ; " + KeyFactory.getInstance("RSA").getProvider().toString());
try { try {
/* /*
System.out.println(Cipher.getInstance("RSA")); System.out.println(Cipher.getInstance("RSA"));
System.out.println(Cipher.getInstance("RSA/ECB/PKCS1Padding")); System.out.println(Cipher.getInstance("RSA/ECB/PKCS1Padding"));
*/ */
if (android.os.Build.VERSION.SDK_INT >= 23) { // Marshmallow
// FUUUUU I DON'T KNOW FIXME
Cipher rsaPkcs1Cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
// Cipher.getInstance("RSA", rsaPkcs1Cipher.getProvider());
Cipher newRSACipher = Cipher.getInstance("RSA"); Cipher rsaPkcs1Cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
Cipher rsaCipher = Cipher.getInstance("RSA");
Field fieldPKCS1 = Provider.class.getDeclaredField("serviceMap"); for (Provider.Service ser : rsaPkcs1Cipher.getProvider().getServices()) {
fieldPKCS1.setAccessible(true); System.out.println(" - " + ser.getType() + ", " + ser.getAlgorithm());
Map /* <Provider.ServerKey, Provider.Service> */ mapPKCS1 = (Map) fieldPKCS1.get(rsaPkcs1Cipher.getProvider());
Field fieldRSA = Provider.class.getDeclaredField("serviceMap");
fieldRSA.setAccessible(true);
Map /* <Provider.ServerKey, Provider.Service> */ mapRSA = (Map) fieldRSA.get(newRSACipher.getProvider());
mapRSA.clear();
mapRSA.putAll(mapPKCS1);
} else {
ArrayList<Provider.Service> rsaList = Services.getServices("Cipher.RSA");
ArrayList<Provider.Service> rsaPkcs1List = Services.getServices("Cipher.RSA/ECB/PKCS1PADDING");
rsaList.clear();
rsaList.addAll(rsaPkcs1List);
} }
Provider.Service servicePkcs1 = rsaPkcs1Cipher.getProvider().getService("Cipher", "RSA/ECB/PKCS1Padding");
Provider rsaProvider = rsaCipher.getProvider();
Map pkcs1Map = new ArrayMap();
for (Map.Entry entry : servicePkcs1.getProvider().entrySet()) {
pkcs1Map.put(entry.getKey(), entry.getValue());
}
if (Build.VERSION.SDK_INT < 24) {
rsaProvider.putAll(pkcs1Map);
} else {
// Method rsaMethod_clear = rsaProvider.getClass().getDeclaredMethod("implClear");
Method rsaMethod_putAll = rsaProvider.getClass().getDeclaredMethod("implPutAll", Map.class);
// rsaMethod_clear.setAccessible(true);
rsaMethod_putAll.setAccessible(true);
// rsaMethod_clear.invoke(rsaProvider);
rsaMethod_putAll.invoke(rsaProvider, pkcs1Map);
}
/*
if (android.os.Build.VERSION.SDK_INT >= 23) { // Marshmallow
// FUUUUU I DON'T KNOW FIXME
} else {
ArrayList<Provider.Service> rsaList = Services.getServices("Cipher.RSA");
ArrayList<Provider.Service> rsaPkcs1List = Services.getServices("Cipher.RSA/ECB/PKCS1PADDING");
rsaList.clear();
rsaList.addAll(rsaPkcs1List);
}
*/
} catch (Throwable th) { } catch (Throwable th) {
// Tools.dialogOnUiThread(MainActivity.this, "Warning: can't fix RSA Padding", Log.getStackTraceString(th));
th.printStackTrace(); th.printStackTrace();
runOnUiThread(new Runnable(){ runOnUiThread(new Runnable(){
@Override @Override
public void run() public void run() {
{ Toast.makeText(MainActivity.this, "Unable to fix RSAPadding. Premium features is limited!", Toast.LENGTH_LONG).show();
Toast.makeText(MainActivity.this, "Unable to fix RSAPadding. You can't play premium servers", Toast.LENGTH_LONG).show();
} }
}); });
} }
//System.out.println("After: " + KeyFactory.getInstance("RSA") + ":" + KeyFactory.getInstance("RSA").getProvider()); System.out.println("After: " + KeyFactory.getInstance("RSA") + " ; " + KeyFactory.getInstance("RSA").getProvider().toString());
/* Provider provider = KeyFactory.getInstance("RSA").getProvider(); /*
Provider provider = KeyFactory.getInstance("RSA").getProvider();
System.out.println("Before: " + provider.getService("KeyService", "RSA")); System.out.println("Before: " + provider.getService("KeyService", "RSA"));
Provider.Service service = provider.getService("KeyService", "RSA/ECB/PKCS5Padding"); Provider.Service service = provider.getService("KeyService", "RSA/ECB/PKCS5Padding");
System.out.println(service); System.out.println(service);
provider.putService(service); provider.putService(service);
System.out.println("After: " + provider.getService("KeyService", "RSA"));*/ System.out.println("After: " + provider.getService("KeyService", "RSA"));
*/
} }
public void printStream(InputStream stream) { public void printStream(InputStream stream) {
@ -1185,7 +1206,7 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener,
} }
// If we are unable to enable exit, use method: kill myself. // If we are unable to enable exit, use method: kill myself.
android.os.Process.killProcess(android.os.Process.myPid()); // android.os.Process.killProcess(android.os.Process.myPid());
// Toast.makeText(MainActivity.this, "Could not exit. Please force close this app.", Toast.LENGTH_LONG).show(); // Toast.makeText(MainActivity.this, "Could not exit. Please force close this app.", Toast.LENGTH_LONG).show();
} }

View File

@ -426,11 +426,13 @@ public final class Tools
public static File lastFileModified(String dir) { public static File lastFileModified(String dir) {
File fl = new File(dir); File fl = new File(dir);
File[] files = fl.listFiles(new FileFilter() { File[] files = fl.listFiles(new FileFilter() {
public boolean accept(File file) { public boolean accept(File file) {
return file.isFile(); return file.isFile();
} }
}); });
long lastMod = Long.MIN_VALUE; long lastMod = Long.MIN_VALUE;
File choice = null; File choice = null;
for (File file : files) { for (File file : files) {
@ -439,6 +441,7 @@ public final class Tools
lastMod = file.lastModified(); lastMod = file.lastModified();
} }
} }
return choice; return choice;
} }

View File

@ -3,7 +3,7 @@ package net.kdt.pojavlaunch.exit;
import java.lang.reflect.*; import java.lang.reflect.*;
public class ExitManager { public class ExitManager {
private static boolean stopLoop = false; private static boolean stopLoop = true;
private static ExitTrappedListener listener; private static ExitTrappedListener listener;
private static Thread exitTrappedHook = new Thread(new Runnable(){ private static Thread exitTrappedHook = new Thread(new Runnable(){
@ -12,25 +12,22 @@ public class ExitManager {
public void run() public void run()
{ {
if (listener != null) listener.onExitTrapped(); if (listener != null) listener.onExitTrapped();
// Pre-check
// if (stopLoop) stopLoop = false;
while (true) { stopLoop = false;
if (stopLoop) {
stopLoop = false; while (!stopLoop) {
break;
}
// Make Thread hook never stop, then System.exit() never continue! // Make Thread hook never stop, then System.exit() never continue!
try { try {
Thread.sleep(1000); Thread.sleep(1000);
} catch (InterruptedException e) {} } catch (InterruptedException e) {}
} }
stopLoop = false;
} }
}); });
public static boolean isExiting() {
return !stopLoop;
}
public static void setExitTrappedListener(ExitTrappedListener l) { public static void setExitTrappedListener(ExitTrappedListener l) {
listener = l; listener = l;
} }

View File

@ -146,7 +146,7 @@
<string name="mcn_exit_title">Game exited</string> <string name="mcn_exit_title">Game exited</string>
<string name="mcn_exit_call">Exit</string> <string name="mcn_exit_call">Exit</string>
<string name="mcn_exit_crash">Game Crash detected! Click OK to exit.</string> <string name="mcn_exit_crash">Game Crash detected! Click OK to exit.</string>
<string name="mcn_exit_errcrash">Unable to locate crash!</string> <string name="mcn_exit_errcrash">Unable to locate crash! You may ignore this.</string>
<string name="mcn_exit_confirm">Are you sure want to force close?</string> <string name="mcn_exit_confirm">Are you sure want to force close?</string>
<!-- MainActivity: Control buttons --> <!-- MainActivity: Control buttons -->