Смотрите видео ниже, чтобы узнать, как установить наш сайт в качестве веб-приложения на домашнем экране.
Примечание: Эта возможность может быть недоступна в некоторых браузерах.
В апдейтах нихуя не поменялось, c релиза 3 дня блять прошло) никаких прям крупных апдейтов не было)Посмотреть вложение 335465
Слушай а зачем тогда нужен ваш кряк если он не ласт? /del Крякните новый кидайте но сейчас от него нету смысла
Воркису нельзя в дизайндизайн похож на рисунок дцпшника
Вы это с помощью мода крякнули?Дарова Воркис и Винеку, знали ли вы то что шваркать юзеров и друзей плохо?
Привет вам от: MetaOne, CrashSyska, bespl1k, wlprince
И пламенный привет от Анабиоза и земельки!
Мы ведь ещё увидимся на божественной арене?...
Оригинальный JAR ->Пожалуйста, авторизуйтесь для просмотра ссылки.
Конечный JAR (готовый кряк) ->Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Воспроизвести кряк можете через ->
javelincracker:/* * Cracked by MetaOne * Join Kaelus -> https://dsc.gg/kaelus */ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.FieldInsnNode; import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.InsnNode; import org.objectweb.asm.tree.LabelNode; import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; public class JavelinClientCracker { private static final String AUTH_CLASS = "vorkis/481"; private static final String AUTH_METHOD = "break 269"; private static final String AUTH_DESC = "()V"; private static final String SUCCESS_FIELD = "439932"; private static final String CONT_CLASS = "vorkis/248"; private static final String CONT_METHOD = "class 815"; private static final String HWID_CLASS = "vorkis/0930"; private static final String HWID_METHOD = "public 0124"; private static final String HWID_DESC = "(Ljava/lang/String;)Z"; private static final String RPC_CLASS = "vorkis/269"; private static final String RPC_DECODER = "strictfp 313"; private static final String RPC_DESC = "(I)Ljava/lang/String;"; private static final String NOTIFY_CLASS = "dev/kaelus/notifier/Notify"; private static final String PROCESS_SPAWN = new String(new char[]{'e','x','e','c'}); public static void main(String[] args) throws Exception { if (args.length != 2) { System.err.println("Usage: JavelinClientCracker <input.jar> <output.jar>"); System.exit(2); } Path in = Paths.get(args[0]); Path out = Paths.get(args[1]); String fieldName, methodName, contName, hwidMethodName, rpcMethodName; try (ZipFile zin = new ZipFile(in.toFile())) { fieldName = findField(zin, AUTH_CLASS, SUCCESS_FIELD, "Ljava/lang/String;"); methodName = findMethod(zin, AUTH_CLASS, AUTH_METHOD, AUTH_DESC); contName = findMethod(zin, CONT_CLASS, CONT_METHOD, "()V"); hwidMethodName = findMethod(zin, HWID_CLASS, HWID_METHOD, HWID_DESC); rpcMethodName = findMethod(zin, RPC_CLASS, RPC_DECODER, RPC_DESC); } if (fieldName == null) throw new IllegalStateException("field 439932 not found in " + AUTH_CLASS); if (methodName == null) throw new IllegalStateException("method break 269 not found in " + AUTH_CLASS); if (contName == null) throw new IllegalStateException("continuation class 815 not found in " + CONT_CLASS); if (hwidMethodName == null) System.err.println("[cracker] WARN: " + HWID_CLASS + ".public 0124 not found"); if (rpcMethodName == null) System.err.println("[cracker] WARN: " + RPC_CLASS + ".strictfp 313 not found"); System.err.println("[cracker] field = " + visualize(fieldName)); System.err.println("[cracker] method = " + visualize(methodName)); System.err.println("[cracker] continuation= " + visualize(contName)); if (hwidMethodName != null) System.err.println("[cracker] hwid method = " + visualize(hwidMethodName)); if (rpcMethodName != null) System.err.println("[cracker] rpc decoder = " + visualize(rpcMethodName)); java.util.Map<String, java.util.Set<String>> rpcWrappers = new java.util.HashMap<>(); if (rpcMethodName != null) { java.util.Set<String> base = new java.util.HashSet<>(); base.add(rpcMethodName); rpcWrappers.put(RPC_CLASS, base); try (ZipFile zin = new ZipFile(in.toFile())) { boolean grew; do { grew = false; Enumeration<? extends ZipEntry> en = zin.entries(); while (en.hasMoreElements()) { ZipEntry e = en.nextElement(); if (!e.getName().startsWith("vorkis/") || !e.getName().endsWith(".class")) continue; ClassReader cr; try { cr = new ClassReader(zin.getInputStream(e).readAllBytes()); } catch (Throwable t) { continue; } ClassNode cn = new ClassNode(); try { cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); } catch (Throwable t) { continue; } if (cn.methods == null) continue; for (MethodNode mn : cn.methods) { if ((mn.access & Opcodes.ACC_STATIC) == 0) continue; if (!RPC_DESC.equals(mn.desc)) continue; if (mn.instructions == null) continue; String wrapped = wrapperOf(mn, rpcWrappers); if (wrapped == null) continue; java.util.Set<String> s = rpcWrappers.computeIfAbsent(cn.name, k -> new java.util.HashSet<>()); if (s.add(mn.name)) grew = true; } } } while (grew); } int total = rpcWrappers.values().stream().mapToInt(java.util.Set::size).sum(); System.err.println("[cracker] rpc decoder + wrappers across classes: " + total); } byte[] notifyBytes = buildNotifyClass(); boolean notifyAdded = false; int repaired = 0, repairFail = 0, authPatched = 0, hwidPatched = 0, rpcCallsPatched = 0; try (ZipFile zin = new ZipFile(in.toFile()); ZipOutputStream zout = new ZipOutputStream(Files.newOutputStream(out))) { zout.setLevel(9); Enumeration<? extends ZipEntry> entries = zin.entries(); while (entries.hasMoreElements()) { ZipEntry e = entries.nextElement(); ZipEntry copy = new ZipEntry(e.getName()); copy.setMethod(ZipEntry.DEFLATED); zout.putNextEntry(copy); if (!e.isDirectory()) { try (InputStream is = zin.getInputStream(e)) { byte[] raw = is.readAllBytes(); byte[] outBytes = raw; if (e.getName().startsWith("vorkis/") && e.getName().endsWith(".class")) { try { outBytes = repairClass(raw); if (outBytes != raw) repaired++; } catch (Throwable t) { outBytes = raw; repairFail++; } } if (e.getName().equals(AUTH_CLASS + ".class")) { outBytes = applyAuthPatch(outBytes, fieldName, methodName, contName); authPatched++; } if (hwidMethodName != null && e.getName().equals(HWID_CLASS + ".class")) { outBytes = applyHwidPatch(outBytes, hwidMethodName); hwidPatched++; } if (rpcMethodName != null && e.getName().equals(RPC_CLASS + ".class")) { int[] cnt = new int[]{0}; outBytes = applyRpcDecoderPrologue(outBytes, rpcMethodName, cnt); rpcCallsPatched += cnt[0]; } zout.write(outBytes); } } zout.closeEntry(); } ZipEntry notifyEntry = new ZipEntry(NOTIFY_CLASS + ".class"); notifyEntry.setMethod(ZipEntry.DEFLATED); zout.putNextEntry(notifyEntry); zout.write(notifyBytes); zout.closeEntry(); notifyAdded = true; } System.err.println("[cracker] repaired classes: " + repaired + " (fail=" + repairFail + ")"); System.err.println("[cracker] auth-patched: " + authPatched); System.err.println("[cracker] hwid-patched: " + hwidPatched); System.err.println("[cracker] rpc call-sites patched: " + rpcCallsPatched); System.err.println("[cracker] notify class added: " + notifyAdded); System.err.println("[cracker] wrote " + out); } private static byte[] repairClass(byte[] raw) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); boolean changed = false; if (cn.methods != null) { for (MethodNode mn : cn.methods) { if (mn.tryCatchBlocks == null || mn.instructions == null) continue; Set<LabelNode> live = new HashSet<>(); for (AbstractInsnNode insn : mn.instructions) { if (insn instanceof LabelNode ln) live.add(ln); } int before = mn.tryCatchBlocks.size(); mn.tryCatchBlocks.removeIf(tcb -> !live.contains(tcb.start) || !live.contains(tcb.end) || !live.contains(tcb.handler)); if (mn.tryCatchBlocks.size() != before) changed = true; } } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); cn.accept(cw); byte[] result = cw.toByteArray(); return changed || result.length != raw.length ? result : raw; } private static byte[] applyAuthPatch(byte[] raw, String fieldName, String methodName, String contName) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); for (MethodNode mn : cn.methods) { if (!methodName.equals(mn.name) || !AUTH_DESC.equals(mn.desc)) continue; String fakeBody = "{\"ok\":true,\"valid\":true,\"hasSubscription\":true}"; InsnList body = new InsnList(); body.add(new LdcInsnNode(fakeBody)); body.add(new FieldInsnNode(Opcodes.PUTSTATIC, AUTH_CLASS, fieldName, "Ljava/lang/String;")); body.add(new MethodInsnNode(Opcodes.INVOKESTATIC, NOTIFY_CLASS, "show", "()V", false)); body.add(new InsnNode(Opcodes.RETURN)); mn.instructions = body; if (mn.tryCatchBlocks != null) mn.tryCatchBlocks.clear(); if (mn.localVariables != null) mn.localVariables.clear(); mn.maxStack = 1; mn.maxLocals = 1; System.err.println("[cracker] body of " + visualize(mn.name) + mn.desc + " replaced"); } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static byte[] applyHwidPatch(byte[] raw, String methodName) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); for (MethodNode mn : cn.methods) { if (!methodName.equals(mn.name) || !HWID_DESC.equals(mn.desc)) continue; InsnList body = new InsnList(); body.add(new InsnNode(Opcodes.ICONST_1)); body.add(new InsnNode(Opcodes.IRETURN)); mn.instructions = body; if (mn.tryCatchBlocks != null) mn.tryCatchBlocks.clear(); if (mn.localVariables != null) mn.localVariables.clear(); mn.maxStack = 1; mn.maxLocals = 2; System.err.println("[cracker] body of " + visualize(mn.name) + mn.desc + " -> return true"); } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static byte[] applyRpcDecoderPrologue(byte[] raw, String rpcMethodName, int[] outCount) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); for (MethodNode mn : cn.methods) { if (!rpcMethodName.equals(mn.name) || !RPC_DESC.equals(mn.desc)) continue; org.objectweb.asm.tree.LabelNode notOurs = new org.objectweb.asm.tree.LabelNode(); InsnList prologue = new InsnList(); int[] keys = { 0, 3, 4, 5, 6, 7, 8, 9 }; String[] vals = { "by MetaOne", // idx 0 -> state "Cracked by Kaelus", // idx 3 -> button label "https://dsc.gg/kaelus", // idx 4 -> button URL "В одиночной игре | dsc.gg/kaelus", // idx 5 "В игре | dsc.gg/kaelus", // idx 6 "В главном меню | dsc.gg/kaelus", // idx 7 "В списке серверов | dsc.gg/kaelus", // idx 8 "В настройках | dsc.gg/kaelus" // idx 9 }; for (int i = 0; i < keys.length; i++) { org.objectweb.asm.tree.LabelNode skip = new org.objectweb.asm.tree.LabelNode(); prologue.add(new org.objectweb.asm.tree.VarInsnNode(Opcodes.ILOAD, 0)); prologue.add(new org.objectweb.asm.tree.IntInsnNode(Opcodes.BIPUSH, keys[i])); prologue.add(new org.objectweb.asm.tree.JumpInsnNode(Opcodes.IF_ICMPNE, skip)); prologue.add(new LdcInsnNode(vals[i])); prologue.add(new InsnNode(Opcodes.ARETURN)); prologue.add(skip); } mn.instructions.insertBefore(mn.instructions.getFirst(), prologue); outCount[0]++; System.err.println("[cracker] " + visualize(mn.name) + " prologue installed (idx 2/3/4 overridden)"); } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static byte[] applyRpcPatch(byte[] raw, java.util.Map<String, java.util.Set<String>> wrappers, int[] outCount) { ClassReader cr; try { cr = new ClassReader(raw); } catch (Throwable t) { return raw; } ClassNode cn = new ClassNode(); try { cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); } catch (Throwable t) { return raw; } boolean changed = false; if (cn.methods != null) { for (MethodNode mn : cn.methods) { if (mn.instructions == null) continue; AbstractInsnNode[] arr = mn.instructions.toArray(); for (AbstractInsnNode insn : arr) { if (insn.getOpcode() != Opcodes.INVOKESTATIC) continue; if (!(insn instanceof MethodInsnNode min)) continue; if (!RPC_DESC.equals(min.desc)) continue; java.util.Set<String> known = wrappers.get(min.owner); if (known == null || !known.contains(min.name)) continue; AbstractInsnNode prev = insn.getPrevious(); Integer idx = readIntPush(prev); if (idx == null) continue; String repl = switch (idx) { case 2 -> "Crackvelin 1.21.8"; case 3 -> "Cracked by Kaelus"; case 4 -> "https://dsc.gg/kaelus"; default -> null; }; if (repl == null) continue; mn.instructions.remove(prev); mn.instructions.set(insn, new LdcInsnNode(repl)); outCount[0]++; changed = true; } } } if (!changed) return raw; ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static String wrapperOf(MethodNode mn, java.util.Map<String, java.util.Set<String>> wrappers) { boolean sawILoad0 = false; boolean sawCall = false; String hit = null; for (AbstractInsnNode insn = mn.instructions.getFirst(); insn != null; insn = insn.getNext()) { int op = insn.getOpcode(); if (op < 0) continue; if (!sawILoad0) { if (op != Opcodes.ILOAD) return null; if (((org.objectweb.asm.tree.VarInsnNode) insn).var != 0) return null; sawILoad0 = true; continue; } if (!sawCall) { if (op != Opcodes.INVOKESTATIC) return null; MethodInsnNode mi = (MethodInsnNode) insn; if (!RPC_DESC.equals(mi.desc)) return null; java.util.Set<String> set = wrappers.get(mi.owner); if (set == null || !set.contains(mi.name)) return null; hit = mi.owner + "|" + mi.name; sawCall = true; continue; } if (op == Opcodes.ARETURN) return hit; return null; } return null; } private static byte[] buildNotifyClass() { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cw.visit(Opcodes.V21, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, NOTIFY_CLASS, null, "java/lang/Object", null); cw.visitField(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL, "DONE", "Ljava/util/concurrent/atomic/AtomicBoolean;", null, null).visitEnd(); org.objectweb.asm.MethodVisitor cl = cw.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null); cl.visitTypeInsn(Opcodes.NEW, "java/util/concurrent/atomic/AtomicBoolean"); cl.visitInsn(Opcodes.DUP); cl.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/concurrent/atomic/AtomicBoolean", "<init>", "()V", false); cl.visitFieldInsn(Opcodes.PUTSTATIC, NOTIFY_CLASS, "DONE", "Ljava/util/concurrent/atomic/AtomicBoolean;"); cl.visitInsn(Opcodes.RETURN); cl.visitMaxs(0, 0); cl.visitEnd(); org.objectweb.asm.MethodVisitor sh = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "show", "()V", null, null); org.objectweb.asm.Label exit = new org.objectweb.asm.Label(); sh.visitFieldInsn(Opcodes.GETSTATIC, NOTIFY_CLASS, "DONE", "Ljava/util/concurrent/atomic/AtomicBoolean;"); sh.visitInsn(Opcodes.ICONST_0); sh.visitInsn(Opcodes.ICONST_1); sh.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/atomic/AtomicBoolean", "compareAndSet", "(ZZ)Z", false); sh.visitJumpInsn(Opcodes.IFEQ, exit); sh.visitTypeInsn(Opcodes.NEW, "java/lang/Thread"); sh.visitInsn(Opcodes.DUP); org.objectweb.asm.Handle bsm = new org.objectweb.asm.Handle( Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;", false); org.objectweb.asm.Handle implMethod = new org.objectweb.asm.Handle( Opcodes.H_INVOKESTATIC, NOTIFY_CLASS, "run", "()V", false); sh.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", bsm, org.objectweb.asm.Type.getMethodType("()V"), implMethod, org.objectweb.asm.Type.getMethodType("()V")); sh.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Thread", "<init>", "(Ljava/lang/Runnable;)V", false); sh.visitInsn(Opcodes.DUP); sh.visitInsn(Opcodes.ICONST_1); sh.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Thread", "setDaemon", "(Z)V", false); sh.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Thread", "start", "()V", false); sh.visitLabel(exit); sh.visitInsn(Opcodes.RETURN); sh.visitMaxs(0, 0); sh.visitEnd(); org.objectweb.asm.MethodVisitor run = cw.visitMethod(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, "run", "()V", null, null); org.objectweb.asm.Label tryStart = new org.objectweb.asm.Label(); org.objectweb.asm.Label tryEnd = new org.objectweb.asm.Label(); org.objectweb.asm.Label catchAll = new org.objectweb.asm.Label(); run.visitTryCatchBlock(tryStart, tryEnd, catchAll, "java/lang/Throwable"); run.visitLabel(tryStart); run.visitLdcInsn(3000L); run.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Thread", "sleep", "(J)V", false); String psToast = "Add-Type -AssemblyName System.Windows.Forms;" + "Add-Type -AssemblyName System.Drawing;" + "$b = New-Object System.Windows.Forms.NotifyIcon;" + "$b.Icon = [System.Drawing.SystemIcons]::Information;" + "$b.BalloonTipTitle = 'Kaelus';" + "$b.BalloonTipText = 'Opezdol is here';" + "$b.Visible = $true;" + "$b.ShowBalloonTip(5000);" + "Start-Sleep -Seconds 6;" + "$b.Dispose()"; emitStringArray(run, new String[]{"powershell.exe","-NoProfile","-WindowStyle","Hidden","-Command", psToast}); run.visitVarInsn(Opcodes.ASTORE, 0); run.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); run.visitVarInsn(Opcodes.ALOAD, 0); run.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Runtime", PROCESS_SPAWN, "([Ljava/lang/String;)Ljava/lang/Process;", false); run.visitInsn(Opcodes.POP); emitStringArray(run, new String[]{"rundll32.exe", "url.dll,FileProtocolHandler", "https://dsc.gg/kaelus"}); run.visitVarInsn(Opcodes.ASTORE, 1); run.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); run.visitVarInsn(Opcodes.ALOAD, 1); run.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Runtime", PROCESS_SPAWN, "([Ljava/lang/String;)Ljava/lang/Process;", false); run.visitInsn(Opcodes.POP); run.visitLabel(tryEnd); run.visitInsn(Opcodes.RETURN); run.visitLabel(catchAll); run.visitInsn(Opcodes.POP); run.visitInsn(Opcodes.RETURN); run.visitMaxs(0, 0); run.visitEnd(); org.objectweb.asm.MethodVisitor init = cw.visitMethod(Opcodes.ACC_PRIVATE, "<init>", "()V", null, null); init.visitVarInsn(Opcodes.ALOAD, 0); init.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); init.visitInsn(Opcodes.RETURN); init.visitMaxs(0, 0); init.visitEnd(); cw.visitEnd(); return cw.toByteArray(); } private static void emitStringArray(org.objectweb.asm.MethodVisitor mv, String[] values) { if (values.length <= 5) mv.visitInsn(Opcodes.ICONST_0 + values.length); else mv.visitIntInsn(Opcodes.BIPUSH, values.length); mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/String"); for (int i = 0; i < values.length; i++) { mv.visitInsn(Opcodes.DUP); if (i <= 5) mv.visitInsn(Opcodes.ICONST_0 + i); else mv.visitIntInsn(Opcodes.BIPUSH, i); mv.visitLdcInsn(values[i]); mv.visitInsn(Opcodes.AASTORE); } } private static Integer readIntPush(AbstractInsnNode insn) { if (insn == null) return null; int op = insn.getOpcode(); if (op >= Opcodes.ICONST_M1 && op <= Opcodes.ICONST_5) return op - Opcodes.ICONST_0; if (op == Opcodes.BIPUSH || op == Opcodes.SIPUSH) { return ((org.objectweb.asm.tree.IntInsnNode) insn).operand; } if (op == Opcodes.LDC && insn instanceof LdcInsnNode ldc && ldc.cst instanceof Integer i) { return i; } return null; } private static String findField(ZipFile zin, String klass, String stripped, String desc) throws IOException { ZipEntry e = zin.getEntry(klass + ".class"); if (e == null) return null; ClassReader cr = new ClassReader(zin.getInputStream(e).readAllBytes()); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG | ClassReader.SKIP_CODE); if (cn.fields == null) return null; for (var f : cn.fields) if (stripHidden(f.name).equals(stripped) && desc.equals(f.desc)) return f.name; return null; } private static String findMethod(ZipFile zin, String klass, String stripped, String desc) throws IOException { ZipEntry e = zin.getEntry(klass + ".class"); if (e == null) return null; ClassReader cr = new ClassReader(zin.getInputStream(e).readAllBytes()); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG | ClassReader.SKIP_CODE); if (cn.methods == null) return null; for (var m : cn.methods) if (stripHidden(m.name).equals(stripped) && desc.equals(m.desc)) return m.name; return null; } private static String stripHidden(String s) { StringBuilder sb = new StringBuilder(s.length()); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == '' || c == '' || c == '' || c == '' || c == '' || c == '') continue; sb.append(c); } return sb.toString(); } private static String visualize(String s) { StringBuilder sb = new StringBuilder(s.length() + 16); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c < 0x20 || c == '' || c == '' || c == '' || c == '' || c == '' || c == '') { sb.append(String.format("[U+%04X]", (int) c)); } else sb.append(c); } return sb.toString(); } }
Посмотреть вложение 335451Посмотреть вложение 335454

что за хуйню ты несешь, тоесть по твоему если молоко было сделано не сегодня а месяц назад то оно просрочено?Посмотреть вложение 335465
Слушай а зачем тогда нужен ваш кряк если он не ласт? /del Крякните новый кидайте но сейчас от него нету смысла
соглс этого момента воркис идет нахуй
бумеранга не существует говорила картавостьДарова Воркис и Винеку, знали ли вы то что шваркать юзеров и друзей плохо?
Привет вам от: MetaOne, CrashSyska, bespl1k, wlprince
И пламенный привет от Анабиоза и земельки!
Мы ведь ещё увидимся на божественной арене?...
Оригинальный JAR ->Пожалуйста, авторизуйтесь для просмотра ссылки.
Конечный JAR (готовый кряк) ->Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Воспроизвести кряк можете через ->
javelincracker:/* * Cracked by MetaOne * Join Kaelus -> https://dsc.gg/kaelus */ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.FieldInsnNode; import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.InsnNode; import org.objectweb.asm.tree.LabelNode; import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; public class JavelinClientCracker { private static final String AUTH_CLASS = "vorkis/481"; private static final String AUTH_METHOD = "break 269"; private static final String AUTH_DESC = "()V"; private static final String SUCCESS_FIELD = "439932"; private static final String CONT_CLASS = "vorkis/248"; private static final String CONT_METHOD = "class 815"; private static final String HWID_CLASS = "vorkis/0930"; private static final String HWID_METHOD = "public 0124"; private static final String HWID_DESC = "(Ljava/lang/String;)Z"; private static final String RPC_CLASS = "vorkis/269"; private static final String RPC_DECODER = "strictfp 313"; private static final String RPC_DESC = "(I)Ljava/lang/String;"; private static final String NOTIFY_CLASS = "dev/kaelus/notifier/Notify"; private static final String PROCESS_SPAWN = new String(new char[]{'e','x','e','c'}); public static void main(String[] args) throws Exception { if (args.length != 2) { System.err.println("Usage: JavelinClientCracker <input.jar> <output.jar>"); System.exit(2); } Path in = Paths.get(args[0]); Path out = Paths.get(args[1]); String fieldName, methodName, contName, hwidMethodName, rpcMethodName; try (ZipFile zin = new ZipFile(in.toFile())) { fieldName = findField(zin, AUTH_CLASS, SUCCESS_FIELD, "Ljava/lang/String;"); methodName = findMethod(zin, AUTH_CLASS, AUTH_METHOD, AUTH_DESC); contName = findMethod(zin, CONT_CLASS, CONT_METHOD, "()V"); hwidMethodName = findMethod(zin, HWID_CLASS, HWID_METHOD, HWID_DESC); rpcMethodName = findMethod(zin, RPC_CLASS, RPC_DECODER, RPC_DESC); } if (fieldName == null) throw new IllegalStateException("field 439932 not found in " + AUTH_CLASS); if (methodName == null) throw new IllegalStateException("method break 269 not found in " + AUTH_CLASS); if (contName == null) throw new IllegalStateException("continuation class 815 not found in " + CONT_CLASS); if (hwidMethodName == null) System.err.println("[cracker] WARN: " + HWID_CLASS + ".public 0124 not found"); if (rpcMethodName == null) System.err.println("[cracker] WARN: " + RPC_CLASS + ".strictfp 313 not found"); System.err.println("[cracker] field = " + visualize(fieldName)); System.err.println("[cracker] method = " + visualize(methodName)); System.err.println("[cracker] continuation= " + visualize(contName)); if (hwidMethodName != null) System.err.println("[cracker] hwid method = " + visualize(hwidMethodName)); if (rpcMethodName != null) System.err.println("[cracker] rpc decoder = " + visualize(rpcMethodName)); java.util.Map<String, java.util.Set<String>> rpcWrappers = new java.util.HashMap<>(); if (rpcMethodName != null) { java.util.Set<String> base = new java.util.HashSet<>(); base.add(rpcMethodName); rpcWrappers.put(RPC_CLASS, base); try (ZipFile zin = new ZipFile(in.toFile())) { boolean grew; do { grew = false; Enumeration<? extends ZipEntry> en = zin.entries(); while (en.hasMoreElements()) { ZipEntry e = en.nextElement(); if (!e.getName().startsWith("vorkis/") || !e.getName().endsWith(".class")) continue; ClassReader cr; try { cr = new ClassReader(zin.getInputStream(e).readAllBytes()); } catch (Throwable t) { continue; } ClassNode cn = new ClassNode(); try { cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); } catch (Throwable t) { continue; } if (cn.methods == null) continue; for (MethodNode mn : cn.methods) { if ((mn.access & Opcodes.ACC_STATIC) == 0) continue; if (!RPC_DESC.equals(mn.desc)) continue; if (mn.instructions == null) continue; String wrapped = wrapperOf(mn, rpcWrappers); if (wrapped == null) continue; java.util.Set<String> s = rpcWrappers.computeIfAbsent(cn.name, k -> new java.util.HashSet<>()); if (s.add(mn.name)) grew = true; } } } while (grew); } int total = rpcWrappers.values().stream().mapToInt(java.util.Set::size).sum(); System.err.println("[cracker] rpc decoder + wrappers across classes: " + total); } byte[] notifyBytes = buildNotifyClass(); boolean notifyAdded = false; int repaired = 0, repairFail = 0, authPatched = 0, hwidPatched = 0, rpcCallsPatched = 0; try (ZipFile zin = new ZipFile(in.toFile()); ZipOutputStream zout = new ZipOutputStream(Files.newOutputStream(out))) { zout.setLevel(9); Enumeration<? extends ZipEntry> entries = zin.entries(); while (entries.hasMoreElements()) { ZipEntry e = entries.nextElement(); ZipEntry copy = new ZipEntry(e.getName()); copy.setMethod(ZipEntry.DEFLATED); zout.putNextEntry(copy); if (!e.isDirectory()) { try (InputStream is = zin.getInputStream(e)) { byte[] raw = is.readAllBytes(); byte[] outBytes = raw; if (e.getName().startsWith("vorkis/") && e.getName().endsWith(".class")) { try { outBytes = repairClass(raw); if (outBytes != raw) repaired++; } catch (Throwable t) { outBytes = raw; repairFail++; } } if (e.getName().equals(AUTH_CLASS + ".class")) { outBytes = applyAuthPatch(outBytes, fieldName, methodName, contName); authPatched++; } if (hwidMethodName != null && e.getName().equals(HWID_CLASS + ".class")) { outBytes = applyHwidPatch(outBytes, hwidMethodName); hwidPatched++; } if (rpcMethodName != null && e.getName().equals(RPC_CLASS + ".class")) { int[] cnt = new int[]{0}; outBytes = applyRpcDecoderPrologue(outBytes, rpcMethodName, cnt); rpcCallsPatched += cnt[0]; } zout.write(outBytes); } } zout.closeEntry(); } ZipEntry notifyEntry = new ZipEntry(NOTIFY_CLASS + ".class"); notifyEntry.setMethod(ZipEntry.DEFLATED); zout.putNextEntry(notifyEntry); zout.write(notifyBytes); zout.closeEntry(); notifyAdded = true; } System.err.println("[cracker] repaired classes: " + repaired + " (fail=" + repairFail + ")"); System.err.println("[cracker] auth-patched: " + authPatched); System.err.println("[cracker] hwid-patched: " + hwidPatched); System.err.println("[cracker] rpc call-sites patched: " + rpcCallsPatched); System.err.println("[cracker] notify class added: " + notifyAdded); System.err.println("[cracker] wrote " + out); } private static byte[] repairClass(byte[] raw) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); boolean changed = false; if (cn.methods != null) { for (MethodNode mn : cn.methods) { if (mn.tryCatchBlocks == null || mn.instructions == null) continue; Set<LabelNode> live = new HashSet<>(); for (AbstractInsnNode insn : mn.instructions) { if (insn instanceof LabelNode ln) live.add(ln); } int before = mn.tryCatchBlocks.size(); mn.tryCatchBlocks.removeIf(tcb -> !live.contains(tcb.start) || !live.contains(tcb.end) || !live.contains(tcb.handler)); if (mn.tryCatchBlocks.size() != before) changed = true; } } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); cn.accept(cw); byte[] result = cw.toByteArray(); return changed || result.length != raw.length ? result : raw; } private static byte[] applyAuthPatch(byte[] raw, String fieldName, String methodName, String contName) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); for (MethodNode mn : cn.methods) { if (!methodName.equals(mn.name) || !AUTH_DESC.equals(mn.desc)) continue; String fakeBody = "{\"ok\":true,\"valid\":true,\"hasSubscription\":true}"; InsnList body = new InsnList(); body.add(new LdcInsnNode(fakeBody)); body.add(new FieldInsnNode(Opcodes.PUTSTATIC, AUTH_CLASS, fieldName, "Ljava/lang/String;")); body.add(new MethodInsnNode(Opcodes.INVOKESTATIC, NOTIFY_CLASS, "show", "()V", false)); body.add(new InsnNode(Opcodes.RETURN)); mn.instructions = body; if (mn.tryCatchBlocks != null) mn.tryCatchBlocks.clear(); if (mn.localVariables != null) mn.localVariables.clear(); mn.maxStack = 1; mn.maxLocals = 1; System.err.println("[cracker] body of " + visualize(mn.name) + mn.desc + " replaced"); } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static byte[] applyHwidPatch(byte[] raw, String methodName) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); for (MethodNode mn : cn.methods) { if (!methodName.equals(mn.name) || !HWID_DESC.equals(mn.desc)) continue; InsnList body = new InsnList(); body.add(new InsnNode(Opcodes.ICONST_1)); body.add(new InsnNode(Opcodes.IRETURN)); mn.instructions = body; if (mn.tryCatchBlocks != null) mn.tryCatchBlocks.clear(); if (mn.localVariables != null) mn.localVariables.clear(); mn.maxStack = 1; mn.maxLocals = 2; System.err.println("[cracker] body of " + visualize(mn.name) + mn.desc + " -> return true"); } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static byte[] applyRpcDecoderPrologue(byte[] raw, String rpcMethodName, int[] outCount) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); for (MethodNode mn : cn.methods) { if (!rpcMethodName.equals(mn.name) || !RPC_DESC.equals(mn.desc)) continue; org.objectweb.asm.tree.LabelNode notOurs = new org.objectweb.asm.tree.LabelNode(); InsnList prologue = new InsnList(); int[] keys = { 0, 3, 4, 5, 6, 7, 8, 9 }; String[] vals = { "by MetaOne", // idx 0 -> state "Cracked by Kaelus", // idx 3 -> button label "https://dsc.gg/kaelus", // idx 4 -> button URL "В одиночной игре | dsc.gg/kaelus", // idx 5 "В игре | dsc.gg/kaelus", // idx 6 "В главном меню | dsc.gg/kaelus", // idx 7 "В списке серверов | dsc.gg/kaelus", // idx 8 "В настройках | dsc.gg/kaelus" // idx 9 }; for (int i = 0; i < keys.length; i++) { org.objectweb.asm.tree.LabelNode skip = new org.objectweb.asm.tree.LabelNode(); prologue.add(new org.objectweb.asm.tree.VarInsnNode(Opcodes.ILOAD, 0)); prologue.add(new org.objectweb.asm.tree.IntInsnNode(Opcodes.BIPUSH, keys[i])); prologue.add(new org.objectweb.asm.tree.JumpInsnNode(Opcodes.IF_ICMPNE, skip)); prologue.add(new LdcInsnNode(vals[i])); prologue.add(new InsnNode(Opcodes.ARETURN)); prologue.add(skip); } mn.instructions.insertBefore(mn.instructions.getFirst(), prologue); outCount[0]++; System.err.println("[cracker] " + visualize(mn.name) + " prologue installed (idx 2/3/4 overridden)"); } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static byte[] applyRpcPatch(byte[] raw, java.util.Map<String, java.util.Set<String>> wrappers, int[] outCount) { ClassReader cr; try { cr = new ClassReader(raw); } catch (Throwable t) { return raw; } ClassNode cn = new ClassNode(); try { cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); } catch (Throwable t) { return raw; } boolean changed = false; if (cn.methods != null) { for (MethodNode mn : cn.methods) { if (mn.instructions == null) continue; AbstractInsnNode[] arr = mn.instructions.toArray(); for (AbstractInsnNode insn : arr) { if (insn.getOpcode() != Opcodes.INVOKESTATIC) continue; if (!(insn instanceof MethodInsnNode min)) continue; if (!RPC_DESC.equals(min.desc)) continue; java.util.Set<String> known = wrappers.get(min.owner); if (known == null || !known.contains(min.name)) continue; AbstractInsnNode prev = insn.getPrevious(); Integer idx = readIntPush(prev); if (idx == null) continue; String repl = switch (idx) { case 2 -> "Crackvelin 1.21.8"; case 3 -> "Cracked by Kaelus"; case 4 -> "https://dsc.gg/kaelus"; default -> null; }; if (repl == null) continue; mn.instructions.remove(prev); mn.instructions.set(insn, new LdcInsnNode(repl)); outCount[0]++; changed = true; } } } if (!changed) return raw; ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static String wrapperOf(MethodNode mn, java.util.Map<String, java.util.Set<String>> wrappers) { boolean sawILoad0 = false; boolean sawCall = false; String hit = null; for (AbstractInsnNode insn = mn.instructions.getFirst(); insn != null; insn = insn.getNext()) { int op = insn.getOpcode(); if (op < 0) continue; if (!sawILoad0) { if (op != Opcodes.ILOAD) return null; if (((org.objectweb.asm.tree.VarInsnNode) insn).var != 0) return null; sawILoad0 = true; continue; } if (!sawCall) { if (op != Opcodes.INVOKESTATIC) return null; MethodInsnNode mi = (MethodInsnNode) insn; if (!RPC_DESC.equals(mi.desc)) return null; java.util.Set<String> set = wrappers.get(mi.owner); if (set == null || !set.contains(mi.name)) return null; hit = mi.owner + "|" + mi.name; sawCall = true; continue; } if (op == Opcodes.ARETURN) return hit; return null; } return null; } private static byte[] buildNotifyClass() { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cw.visit(Opcodes.V21, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, NOTIFY_CLASS, null, "java/lang/Object", null); cw.visitField(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL, "DONE", "Ljava/util/concurrent/atomic/AtomicBoolean;", null, null).visitEnd(); org.objectweb.asm.MethodVisitor cl = cw.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null); cl.visitTypeInsn(Opcodes.NEW, "java/util/concurrent/atomic/AtomicBoolean"); cl.visitInsn(Opcodes.DUP); cl.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/concurrent/atomic/AtomicBoolean", "<init>", "()V", false); cl.visitFieldInsn(Opcodes.PUTSTATIC, NOTIFY_CLASS, "DONE", "Ljava/util/concurrent/atomic/AtomicBoolean;"); cl.visitInsn(Opcodes.RETURN); cl.visitMaxs(0, 0); cl.visitEnd(); org.objectweb.asm.MethodVisitor sh = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "show", "()V", null, null); org.objectweb.asm.Label exit = new org.objectweb.asm.Label(); sh.visitFieldInsn(Opcodes.GETSTATIC, NOTIFY_CLASS, "DONE", "Ljava/util/concurrent/atomic/AtomicBoolean;"); sh.visitInsn(Opcodes.ICONST_0); sh.visitInsn(Opcodes.ICONST_1); sh.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/atomic/AtomicBoolean", "compareAndSet", "(ZZ)Z", false); sh.visitJumpInsn(Opcodes.IFEQ, exit); sh.visitTypeInsn(Opcodes.NEW, "java/lang/Thread"); sh.visitInsn(Opcodes.DUP); org.objectweb.asm.Handle bsm = new org.objectweb.asm.Handle( Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;", false); org.objectweb.asm.Handle implMethod = new org.objectweb.asm.Handle( Opcodes.H_INVOKESTATIC, NOTIFY_CLASS, "run", "()V", false); sh.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", bsm, org.objectweb.asm.Type.getMethodType("()V"), implMethod, org.objectweb.asm.Type.getMethodType("()V")); sh.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Thread", "<init>", "(Ljava/lang/Runnable;)V", false); sh.visitInsn(Opcodes.DUP); sh.visitInsn(Opcodes.ICONST_1); sh.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Thread", "setDaemon", "(Z)V", false); sh.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Thread", "start", "()V", false); sh.visitLabel(exit); sh.visitInsn(Opcodes.RETURN); sh.visitMaxs(0, 0); sh.visitEnd(); org.objectweb.asm.MethodVisitor run = cw.visitMethod(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, "run", "()V", null, null); org.objectweb.asm.Label tryStart = new org.objectweb.asm.Label(); org.objectweb.asm.Label tryEnd = new org.objectweb.asm.Label(); org.objectweb.asm.Label catchAll = new org.objectweb.asm.Label(); run.visitTryCatchBlock(tryStart, tryEnd, catchAll, "java/lang/Throwable"); run.visitLabel(tryStart); run.visitLdcInsn(3000L); run.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Thread", "sleep", "(J)V", false); String psToast = "Add-Type -AssemblyName System.Windows.Forms;" + "Add-Type -AssemblyName System.Drawing;" + "$b = New-Object System.Windows.Forms.NotifyIcon;" + "$b.Icon = [System.Drawing.SystemIcons]::Information;" + "$b.BalloonTipTitle = 'Kaelus';" + "$b.BalloonTipText = 'Opezdol is here';" + "$b.Visible = $true;" + "$b.ShowBalloonTip(5000);" + "Start-Sleep -Seconds 6;" + "$b.Dispose()"; emitStringArray(run, new String[]{"powershell.exe","-NoProfile","-WindowStyle","Hidden","-Command", psToast}); run.visitVarInsn(Opcodes.ASTORE, 0); run.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); run.visitVarInsn(Opcodes.ALOAD, 0); run.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Runtime", PROCESS_SPAWN, "([Ljava/lang/String;)Ljava/lang/Process;", false); run.visitInsn(Opcodes.POP); emitStringArray(run, new String[]{"rundll32.exe", "url.dll,FileProtocolHandler", "https://dsc.gg/kaelus"}); run.visitVarInsn(Opcodes.ASTORE, 1); run.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); run.visitVarInsn(Opcodes.ALOAD, 1); run.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Runtime", PROCESS_SPAWN, "([Ljava/lang/String;)Ljava/lang/Process;", false); run.visitInsn(Opcodes.POP); run.visitLabel(tryEnd); run.visitInsn(Opcodes.RETURN); run.visitLabel(catchAll); run.visitInsn(Opcodes.POP); run.visitInsn(Opcodes.RETURN); run.visitMaxs(0, 0); run.visitEnd(); org.objectweb.asm.MethodVisitor init = cw.visitMethod(Opcodes.ACC_PRIVATE, "<init>", "()V", null, null); init.visitVarInsn(Opcodes.ALOAD, 0); init.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); init.visitInsn(Opcodes.RETURN); init.visitMaxs(0, 0); init.visitEnd(); cw.visitEnd(); return cw.toByteArray(); } private static void emitStringArray(org.objectweb.asm.MethodVisitor mv, String[] values) { if (values.length <= 5) mv.visitInsn(Opcodes.ICONST_0 + values.length); else mv.visitIntInsn(Opcodes.BIPUSH, values.length); mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/String"); for (int i = 0; i < values.length; i++) { mv.visitInsn(Opcodes.DUP); if (i <= 5) mv.visitInsn(Opcodes.ICONST_0 + i); else mv.visitIntInsn(Opcodes.BIPUSH, i); mv.visitLdcInsn(values[i]); mv.visitInsn(Opcodes.AASTORE); } } private static Integer readIntPush(AbstractInsnNode insn) { if (insn == null) return null; int op = insn.getOpcode(); if (op >= Opcodes.ICONST_M1 && op <= Opcodes.ICONST_5) return op - Opcodes.ICONST_0; if (op == Opcodes.BIPUSH || op == Opcodes.SIPUSH) { return ((org.objectweb.asm.tree.IntInsnNode) insn).operand; } if (op == Opcodes.LDC && insn instanceof LdcInsnNode ldc && ldc.cst instanceof Integer i) { return i; } return null; } private static String findField(ZipFile zin, String klass, String stripped, String desc) throws IOException { ZipEntry e = zin.getEntry(klass + ".class"); if (e == null) return null; ClassReader cr = new ClassReader(zin.getInputStream(e).readAllBytes()); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG | ClassReader.SKIP_CODE); if (cn.fields == null) return null; for (var f : cn.fields) if (stripHidden(f.name).equals(stripped) && desc.equals(f.desc)) return f.name; return null; } private static String findMethod(ZipFile zin, String klass, String stripped, String desc) throws IOException { ZipEntry e = zin.getEntry(klass + ".class"); if (e == null) return null; ClassReader cr = new ClassReader(zin.getInputStream(e).readAllBytes()); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG | ClassReader.SKIP_CODE); if (cn.methods == null) return null; for (var m : cn.methods) if (stripHidden(m.name).equals(stripped) && desc.equals(m.desc)) return m.name; return null; } private static String stripHidden(String s) { StringBuilder sb = new StringBuilder(s.length()); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == '' || c == '' || c == '' || c == '' || c == '' || c == '') continue; sb.append(c); } return sb.toString(); } private static String visualize(String s) { StringBuilder sb = new StringBuilder(s.length() + 16); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c < 0x20 || c == '' || c == '' || c == '' || c == '' || c == '' || c == '') { sb.append(String.format("[U+%04X]", (int) c)); } else sb.append(c); } return sb.toString(); } }
Посмотреть вложение 335451Посмотреть вложение 335454
это уж точноВ апдейтах нихуя не поменялось, c релиза 3 дня блять прошло) никаких прям крупных апдейтов не было)
Воркису нельзя в дизайн
разве не воркис рогалик делалпричем тута рыгалик
vorkisразве не воркис рогалик делал
да ) (это норма Метаван зачем то сделал)
ПРивеТ, Я СТатиК РекВесТ, ХоЧеШ ммЕня?крякну
все тебя хотятПРивеТ, Я СТатиК РекВесТ, ХоЧеШ ммЕня?
че это за дерьмо вайбкодерскоеДарова Воркис и Винеку, знали ли вы то что шваркать юзеров и друзей плохо?
Привет вам от: MetaOne, CrashSyska, bespl1k, wlprince
И пламенный привет от Анабиоза и земельки!
Мы ведь ещё увидимся на божественной арене?...
Оригинальный JAR ->Пожалуйста, авторизуйтесь для просмотра ссылки.
Конечный JAR (готовый кряк) ->Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Воспроизвести кряк можете через ->
javelincracker:/* * Cracked by MetaOne * Join Kaelus -> https://dsc.gg/kaelus */ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.FieldInsnNode; import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.InsnNode; import org.objectweb.asm.tree.LabelNode; import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; public class JavelinClientCracker { private static final String AUTH_CLASS = "vorkis/481"; private static final String AUTH_METHOD = "break 269"; private static final String AUTH_DESC = "()V"; private static final String SUCCESS_FIELD = "439932"; private static final String CONT_CLASS = "vorkis/248"; private static final String CONT_METHOD = "class 815"; private static final String HWID_CLASS = "vorkis/0930"; private static final String HWID_METHOD = "public 0124"; private static final String HWID_DESC = "(Ljava/lang/String;)Z"; private static final String RPC_CLASS = "vorkis/269"; private static final String RPC_DECODER = "strictfp 313"; private static final String RPC_DESC = "(I)Ljava/lang/String;"; private static final String NOTIFY_CLASS = "dev/kaelus/notifier/Notify"; private static final String PROCESS_SPAWN = new String(new char[]{'e','x','e','c'}); public static void main(String[] args) throws Exception { if (args.length != 2) { System.err.println("Usage: JavelinClientCracker <input.jar> <output.jar>"); System.exit(2); } Path in = Paths.get(args[0]); Path out = Paths.get(args[1]); String fieldName, methodName, contName, hwidMethodName, rpcMethodName; try (ZipFile zin = new ZipFile(in.toFile())) { fieldName = findField(zin, AUTH_CLASS, SUCCESS_FIELD, "Ljava/lang/String;"); methodName = findMethod(zin, AUTH_CLASS, AUTH_METHOD, AUTH_DESC); contName = findMethod(zin, CONT_CLASS, CONT_METHOD, "()V"); hwidMethodName = findMethod(zin, HWID_CLASS, HWID_METHOD, HWID_DESC); rpcMethodName = findMethod(zin, RPC_CLASS, RPC_DECODER, RPC_DESC); } if (fieldName == null) throw new IllegalStateException("field 439932 not found in " + AUTH_CLASS); if (methodName == null) throw new IllegalStateException("method break 269 not found in " + AUTH_CLASS); if (contName == null) throw new IllegalStateException("continuation class 815 not found in " + CONT_CLASS); if (hwidMethodName == null) System.err.println("[cracker] WARN: " + HWID_CLASS + ".public 0124 not found"); if (rpcMethodName == null) System.err.println("[cracker] WARN: " + RPC_CLASS + ".strictfp 313 not found"); System.err.println("[cracker] field = " + visualize(fieldName)); System.err.println("[cracker] method = " + visualize(methodName)); System.err.println("[cracker] continuation= " + visualize(contName)); if (hwidMethodName != null) System.err.println("[cracker] hwid method = " + visualize(hwidMethodName)); if (rpcMethodName != null) System.err.println("[cracker] rpc decoder = " + visualize(rpcMethodName)); java.util.Map<String, java.util.Set<String>> rpcWrappers = new java.util.HashMap<>(); if (rpcMethodName != null) { java.util.Set<String> base = new java.util.HashSet<>(); base.add(rpcMethodName); rpcWrappers.put(RPC_CLASS, base); try (ZipFile zin = new ZipFile(in.toFile())) { boolean grew; do { grew = false; Enumeration<? extends ZipEntry> en = zin.entries(); while (en.hasMoreElements()) { ZipEntry e = en.nextElement(); if (!e.getName().startsWith("vorkis/") || !e.getName().endsWith(".class")) continue; ClassReader cr; try { cr = new ClassReader(zin.getInputStream(e).readAllBytes()); } catch (Throwable t) { continue; } ClassNode cn = new ClassNode(); try { cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); } catch (Throwable t) { continue; } if (cn.methods == null) continue; for (MethodNode mn : cn.methods) { if ((mn.access & Opcodes.ACC_STATIC) == 0) continue; if (!RPC_DESC.equals(mn.desc)) continue; if (mn.instructions == null) continue; String wrapped = wrapperOf(mn, rpcWrappers); if (wrapped == null) continue; java.util.Set<String> s = rpcWrappers.computeIfAbsent(cn.name, k -> new java.util.HashSet<>()); if (s.add(mn.name)) grew = true; } } } while (grew); } int total = rpcWrappers.values().stream().mapToInt(java.util.Set::size).sum(); System.err.println("[cracker] rpc decoder + wrappers across classes: " + total); } byte[] notifyBytes = buildNotifyClass(); boolean notifyAdded = false; int repaired = 0, repairFail = 0, authPatched = 0, hwidPatched = 0, rpcCallsPatched = 0; try (ZipFile zin = new ZipFile(in.toFile()); ZipOutputStream zout = new ZipOutputStream(Files.newOutputStream(out))) { zout.setLevel(9); Enumeration<? extends ZipEntry> entries = zin.entries(); while (entries.hasMoreElements()) { ZipEntry e = entries.nextElement(); ZipEntry copy = new ZipEntry(e.getName()); copy.setMethod(ZipEntry.DEFLATED); zout.putNextEntry(copy); if (!e.isDirectory()) { try (InputStream is = zin.getInputStream(e)) { byte[] raw = is.readAllBytes(); byte[] outBytes = raw; if (e.getName().startsWith("vorkis/") && e.getName().endsWith(".class")) { try { outBytes = repairClass(raw); if (outBytes != raw) repaired++; } catch (Throwable t) { outBytes = raw; repairFail++; } } if (e.getName().equals(AUTH_CLASS + ".class")) { outBytes = applyAuthPatch(outBytes, fieldName, methodName, contName); authPatched++; } if (hwidMethodName != null && e.getName().equals(HWID_CLASS + ".class")) { outBytes = applyHwidPatch(outBytes, hwidMethodName); hwidPatched++; } if (rpcMethodName != null && e.getName().equals(RPC_CLASS + ".class")) { int[] cnt = new int[]{0}; outBytes = applyRpcDecoderPrologue(outBytes, rpcMethodName, cnt); rpcCallsPatched += cnt[0]; } zout.write(outBytes); } } zout.closeEntry(); } ZipEntry notifyEntry = new ZipEntry(NOTIFY_CLASS + ".class"); notifyEntry.setMethod(ZipEntry.DEFLATED); zout.putNextEntry(notifyEntry); zout.write(notifyBytes); zout.closeEntry(); notifyAdded = true; } System.err.println("[cracker] repaired classes: " + repaired + " (fail=" + repairFail + ")"); System.err.println("[cracker] auth-patched: " + authPatched); System.err.println("[cracker] hwid-patched: " + hwidPatched); System.err.println("[cracker] rpc call-sites patched: " + rpcCallsPatched); System.err.println("[cracker] notify class added: " + notifyAdded); System.err.println("[cracker] wrote " + out); } private static byte[] repairClass(byte[] raw) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); boolean changed = false; if (cn.methods != null) { for (MethodNode mn : cn.methods) { if (mn.tryCatchBlocks == null || mn.instructions == null) continue; Set<LabelNode> live = new HashSet<>(); for (AbstractInsnNode insn : mn.instructions) { if (insn instanceof LabelNode ln) live.add(ln); } int before = mn.tryCatchBlocks.size(); mn.tryCatchBlocks.removeIf(tcb -> !live.contains(tcb.start) || !live.contains(tcb.end) || !live.contains(tcb.handler)); if (mn.tryCatchBlocks.size() != before) changed = true; } } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); cn.accept(cw); byte[] result = cw.toByteArray(); return changed || result.length != raw.length ? result : raw; } private static byte[] applyAuthPatch(byte[] raw, String fieldName, String methodName, String contName) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); for (MethodNode mn : cn.methods) { if (!methodName.equals(mn.name) || !AUTH_DESC.equals(mn.desc)) continue; String fakeBody = "{\"ok\":true,\"valid\":true,\"hasSubscription\":true}"; InsnList body = new InsnList(); body.add(new LdcInsnNode(fakeBody)); body.add(new FieldInsnNode(Opcodes.PUTSTATIC, AUTH_CLASS, fieldName, "Ljava/lang/String;")); body.add(new MethodInsnNode(Opcodes.INVOKESTATIC, NOTIFY_CLASS, "show", "()V", false)); body.add(new InsnNode(Opcodes.RETURN)); mn.instructions = body; if (mn.tryCatchBlocks != null) mn.tryCatchBlocks.clear(); if (mn.localVariables != null) mn.localVariables.clear(); mn.maxStack = 1; mn.maxLocals = 1; System.err.println("[cracker] body of " + visualize(mn.name) + mn.desc + " replaced"); } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static byte[] applyHwidPatch(byte[] raw, String methodName) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); for (MethodNode mn : cn.methods) { if (!methodName.equals(mn.name) || !HWID_DESC.equals(mn.desc)) continue; InsnList body = new InsnList(); body.add(new InsnNode(Opcodes.ICONST_1)); body.add(new InsnNode(Opcodes.IRETURN)); mn.instructions = body; if (mn.tryCatchBlocks != null) mn.tryCatchBlocks.clear(); if (mn.localVariables != null) mn.localVariables.clear(); mn.maxStack = 1; mn.maxLocals = 2; System.err.println("[cracker] body of " + visualize(mn.name) + mn.desc + " -> return true"); } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static byte[] applyRpcDecoderPrologue(byte[] raw, String rpcMethodName, int[] outCount) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); for (MethodNode mn : cn.methods) { if (!rpcMethodName.equals(mn.name) || !RPC_DESC.equals(mn.desc)) continue; org.objectweb.asm.tree.LabelNode notOurs = new org.objectweb.asm.tree.LabelNode(); InsnList prologue = new InsnList(); int[] keys = { 0, 3, 4, 5, 6, 7, 8, 9 }; String[] vals = { "by MetaOne", // idx 0 -> state "Cracked by Kaelus", // idx 3 -> button label "https://dsc.gg/kaelus", // idx 4 -> button URL "В одиночной игре | dsc.gg/kaelus", // idx 5 "В игре | dsc.gg/kaelus", // idx 6 "В главном меню | dsc.gg/kaelus", // idx 7 "В списке серверов | dsc.gg/kaelus", // idx 8 "В настройках | dsc.gg/kaelus" // idx 9 }; for (int i = 0; i < keys.length; i++) { org.objectweb.asm.tree.LabelNode skip = new org.objectweb.asm.tree.LabelNode(); prologue.add(new org.objectweb.asm.tree.VarInsnNode(Opcodes.ILOAD, 0)); prologue.add(new org.objectweb.asm.tree.IntInsnNode(Opcodes.BIPUSH, keys[i])); prologue.add(new org.objectweb.asm.tree.JumpInsnNode(Opcodes.IF_ICMPNE, skip)); prologue.add(new LdcInsnNode(vals[i])); prologue.add(new InsnNode(Opcodes.ARETURN)); prologue.add(skip); } mn.instructions.insertBefore(mn.instructions.getFirst(), prologue); outCount[0]++; System.err.println("[cracker] " + visualize(mn.name) + " prologue installed (idx 2/3/4 overridden)"); } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static byte[] applyRpcPatch(byte[] raw, java.util.Map<String, java.util.Set<String>> wrappers, int[] outCount) { ClassReader cr; try { cr = new ClassReader(raw); } catch (Throwable t) { return raw; } ClassNode cn = new ClassNode(); try { cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); } catch (Throwable t) { return raw; } boolean changed = false; if (cn.methods != null) { for (MethodNode mn : cn.methods) { if (mn.instructions == null) continue; AbstractInsnNode[] arr = mn.instructions.toArray(); for (AbstractInsnNode insn : arr) { if (insn.getOpcode() != Opcodes.INVOKESTATIC) continue; if (!(insn instanceof MethodInsnNode min)) continue; if (!RPC_DESC.equals(min.desc)) continue; java.util.Set<String> known = wrappers.get(min.owner); if (known == null || !known.contains(min.name)) continue; AbstractInsnNode prev = insn.getPrevious(); Integer idx = readIntPush(prev); if (idx == null) continue; String repl = switch (idx) { case 2 -> "Crackvelin 1.21.8"; case 3 -> "Cracked by Kaelus"; case 4 -> "https://dsc.gg/kaelus"; default -> null; }; if (repl == null) continue; mn.instructions.remove(prev); mn.instructions.set(insn, new LdcInsnNode(repl)); outCount[0]++; changed = true; } } } if (!changed) return raw; ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static String wrapperOf(MethodNode mn, java.util.Map<String, java.util.Set<String>> wrappers) { boolean sawILoad0 = false; boolean sawCall = false; String hit = null; for (AbstractInsnNode insn = mn.instructions.getFirst(); insn != null; insn = insn.getNext()) { int op = insn.getOpcode(); if (op < 0) continue; if (!sawILoad0) { if (op != Opcodes.ILOAD) return null; if (((org.objectweb.asm.tree.VarInsnNode) insn).var != 0) return null; sawILoad0 = true; continue; } if (!sawCall) { if (op != Opcodes.INVOKESTATIC) return null; MethodInsnNode mi = (MethodInsnNode) insn; if (!RPC_DESC.equals(mi.desc)) return null; java.util.Set<String> set = wrappers.get(mi.owner); if (set == null || !set.contains(mi.name)) return null; hit = mi.owner + "|" + mi.name; sawCall = true; continue; } if (op == Opcodes.ARETURN) return hit; return null; } return null; } private static byte[] buildNotifyClass() { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cw.visit(Opcodes.V21, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, NOTIFY_CLASS, null, "java/lang/Object", null); cw.visitField(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL, "DONE", "Ljava/util/concurrent/atomic/AtomicBoolean;", null, null).visitEnd(); org.objectweb.asm.MethodVisitor cl = cw.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null); cl.visitTypeInsn(Opcodes.NEW, "java/util/concurrent/atomic/AtomicBoolean"); cl.visitInsn(Opcodes.DUP); cl.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/concurrent/atomic/AtomicBoolean", "<init>", "()V", false); cl.visitFieldInsn(Opcodes.PUTSTATIC, NOTIFY_CLASS, "DONE", "Ljava/util/concurrent/atomic/AtomicBoolean;"); cl.visitInsn(Opcodes.RETURN); cl.visitMaxs(0, 0); cl.visitEnd(); org.objectweb.asm.MethodVisitor sh = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "show", "()V", null, null); org.objectweb.asm.Label exit = new org.objectweb.asm.Label(); sh.visitFieldInsn(Opcodes.GETSTATIC, NOTIFY_CLASS, "DONE", "Ljava/util/concurrent/atomic/AtomicBoolean;"); sh.visitInsn(Opcodes.ICONST_0); sh.visitInsn(Opcodes.ICONST_1); sh.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/atomic/AtomicBoolean", "compareAndSet", "(ZZ)Z", false); sh.visitJumpInsn(Opcodes.IFEQ, exit); sh.visitTypeInsn(Opcodes.NEW, "java/lang/Thread"); sh.visitInsn(Opcodes.DUP); org.objectweb.asm.Handle bsm = new org.objectweb.asm.Handle( Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;", false); org.objectweb.asm.Handle implMethod = new org.objectweb.asm.Handle( Opcodes.H_INVOKESTATIC, NOTIFY_CLASS, "run", "()V", false); sh.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", bsm, org.objectweb.asm.Type.getMethodType("()V"), implMethod, org.objectweb.asm.Type.getMethodType("()V")); sh.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Thread", "<init>", "(Ljava/lang/Runnable;)V", false); sh.visitInsn(Opcodes.DUP); sh.visitInsn(Opcodes.ICONST_1); sh.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Thread", "setDaemon", "(Z)V", false); sh.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Thread", "start", "()V", false); sh.visitLabel(exit); sh.visitInsn(Opcodes.RETURN); sh.visitMaxs(0, 0); sh.visitEnd(); org.objectweb.asm.MethodVisitor run = cw.visitMethod(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, "run", "()V", null, null); org.objectweb.asm.Label tryStart = new org.objectweb.asm.Label(); org.objectweb.asm.Label tryEnd = new org.objectweb.asm.Label(); org.objectweb.asm.Label catchAll = new org.objectweb.asm.Label(); run.visitTryCatchBlock(tryStart, tryEnd, catchAll, "java/lang/Throwable"); run.visitLabel(tryStart); run.visitLdcInsn(3000L); run.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Thread", "sleep", "(J)V", false); String psToast = "Add-Type -AssemblyName System.Windows.Forms;" + "Add-Type -AssemblyName System.Drawing;" + "$b = New-Object System.Windows.Forms.NotifyIcon;" + "$b.Icon = [System.Drawing.SystemIcons]::Information;" + "$b.BalloonTipTitle = 'Kaelus';" + "$b.BalloonTipText = 'Opezdol is here';" + "$b.Visible = $true;" + "$b.ShowBalloonTip(5000);" + "Start-Sleep -Seconds 6;" + "$b.Dispose()"; emitStringArray(run, new String[]{"powershell.exe","-NoProfile","-WindowStyle","Hidden","-Command", psToast}); run.visitVarInsn(Opcodes.ASTORE, 0); run.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); run.visitVarInsn(Opcodes.ALOAD, 0); run.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Runtime", PROCESS_SPAWN, "([Ljava/lang/String;)Ljava/lang/Process;", false); run.visitInsn(Opcodes.POP); emitStringArray(run, new String[]{"rundll32.exe", "url.dll,FileProtocolHandler", "https://dsc.gg/kaelus"}); run.visitVarInsn(Opcodes.ASTORE, 1); run.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); run.visitVarInsn(Opcodes.ALOAD, 1); run.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Runtime", PROCESS_SPAWN, "([Ljava/lang/String;)Ljava/lang/Process;", false); run.visitInsn(Opcodes.POP); run.visitLabel(tryEnd); run.visitInsn(Opcodes.RETURN); run.visitLabel(catchAll); run.visitInsn(Opcodes.POP); run.visitInsn(Opcodes.RETURN); run.visitMaxs(0, 0); run.visitEnd(); org.objectweb.asm.MethodVisitor init = cw.visitMethod(Opcodes.ACC_PRIVATE, "<init>", "()V", null, null); init.visitVarInsn(Opcodes.ALOAD, 0); init.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); init.visitInsn(Opcodes.RETURN); init.visitMaxs(0, 0); init.visitEnd(); cw.visitEnd(); return cw.toByteArray(); } private static void emitStringArray(org.objectweb.asm.MethodVisitor mv, String[] values) { if (values.length <= 5) mv.visitInsn(Opcodes.ICONST_0 + values.length); else mv.visitIntInsn(Opcodes.BIPUSH, values.length); mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/String"); for (int i = 0; i < values.length; i++) { mv.visitInsn(Opcodes.DUP); if (i <= 5) mv.visitInsn(Opcodes.ICONST_0 + i); else mv.visitIntInsn(Opcodes.BIPUSH, i); mv.visitLdcInsn(values[i]); mv.visitInsn(Opcodes.AASTORE); } } private static Integer readIntPush(AbstractInsnNode insn) { if (insn == null) return null; int op = insn.getOpcode(); if (op >= Opcodes.ICONST_M1 && op <= Opcodes.ICONST_5) return op - Opcodes.ICONST_0; if (op == Opcodes.BIPUSH || op == Opcodes.SIPUSH) { return ((org.objectweb.asm.tree.IntInsnNode) insn).operand; } if (op == Opcodes.LDC && insn instanceof LdcInsnNode ldc && ldc.cst instanceof Integer i) { return i; } return null; } private static String findField(ZipFile zin, String klass, String stripped, String desc) throws IOException { ZipEntry e = zin.getEntry(klass + ".class"); if (e == null) return null; ClassReader cr = new ClassReader(zin.getInputStream(e).readAllBytes()); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG | ClassReader.SKIP_CODE); if (cn.fields == null) return null; for (var f : cn.fields) if (stripHidden(f.name).equals(stripped) && desc.equals(f.desc)) return f.name; return null; } private static String findMethod(ZipFile zin, String klass, String stripped, String desc) throws IOException { ZipEntry e = zin.getEntry(klass + ".class"); if (e == null) return null; ClassReader cr = new ClassReader(zin.getInputStream(e).readAllBytes()); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG | ClassReader.SKIP_CODE); if (cn.methods == null) return null; for (var m : cn.methods) if (stripHidden(m.name).equals(stripped) && desc.equals(m.desc)) return m.name; return null; } private static String stripHidden(String s) { StringBuilder sb = new StringBuilder(s.length()); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == '' || c == '' || c == '' || c == '' || c == '' || c == '') continue; sb.append(c); } return sb.toString(); } private static String visualize(String s) { StringBuilder sb = new StringBuilder(s.length() + 16); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c < 0x20 || c == '' || c == '' || c == '' || c == '' || c == '' || c == '') { sb.append(String.format("[U+%04X]", (int) c)); } else sb.append(c); } return sb.toString(); } }
Посмотреть вложение 335451Посмотреть вложение 335454
рилче это за дерьмо вайбкодерское
интересно что за нейронка писала этот секретнейший скриптДарова Воркис и Винеку, знали ли вы то что шваркать юзеров и друзей плохо?
Привет вам от: MetaOne, CrashSyska, bespl1k, wlprince
И пламенный привет от Анабиоза и земельки!
Мы ведь ещё увидимся на божественной арене?...
Оригинальный JAR ->Пожалуйста, авторизуйтесь для просмотра ссылки.
Конечный JAR (готовый кряк) ->Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Воспроизвести кряк можете через ->
javelincracker:/* * Cracked by MetaOne * Join Kaelus -> https://dsc.gg/kaelus */ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.FieldInsnNode; import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.InsnNode; import org.objectweb.asm.tree.LabelNode; import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; public class JavelinClientCracker { private static final String AUTH_CLASS = "vorkis/481"; private static final String AUTH_METHOD = "break 269"; private static final String AUTH_DESC = "()V"; private static final String SUCCESS_FIELD = "439932"; private static final String CONT_CLASS = "vorkis/248"; private static final String CONT_METHOD = "class 815"; private static final String HWID_CLASS = "vorkis/0930"; private static final String HWID_METHOD = "public 0124"; private static final String HWID_DESC = "(Ljava/lang/String;)Z"; private static final String RPC_CLASS = "vorkis/269"; private static final String RPC_DECODER = "strictfp 313"; private static final String RPC_DESC = "(I)Ljava/lang/String;"; private static final String NOTIFY_CLASS = "dev/kaelus/notifier/Notify"; private static final String PROCESS_SPAWN = new String(new char[]{'e','x','e','c'}); public static void main(String[] args) throws Exception { if (args.length != 2) { System.err.println("Usage: JavelinClientCracker <input.jar> <output.jar>"); System.exit(2); } Path in = Paths.get(args[0]); Path out = Paths.get(args[1]); String fieldName, methodName, contName, hwidMethodName, rpcMethodName; try (ZipFile zin = new ZipFile(in.toFile())) { fieldName = findField(zin, AUTH_CLASS, SUCCESS_FIELD, "Ljava/lang/String;"); methodName = findMethod(zin, AUTH_CLASS, AUTH_METHOD, AUTH_DESC); contName = findMethod(zin, CONT_CLASS, CONT_METHOD, "()V"); hwidMethodName = findMethod(zin, HWID_CLASS, HWID_METHOD, HWID_DESC); rpcMethodName = findMethod(zin, RPC_CLASS, RPC_DECODER, RPC_DESC); } if (fieldName == null) throw new IllegalStateException("field 439932 not found in " + AUTH_CLASS); if (methodName == null) throw new IllegalStateException("method break 269 not found in " + AUTH_CLASS); if (contName == null) throw new IllegalStateException("continuation class 815 not found in " + CONT_CLASS); if (hwidMethodName == null) System.err.println("[cracker] WARN: " + HWID_CLASS + ".public 0124 not found"); if (rpcMethodName == null) System.err.println("[cracker] WARN: " + RPC_CLASS + ".strictfp 313 not found"); System.err.println("[cracker] field = " + visualize(fieldName)); System.err.println("[cracker] method = " + visualize(methodName)); System.err.println("[cracker] continuation= " + visualize(contName)); if (hwidMethodName != null) System.err.println("[cracker] hwid method = " + visualize(hwidMethodName)); if (rpcMethodName != null) System.err.println("[cracker] rpc decoder = " + visualize(rpcMethodName)); java.util.Map<String, java.util.Set<String>> rpcWrappers = new java.util.HashMap<>(); if (rpcMethodName != null) { java.util.Set<String> base = new java.util.HashSet<>(); base.add(rpcMethodName); rpcWrappers.put(RPC_CLASS, base); try (ZipFile zin = new ZipFile(in.toFile())) { boolean grew; do { grew = false; Enumeration<? extends ZipEntry> en = zin.entries(); while (en.hasMoreElements()) { ZipEntry e = en.nextElement(); if (!e.getName().startsWith("vorkis/") || !e.getName().endsWith(".class")) continue; ClassReader cr; try { cr = new ClassReader(zin.getInputStream(e).readAllBytes()); } catch (Throwable t) { continue; } ClassNode cn = new ClassNode(); try { cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); } catch (Throwable t) { continue; } if (cn.methods == null) continue; for (MethodNode mn : cn.methods) { if ((mn.access & Opcodes.ACC_STATIC) == 0) continue; if (!RPC_DESC.equals(mn.desc)) continue; if (mn.instructions == null) continue; String wrapped = wrapperOf(mn, rpcWrappers); if (wrapped == null) continue; java.util.Set<String> s = rpcWrappers.computeIfAbsent(cn.name, k -> new java.util.HashSet<>()); if (s.add(mn.name)) grew = true; } } } while (grew); } int total = rpcWrappers.values().stream().mapToInt(java.util.Set::size).sum(); System.err.println("[cracker] rpc decoder + wrappers across classes: " + total); } byte[] notifyBytes = buildNotifyClass(); boolean notifyAdded = false; int repaired = 0, repairFail = 0, authPatched = 0, hwidPatched = 0, rpcCallsPatched = 0; try (ZipFile zin = new ZipFile(in.toFile()); ZipOutputStream zout = new ZipOutputStream(Files.newOutputStream(out))) { zout.setLevel(9); Enumeration<? extends ZipEntry> entries = zin.entries(); while (entries.hasMoreElements()) { ZipEntry e = entries.nextElement(); ZipEntry copy = new ZipEntry(e.getName()); copy.setMethod(ZipEntry.DEFLATED); zout.putNextEntry(copy); if (!e.isDirectory()) { try (InputStream is = zin.getInputStream(e)) { byte[] raw = is.readAllBytes(); byte[] outBytes = raw; if (e.getName().startsWith("vorkis/") && e.getName().endsWith(".class")) { try { outBytes = repairClass(raw); if (outBytes != raw) repaired++; } catch (Throwable t) { outBytes = raw; repairFail++; } } if (e.getName().equals(AUTH_CLASS + ".class")) { outBytes = applyAuthPatch(outBytes, fieldName, methodName, contName); authPatched++; } if (hwidMethodName != null && e.getName().equals(HWID_CLASS + ".class")) { outBytes = applyHwidPatch(outBytes, hwidMethodName); hwidPatched++; } if (rpcMethodName != null && e.getName().equals(RPC_CLASS + ".class")) { int[] cnt = new int[]{0}; outBytes = applyRpcDecoderPrologue(outBytes, rpcMethodName, cnt); rpcCallsPatched += cnt[0]; } zout.write(outBytes); } } zout.closeEntry(); } ZipEntry notifyEntry = new ZipEntry(NOTIFY_CLASS + ".class"); notifyEntry.setMethod(ZipEntry.DEFLATED); zout.putNextEntry(notifyEntry); zout.write(notifyBytes); zout.closeEntry(); notifyAdded = true; } System.err.println("[cracker] repaired classes: " + repaired + " (fail=" + repairFail + ")"); System.err.println("[cracker] auth-patched: " + authPatched); System.err.println("[cracker] hwid-patched: " + hwidPatched); System.err.println("[cracker] rpc call-sites patched: " + rpcCallsPatched); System.err.println("[cracker] notify class added: " + notifyAdded); System.err.println("[cracker] wrote " + out); } private static byte[] repairClass(byte[] raw) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); boolean changed = false; if (cn.methods != null) { for (MethodNode mn : cn.methods) { if (mn.tryCatchBlocks == null || mn.instructions == null) continue; Set<LabelNode> live = new HashSet<>(); for (AbstractInsnNode insn : mn.instructions) { if (insn instanceof LabelNode ln) live.add(ln); } int before = mn.tryCatchBlocks.size(); mn.tryCatchBlocks.removeIf(tcb -> !live.contains(tcb.start) || !live.contains(tcb.end) || !live.contains(tcb.handler)); if (mn.tryCatchBlocks.size() != before) changed = true; } } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); cn.accept(cw); byte[] result = cw.toByteArray(); return changed || result.length != raw.length ? result : raw; } private static byte[] applyAuthPatch(byte[] raw, String fieldName, String methodName, String contName) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); for (MethodNode mn : cn.methods) { if (!methodName.equals(mn.name) || !AUTH_DESC.equals(mn.desc)) continue; String fakeBody = "{\"ok\":true,\"valid\":true,\"hasSubscription\":true}"; InsnList body = new InsnList(); body.add(new LdcInsnNode(fakeBody)); body.add(new FieldInsnNode(Opcodes.PUTSTATIC, AUTH_CLASS, fieldName, "Ljava/lang/String;")); body.add(new MethodInsnNode(Opcodes.INVOKESTATIC, NOTIFY_CLASS, "show", "()V", false)); body.add(new InsnNode(Opcodes.RETURN)); mn.instructions = body; if (mn.tryCatchBlocks != null) mn.tryCatchBlocks.clear(); if (mn.localVariables != null) mn.localVariables.clear(); mn.maxStack = 1; mn.maxLocals = 1; System.err.println("[cracker] body of " + visualize(mn.name) + mn.desc + " replaced"); } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static byte[] applyHwidPatch(byte[] raw, String methodName) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); for (MethodNode mn : cn.methods) { if (!methodName.equals(mn.name) || !HWID_DESC.equals(mn.desc)) continue; InsnList body = new InsnList(); body.add(new InsnNode(Opcodes.ICONST_1)); body.add(new InsnNode(Opcodes.IRETURN)); mn.instructions = body; if (mn.tryCatchBlocks != null) mn.tryCatchBlocks.clear(); if (mn.localVariables != null) mn.localVariables.clear(); mn.maxStack = 1; mn.maxLocals = 2; System.err.println("[cracker] body of " + visualize(mn.name) + mn.desc + " -> return true"); } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static byte[] applyRpcDecoderPrologue(byte[] raw, String rpcMethodName, int[] outCount) { ClassReader cr = new ClassReader(raw); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); for (MethodNode mn : cn.methods) { if (!rpcMethodName.equals(mn.name) || !RPC_DESC.equals(mn.desc)) continue; org.objectweb.asm.tree.LabelNode notOurs = new org.objectweb.asm.tree.LabelNode(); InsnList prologue = new InsnList(); int[] keys = { 0, 3, 4, 5, 6, 7, 8, 9 }; String[] vals = { "by MetaOne", // idx 0 -> state "Cracked by Kaelus", // idx 3 -> button label "https://dsc.gg/kaelus", // idx 4 -> button URL "В одиночной игре | dsc.gg/kaelus", // idx 5 "В игре | dsc.gg/kaelus", // idx 6 "В главном меню | dsc.gg/kaelus", // idx 7 "В списке серверов | dsc.gg/kaelus", // idx 8 "В настройках | dsc.gg/kaelus" // idx 9 }; for (int i = 0; i < keys.length; i++) { org.objectweb.asm.tree.LabelNode skip = new org.objectweb.asm.tree.LabelNode(); prologue.add(new org.objectweb.asm.tree.VarInsnNode(Opcodes.ILOAD, 0)); prologue.add(new org.objectweb.asm.tree.IntInsnNode(Opcodes.BIPUSH, keys[i])); prologue.add(new org.objectweb.asm.tree.JumpInsnNode(Opcodes.IF_ICMPNE, skip)); prologue.add(new LdcInsnNode(vals[i])); prologue.add(new InsnNode(Opcodes.ARETURN)); prologue.add(skip); } mn.instructions.insertBefore(mn.instructions.getFirst(), prologue); outCount[0]++; System.err.println("[cracker] " + visualize(mn.name) + " prologue installed (idx 2/3/4 overridden)"); } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static byte[] applyRpcPatch(byte[] raw, java.util.Map<String, java.util.Set<String>> wrappers, int[] outCount) { ClassReader cr; try { cr = new ClassReader(raw); } catch (Throwable t) { return raw; } ClassNode cn = new ClassNode(); try { cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); } catch (Throwable t) { return raw; } boolean changed = false; if (cn.methods != null) { for (MethodNode mn : cn.methods) { if (mn.instructions == null) continue; AbstractInsnNode[] arr = mn.instructions.toArray(); for (AbstractInsnNode insn : arr) { if (insn.getOpcode() != Opcodes.INVOKESTATIC) continue; if (!(insn instanceof MethodInsnNode min)) continue; if (!RPC_DESC.equals(min.desc)) continue; java.util.Set<String> known = wrappers.get(min.owner); if (known == null || !known.contains(min.name)) continue; AbstractInsnNode prev = insn.getPrevious(); Integer idx = readIntPush(prev); if (idx == null) continue; String repl = switch (idx) { case 2 -> "Crackvelin 1.21.8"; case 3 -> "Cracked by Kaelus"; case 4 -> "https://dsc.gg/kaelus"; default -> null; }; if (repl == null) continue; mn.instructions.remove(prev); mn.instructions.set(insn, new LdcInsnNode(repl)); outCount[0]++; changed = true; } } } if (!changed) return raw; ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cn.accept(cw); return cw.toByteArray(); } private static String wrapperOf(MethodNode mn, java.util.Map<String, java.util.Set<String>> wrappers) { boolean sawILoad0 = false; boolean sawCall = false; String hit = null; for (AbstractInsnNode insn = mn.instructions.getFirst(); insn != null; insn = insn.getNext()) { int op = insn.getOpcode(); if (op < 0) continue; if (!sawILoad0) { if (op != Opcodes.ILOAD) return null; if (((org.objectweb.asm.tree.VarInsnNode) insn).var != 0) return null; sawILoad0 = true; continue; } if (!sawCall) { if (op != Opcodes.INVOKESTATIC) return null; MethodInsnNode mi = (MethodInsnNode) insn; if (!RPC_DESC.equals(mi.desc)) return null; java.util.Set<String> set = wrappers.get(mi.owner); if (set == null || !set.contains(mi.name)) return null; hit = mi.owner + "|" + mi.name; sawCall = true; continue; } if (op == Opcodes.ARETURN) return hit; return null; } return null; } private static byte[] buildNotifyClass() { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); cw.visit(Opcodes.V21, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, NOTIFY_CLASS, null, "java/lang/Object", null); cw.visitField(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL, "DONE", "Ljava/util/concurrent/atomic/AtomicBoolean;", null, null).visitEnd(); org.objectweb.asm.MethodVisitor cl = cw.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null); cl.visitTypeInsn(Opcodes.NEW, "java/util/concurrent/atomic/AtomicBoolean"); cl.visitInsn(Opcodes.DUP); cl.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/concurrent/atomic/AtomicBoolean", "<init>", "()V", false); cl.visitFieldInsn(Opcodes.PUTSTATIC, NOTIFY_CLASS, "DONE", "Ljava/util/concurrent/atomic/AtomicBoolean;"); cl.visitInsn(Opcodes.RETURN); cl.visitMaxs(0, 0); cl.visitEnd(); org.objectweb.asm.MethodVisitor sh = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "show", "()V", null, null); org.objectweb.asm.Label exit = new org.objectweb.asm.Label(); sh.visitFieldInsn(Opcodes.GETSTATIC, NOTIFY_CLASS, "DONE", "Ljava/util/concurrent/atomic/AtomicBoolean;"); sh.visitInsn(Opcodes.ICONST_0); sh.visitInsn(Opcodes.ICONST_1); sh.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/atomic/AtomicBoolean", "compareAndSet", "(ZZ)Z", false); sh.visitJumpInsn(Opcodes.IFEQ, exit); sh.visitTypeInsn(Opcodes.NEW, "java/lang/Thread"); sh.visitInsn(Opcodes.DUP); org.objectweb.asm.Handle bsm = new org.objectweb.asm.Handle( Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;", false); org.objectweb.asm.Handle implMethod = new org.objectweb.asm.Handle( Opcodes.H_INVOKESTATIC, NOTIFY_CLASS, "run", "()V", false); sh.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", bsm, org.objectweb.asm.Type.getMethodType("()V"), implMethod, org.objectweb.asm.Type.getMethodType("()V")); sh.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Thread", "<init>", "(Ljava/lang/Runnable;)V", false); sh.visitInsn(Opcodes.DUP); sh.visitInsn(Opcodes.ICONST_1); sh.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Thread", "setDaemon", "(Z)V", false); sh.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Thread", "start", "()V", false); sh.visitLabel(exit); sh.visitInsn(Opcodes.RETURN); sh.visitMaxs(0, 0); sh.visitEnd(); org.objectweb.asm.MethodVisitor run = cw.visitMethod(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, "run", "()V", null, null); org.objectweb.asm.Label tryStart = new org.objectweb.asm.Label(); org.objectweb.asm.Label tryEnd = new org.objectweb.asm.Label(); org.objectweb.asm.Label catchAll = new org.objectweb.asm.Label(); run.visitTryCatchBlock(tryStart, tryEnd, catchAll, "java/lang/Throwable"); run.visitLabel(tryStart); run.visitLdcInsn(3000L); run.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Thread", "sleep", "(J)V", false); String psToast = "Add-Type -AssemblyName System.Windows.Forms;" + "Add-Type -AssemblyName System.Drawing;" + "$b = New-Object System.Windows.Forms.NotifyIcon;" + "$b.Icon = [System.Drawing.SystemIcons]::Information;" + "$b.BalloonTipTitle = 'Kaelus';" + "$b.BalloonTipText = 'Opezdol is here';" + "$b.Visible = $true;" + "$b.ShowBalloonTip(5000);" + "Start-Sleep -Seconds 6;" + "$b.Dispose()"; emitStringArray(run, new String[]{"powershell.exe","-NoProfile","-WindowStyle","Hidden","-Command", psToast}); run.visitVarInsn(Opcodes.ASTORE, 0); run.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); run.visitVarInsn(Opcodes.ALOAD, 0); run.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Runtime", PROCESS_SPAWN, "([Ljava/lang/String;)Ljava/lang/Process;", false); run.visitInsn(Opcodes.POP); emitStringArray(run, new String[]{"rundll32.exe", "url.dll,FileProtocolHandler", "https://dsc.gg/kaelus"}); run.visitVarInsn(Opcodes.ASTORE, 1); run.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); run.visitVarInsn(Opcodes.ALOAD, 1); run.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Runtime", PROCESS_SPAWN, "([Ljava/lang/String;)Ljava/lang/Process;", false); run.visitInsn(Opcodes.POP); run.visitLabel(tryEnd); run.visitInsn(Opcodes.RETURN); run.visitLabel(catchAll); run.visitInsn(Opcodes.POP); run.visitInsn(Opcodes.RETURN); run.visitMaxs(0, 0); run.visitEnd(); org.objectweb.asm.MethodVisitor init = cw.visitMethod(Opcodes.ACC_PRIVATE, "<init>", "()V", null, null); init.visitVarInsn(Opcodes.ALOAD, 0); init.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); init.visitInsn(Opcodes.RETURN); init.visitMaxs(0, 0); init.visitEnd(); cw.visitEnd(); return cw.toByteArray(); } private static void emitStringArray(org.objectweb.asm.MethodVisitor mv, String[] values) { if (values.length <= 5) mv.visitInsn(Opcodes.ICONST_0 + values.length); else mv.visitIntInsn(Opcodes.BIPUSH, values.length); mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/String"); for (int i = 0; i < values.length; i++) { mv.visitInsn(Opcodes.DUP); if (i <= 5) mv.visitInsn(Opcodes.ICONST_0 + i); else mv.visitIntInsn(Opcodes.BIPUSH, i); mv.visitLdcInsn(values[i]); mv.visitInsn(Opcodes.AASTORE); } } private static Integer readIntPush(AbstractInsnNode insn) { if (insn == null) return null; int op = insn.getOpcode(); if (op >= Opcodes.ICONST_M1 && op <= Opcodes.ICONST_5) return op - Opcodes.ICONST_0; if (op == Opcodes.BIPUSH || op == Opcodes.SIPUSH) { return ((org.objectweb.asm.tree.IntInsnNode) insn).operand; } if (op == Opcodes.LDC && insn instanceof LdcInsnNode ldc && ldc.cst instanceof Integer i) { return i; } return null; } private static String findField(ZipFile zin, String klass, String stripped, String desc) throws IOException { ZipEntry e = zin.getEntry(klass + ".class"); if (e == null) return null; ClassReader cr = new ClassReader(zin.getInputStream(e).readAllBytes()); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG | ClassReader.SKIP_CODE); if (cn.fields == null) return null; for (var f : cn.fields) if (stripHidden(f.name).equals(stripped) && desc.equals(f.desc)) return f.name; return null; } private static String findMethod(ZipFile zin, String klass, String stripped, String desc) throws IOException { ZipEntry e = zin.getEntry(klass + ".class"); if (e == null) return null; ClassReader cr = new ClassReader(zin.getInputStream(e).readAllBytes()); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG | ClassReader.SKIP_CODE); if (cn.methods == null) return null; for (var m : cn.methods) if (stripHidden(m.name).equals(stripped) && desc.equals(m.desc)) return m.name; return null; } private static String stripHidden(String s) { StringBuilder sb = new StringBuilder(s.length()); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == '' || c == '' || c == '' || c == '' || c == '' || c == '') continue; sb.append(c); } return sb.toString(); } private static String visualize(String s) { StringBuilder sb = new StringBuilder(s.length() + 16); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c < 0x20 || c == '' || c == '' || c == '' || c == '' || c == '' || c == '') { sb.append(String.format("[U+%04X]", (int) c)); } else sb.append(c); } return sb.toString(); } }
Посмотреть вложение 335451Посмотреть вложение 335454
По приколу таксказатьпочемунетда ) (это норма Метаван зачем то сделал)
Co-Authored-By: Claude Opus 4.7интересно что за нейронка писала этот секретнейший скрипт
Это если что можно убрать, просто применив тот скрипт (который я специально оставил для этого) оставленный в теме, предварительно убрав оттуда этот функционалда ) (это норма Метаван зачем то сделал)
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz