Начинающий
- Статус
- Оффлайн
- Регистрация
- 9 Авг 2024
- Сообщения
- 112
- Реакции
- 2
Здравствуйте, это будет гайд как снимать с некоторых читов защиту. В пример идёт такая защита как InternalGuard. Вот код который выводит в консоль Hello World но только с обфускацией:
Гайд по деобфускации:
1. Определите точку вывода
Начните с метода l5 — это единственное место, где используется System.out.print. Он принимает строку s и печатает её, если h8 == true (а h8 всегда true из-за static { h8 = !false; }).
2. Проследите, откуда приходят строки
3. Разберите построение строки "Hello"
4. Разберите "World"
Уберите все ненужные вычисления, переменные и методы. Оставьте только логику сборки строки и вывода.
Вот деобфусцированный код:
Java:
public class X {
private static final int a1 = 7;
private static final String b2 = "H";
private static final char c3 = 'e';
private static final long d4 = 123456789L;
private static final double e5 = 3.14159;
private static int f6 = 42;
private static String g7 = "";
private static boolean h8 = true;
public static void main(String[] args) {
int z9 = a1 * 2 - 14;
String y10 = b2 + m1();
double x11 = e5 / 2 + z9;
long w12 = d4 % 1000;
char v13 = c3;
boolean u14 = h8 && true;
String t15 = "";
for (int i = 0; i < 5; i++) {
t15 = p2(t15, i);
}
int s16 = f6 / 2;
String r17 = y10 + t15;
double q18 = x11 * 1.5 - w12;
char p19 = n3(v13);
String o20 = r17 + k4(p19);
int n21 = s16 + z9 + 10;
boolean m22 = u14 || false;
if (m22) {
l5(o20);
}
int k23 = n21 - 15;
double j24 = q18 / 2;
String i25 = o20 + " ";
long h26 = w12 * 3;
String g27 = i25 + o6();
int f28 = k23 + s16;
double e29 = j24 - e5;
boolean d30 = m22 && h8;
if (d30) {
l5(g27);
}
int c31 = f28 / 2;
String b32 = g27 + r7();
long a33 = h26 % 100;
l5(b32);
}
private static String m1() {
int x = 5;
int y = x * 2;
char z = c3;
return String.valueOf(z) + "l";
}
private static String p2(String s, int i) {
if (i == 0) return s + "l";
if (i == 1) return s + "o";
if (i == 2) return s;
if (i == 3) return s;
return s;
}
private static char n3(char c) {
int temp = (int) c;
temp = temp + 1;
return (char) temp;
}
private static String k4(char c) {
String temp = "";
temp += c;
temp += "o";
return temp;
}
private static void l5(String s) {
double d = e5 * 2;
int x = f6 - 10;
if (h8) {
System.out.print(s);
}
}
private static String o6() {
String temp = "";
int x = a1 + 3;
temp += "W";
temp += "o";
return temp + r7();
}
private static String r7() {
int a = 10;
int b = a * 2;
int c = b / 4;
return "rld";
}
static {
f6 = f6 + 10;
g7 = "unused";
h8 = !false;
}
private static int unused1() {
return (int) (d4 / 1000);
}
private static double unused2() {
return e5 * f6;
}
private static void unused3() {
long temp = d4 + 100;
temp = temp * 2;
}
private static String unused4() {
return g7 + "test";
}
private static boolean unused5() {
return h8 && false;
}
private static char unused6() {
return (char) (c3 + 2);
}
private static int unused7() {
return a1 * f6;
}
private static String unused8() {
return b2 + "xyz";
}
private static double unused9() {
return e5 + 10.5;
}
private static long unused10() {
return d4 - 500;
}
}
Гайд по деобфускации:
1. Определите точку вывода
Начните с метода l5 — это единственное место, где используется System.out.print. Он принимает строку s и печатает её, если h8 == true (а h8 всегда true из-за static { h8 = !false; }).
2. Проследите, откуда приходят строки
- l5 вызывается трижды в main с аргументами: o20, g27, b32.
- Эти переменные строятся поэтапно:
- o20 = r17 + k4(p19) → "Hello".
- g27 = i25 + o6() → "Hello Wo".
- b32 = g27 + r7() → "Hello World".
3. Разберите построение строки "Hello"
- r17 = y10 + t15.
- y10 = b2 + m1() → b2 = "H", m1() возвращает "el", итог: "Hel".
- t15 строится в цикле через p2, добавляя "l" и "o" → "lo".
- p19 = n3(v13) → v13 = 'e', n3 увеличивает на 1 → 'f', но затем k4(p19) добавляет только "o" → "o".
- Итог: o20 = "Hel" + "lo" = "Hello".
4. Разберите "World"
- o6() возвращает "Wo" + r7().
- r7() всегда возвращает "rld".
- i25 = o20 + " " → "Hello ".
- g27 = i25 + o6() → "Hello Wo".
- b32 = g27 + r7() → "Hello World".
- Переменные вроде d4, e5, w12, q18 и методы unused1-unused10 не влияют на вывод. Это мусор для запутывания.
- Условия вроде if (m22) или if (d30) всегда выполняются из-за h8 = true.
Уберите все ненужные вычисления, переменные и методы. Оставьте только логику сборки строки и вывода.
Вот деобфусцированный код:
Java:
public class X {
public static void main(String[] args) {
System.out.print("Hello World");
}
}