66import dev .skidfuscator .obfuscator .event .impl .transform .group .InitGroupTransformEvent ;
77import dev .skidfuscator .obfuscator .event .impl .transform .method .InitMethodTransformEvent ;
88import dev .skidfuscator .obfuscator .event .impl .transform .method .PostMethodTransformEvent ;
9+ import dev .skidfuscator .obfuscator .hierarchy .matching .ClassMethodHash ;
910import dev .skidfuscator .obfuscator .number .NumberManager ;
1011import dev .skidfuscator .obfuscator .number .encrypt .impl .XorNumberTransformer ;
1112import dev .skidfuscator .obfuscator .number .hash .HashTransformer ;
4142import org .mapleir .ir .code .expr .ConstantExpr ;
4243import org .mapleir .ir .code .expr .FieldLoadExpr ;
4344import org .mapleir .ir .code .expr .VarExpr ;
45+ import org .mapleir .ir .code .expr .invoke .DynamicInvocationExpr ;
4446import org .mapleir .ir .code .expr .invoke .StaticInvocationExpr ;
4547import org .mapleir .ir .code .stmt .*;
4648import org .mapleir .ir .code .stmt .copy .CopyVarStmt ;
4749import org .mapleir .ir .locals .Local ;
50+ import org .objectweb .asm .Handle ;
4851import org .objectweb .asm .Opcodes ;
4952import org .objectweb .asm .Type ;
5053
@@ -473,6 +476,12 @@ void handle(final InitGroupTransformEvent event) {
473476 parameter .addParameter (Type .INT_TYPE );
474477 methodNode .node .desc = desc = parameter .getDesc ();
475478
479+ final ClassMethodHash classMethodHash = new ClassMethodHash (skidMethodNode );
480+
481+ if (skidfuscator .getHierarchy ().getGroup (classMethodHash ) != null ) {
482+ skidGroup .setName (skidGroup .getName () + "$" + RandomUtil .nextInt ());
483+ }
484+
476485 if (local == null ) {
477486 local = skidMethodNode .getCfg ().getLocals ().get (stackHeight );
478487 }
@@ -481,27 +490,46 @@ void handle(final InitGroupTransformEvent event) {
481490 for (SkidInvocation invoker : skidGroup .getInvokers ()) {
482491 assert invoker != null : String .format ("Invoker %s is null!" , Arrays .toString (skidGroup .getInvokers ().toArray ()));
483492 assert invoker .getExpr () != null : String .format ("Invoker %s is null!" , invoker .getOwner ().getDisplayName ());
493+ final boolean isDynamic = invoker .getExpr () instanceof DynamicInvocationExpr ;
484494
485495 int index = 0 ;
486- for (Expr argumentExpr : invoker .getExpr ().getArgumentExprs ()) {
496+ final Expr [] params = /*isDynamic
497+ ? ((DynamicInvocationExpr) invoker.getExpr()).getPrintedArgs()
498+ : */ invoker .getExpr ().getArgumentExprs ();
499+ for (Expr argumentExpr : params ) {
487500 assert argumentExpr != null : "Argument of index " + index + " is null!" ;
488501 index ++;
489502 }
490503
491- final Expr [] args = new Expr [invoker . getExpr (). getArgumentExprs () .length + 1 ];
504+ final Expr [] args = new Expr [params .length + 1 ];
492505 System .arraycopy (
493- invoker . getExpr (). getArgumentExprs () ,
506+ params ,
494507 0 ,
495508 args ,
496509 0 ,
497- invoker . getExpr (). getArgumentExprs () .length
510+ params .length
498511 );
499512
500513 final ConstantExpr constant = new SkidConstantExpr (skidGroup .getPredicate ().getPublic ());
501514 args [args .length - 1 ] = constant ;
502515
503516 invoker .getExpr ().setArgumentExprs (args );
504- invoker .getExpr ().setDesc (desc );
517+
518+ if (isDynamic ) {
519+ final Handle boundFunc = (Handle ) ((DynamicInvocationExpr ) invoker .getExpr ()).getBootstrapArgs ()[1 ];
520+ final Parameter handlerDesc = new Parameter (boundFunc .getDesc ());
521+ handlerDesc .addParameter (Type .INT_TYPE );
522+ final Handle newBoundFunc = new Handle (boundFunc .getTag (), boundFunc .getOwner (), boundFunc .getName (),
523+ handlerDesc .getDesc (), boundFunc .isInterface ());
524+
525+ final Parameter parameter = new Parameter (invoker .getExpr ().getDesc ());
526+ parameter .addParameter (Type .INT_TYPE );
527+ invoker .getExpr ().setDesc (parameter .getDesc ());
528+ //System.out.println(((DynamicInvocationExpr) invoker.getExpr()).getDesc() + " new: " + desc);
529+ ((DynamicInvocationExpr ) invoker .getExpr ()).getBootstrapArgs ()[1 ] = newBoundFunc ;
530+ } else {
531+ invoker .getExpr ().setDesc (desc );
532+ }
505533 }
506534
507535 final int finalStackHeight = stackHeight ;
0 commit comments