-
Автор темы
- #1
Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:
- бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
- маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
- приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
- обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.
Спасибо!
Так-как многие просили а точнее никто делаю 2 часть
1.FlowObfuscation - этот метод обфускации просто добавляет если просто говоря то мусорный код вот пример:
До:
После:
Вот как выглядитего код обфускации ( примерный ):
2.NumbersModifier - меняет числа все и добавляет лишнее вот пример обфусцированый ( это моя версия переписаная в обычном колониал он другой)
3. LocalVariables - меняет название локальных переменных и тд йоу пример обфусцированого кода не нужен
Теперь зная все это приступим к написани, код своего обф я вам не дам но вот что я написал за +- час
Ну все йоу топавая обф майнкрафт 228 йоу написана класс ремап в 3 туториале будет йоууу
1.FlowObfuscation - этот метод обфускации просто добавляет если просто говоря то мусорный код вот пример:
До:
Код:
public class Main {
public static int result(int a, int b) {
return a + b;
}
public static void main(String[] args) {
int result = sumOfTwoNumbers(3, 5);
System.out.println(result);
}
}
Код:
public class Main{
public static int a1(int x, int y) {
if (x > y) {
return x + y;
} else {
return y + x;
}
}
public static int a2() {
return 5;
}
public static int a3() {
return 3;
}
public static int sumOfTwoNumbers(int a, int b) {
int temp = a1(a, b);
temp = a2() + temp;
return temp;
}
public static void main(String[] args) {
int result = sumOfTwoNumbers(a3(), a2());
System.out.println(result);
}
}
Код:
@Override
public void modify(ClassNode node) {
for (MethodNode method : node.methods) {
if (!method.name.startsWith("<")) {
for (AbstractInsnNode insnNode : method.instructions.toArray()) {
if (shouldObfuscate(insnNode)) {
int insertCount = 1 + RANDOM.nextInt(5);
for (int i = 0; i < insertCount; i++) {
insertRandomOperations(method, insnNode);
}
}
if (insnNode.getOpcode() == Opcodes.DUP) {
obfuscateDupMethod(method);
}
}
}
}
private void obfuscateDupMethod(MethodNode method) {
method.instructions.insert(new InsnNode(Opcodes.POP2));
method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
method.instructions.insert(new InsnNode(Opcodes.POP));
if (RANDOM.nextBoolean()) {
for (int i = 0; i < 2 + RANDOM.nextInt(5); i++) {
method.instructions.insert(new InsnNode(Opcodes.SWAP));
}
}
if (RANDOM.nextBoolean()) {
method.instructions.insert(new InsnNode(Opcodes.POP));
} else {
method.instructions.insert(new InsnNode(Opcodes.DUP));
method.instructions.insert(new InsnNode(Opcodes.POP2));
}
method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
}
}
Код:
public class Main {
public static void main(String[] args) {
long key = -164701876253981L;
int varIndex = 1;
long value1 = -2078941969276575294L;
long value2 = key ^ value1;
int value1X = (int) value2;
int a = 5;
int b = 10;
int c = a + b;
int xorValue1 = 2026340751;
int xorValue2 = 485239483;
c = c ^ xorValue1;
c = c ^ xorValue2;
System.out.println("Result: " + c);
}
}
Теперь зная все это приступим к написани, код своего обф я вам не дам но вот что я написал за +- час
LocalVariables:
package colonialobfuscator.transforms;
import static colonialobfuscator.guis.SettingsPanel.namesLenghtField;
import colonialobfuscator.utils.OutputUtil;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.LocalVariableNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.ParameterNode;
import colonialobfuscator.utils.NameGen;
import java.util.Random;
public class LocalVariables implements ClassModifier {
private static final Random RANDOM = new Random();
[USER=1367676]@override[/USER]
public void modify(ClassNode node) {
for (MethodNode method : node.methods) {
if (method.localVariables != null && method.localVariables.size() > 0) {
for (LocalVariableNode var : method.localVariables) {
String newName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
var.name = newName;
if (RANDOM.nextBoolean()) {
String alias = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
var.name += "_" + alias;
}
if (RANDOM.nextBoolean()) {
swapLocalVariables(method);
}
}
}
if (method.parameters != null && method.parameters.size() > 0) {
for (ParameterNode param : method.parameters) {
// Генерация нового имени для параметра
String newName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
param.name = newName;
if (RANDOM.nextBoolean()) {
insertHiddenParameter(method);
}
}
}
}
}
private void swapLocalVariables(MethodNode method) {
if (method.localVariables.size() > 1) {
int index1 = RANDOM.nextInt(method.localVariables.size());
int index2 = RANDOM.nextInt(method.localVariables.size());
LocalVariableNode var1 = method.localVariables.get(index1);
LocalVariableNode var2 = method.localVariables.get(index2);
String tempName = var1.name;
var1.name = var2.name;
var2.name = tempName;
}
}
private void insertHiddenParameter(MethodNode method) {
String hiddenName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
String none = "";
ParameterNode hiddenParam = new ParameterNode(none,1);
hiddenParam.name = hiddenName;
method.parameters.add(0, hiddenParam);
}
}
ObfNumber:
package colonialobfuscator.transforms;
import java.util.Random;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.IntInsnNode;
import org.objectweb.asm.tree.LdcInsnNode;
import org.objectweb.asm.tree.VarInsnNode;
public class ModifierNumbers implements ClassModifier {
private static final Random RANDOM = new Random();
[USER=1367676]@override[/USER]
public void modify(ClassNode classNode) {
classNode.methods.stream().forEach(mn -> {
long key = new Random().nextLong();
int varIndex = mn.maxLocals;
mn.maxLocals++;
InsnList keyStore = new InsnList();
keyStore.add(new LdcInsnNode(key));
keyStore.add(new VarInsnNode(LSTORE, varIndex));
mn.instructions.insertBefore(mn.instructions.getFirst(), keyStore);
for (AbstractInsnNode insn : mn.instructions.toArray()) {
if (isIntInsn(insn)) {
try {
int originalNum = getIntegerFromInsn(insn);
int value1 = RANDOM.nextInt();
int value2 = originalNum ^ value1;
InsnList insnList = new InsnList();
insnList.add(new LdcInsnNode(value1));
insnList.add(new LdcInsnNode(value2));
insnList.add(new InsnNode(IXOR));
insnList.add(new InsnNode(IXOR));
insnList.add(new LdcInsnNode(0));
mn.instructions.insertBefore(insn, insnList);
mn.instructions.remove(insn);
mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP));
mn.instructions.insertBefore(insn, new LdcInsnNode(0));
} catch (Exception e) {
e.printStackTrace();
}
} else if (isLongInsn(insn)) {
try {
long originalNum = getLongFromInsn(insn);
long value1 = new Random().nextLong();
long value2 = originalNum ^ value1;
InsnList insnList = new InsnList();
insnList.add(new LdcInsnNode(value1));
insnList.add(new LdcInsnNode(value2));
insnList.add(new InsnNode(LXOR));
insnList.add(new LdcInsnNode(0));
mn.instructions.insertBefore(insn, insnList);
mn.instructions.remove(insn);
mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP2));
} catch (Exception e) {
e.printStackTrace();
}
} else if (isFloatInsn(insn)) {
try {
float originalNum = getFloatFromInsn(insn);
int value1 = Float.floatToIntBits(originalNum);
int value2 = new Random().nextInt();
InsnList insnList = new InsnList();
insnList.add(new LdcInsnNode(value1));
insnList.add(new LdcInsnNode(value2));
insnList.add(new InsnNode(IXOR));
insnList.add(new InsnNode(I2F));
insnList.add(new LdcInsnNode(0.0f));
mn.instructions.insertBefore(insn, insnList);
mn.instructions.remove(insn);
mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP));
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
public static boolean isIntInsn(AbstractInsnNode insn) {
if (insn == null) {
return false;
}
int opcode = insn.getOpcode();
return ((opcode >= Opcodes.ICONST_M1 && opcode <= Opcodes.ICONST_5)
|| opcode == Opcodes.BIPUSH
|| opcode == Opcodes.SIPUSH
|| (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Integer));
}
public static boolean isLongInsn(AbstractInsnNode insn) {
int opcode = insn.getOpcode();
return (opcode == Opcodes.LCONST_0
|| opcode == Opcodes.LCONST_1
|| (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Long));
}
public static boolean isFloatInsn(AbstractInsnNode insn) {
int opcode = insn.getOpcode();
return (opcode >= Opcodes.FCONST_0 && opcode <= Opcodes.FCONST_2)
|| (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Float);
}
public static int getIntegerFromInsn(AbstractInsnNode insn) throws Exception {
int opcode = insn.getOpcode();
if (opcode >= Opcodes.ICONST_M1 && opcode <= Opcodes.ICONST_5) {
return opcode - 3;
} else if (insn instanceof IntInsnNode && insn.getOpcode() != Opcodes.NEWARRAY) {
return ((IntInsnNode) insn).operand;
} else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Integer) {
return (Integer) ((LdcInsnNode) insn).cst;
}
throw new Exception("Unexpected instruction");
}
public static long getLongFromInsn(AbstractInsnNode insn) throws Exception {
int opcode = insn.getOpcode();
if (opcode >= Opcodes.LCONST_0 && opcode <= Opcodes.LCONST_1) {
return opcode - 9;
} else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Long) {
return (Long) ((LdcInsnNode) insn).cst;
}
throw new Exception("Unexpected instruction");
}
public static float getFloatFromInsn(AbstractInsnNode insn) throws Exception {
int opcode = insn.getOpcode();
if (opcode >= Opcodes.FCONST_0 && opcode <= Opcodes.FCONST_2) {
return opcode - 11;
} else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Float) {
return (Float) ((LdcInsnNode) insn).cst;
}
throw new Exception("Unexpected instruction");
}
}