fix: map descriptors too

This commit is contained in:
zaaarf 2023-03-29 11:59:06 +02:00
parent 4215780e0d
commit dac2510de7
No known key found for this signature in database
GPG key ID: 82240E075E31FA4C
3 changed files with 57 additions and 4 deletions

View file

@ -63,11 +63,12 @@ public class FieldContainer {
throw new AmbiguousDefinitionException("Cannot use name-based lookups for fields of unverifiable classes!"); throw new AmbiguousDefinitionException("Cannot use name-based lookups for fields of unverifiable classes!");
this.elem = null; this.elem = null;
this.name = name; this.name = name;
this.descriptor = descriptor; this.descriptor = mapper == null ? descriptor : mapper.obfuscateMethodDescriptor(descriptor);
} else { } else {
this.elem = (VariableElement) findMember(parent, name, descriptor, descriptor != null, true); this.elem = (VariableElement) findMember(parent, name, descriptor, descriptor != null, true);
this.name = this.elem.getSimpleName().toString(); this.name = this.elem.getSimpleName().toString();
this.descriptor = descriptorFromType(this.elem.asType()); String validatedDescriptor = descriptorFromType(this.elem.asType());
this.descriptor = mapper == null ? descriptor : mapper.obfuscateMethodDescriptor(validatedDescriptor);
} }
this.nameObf = findMemberName(parent.fqnObf, name, descriptor, mapper); this.nameObf = findMemberName(parent.fqnObf, name, descriptor, mapper);
} }

View file

@ -67,11 +67,12 @@ public class MethodContainer {
throw new AmbiguousDefinitionException("Cannot use name-based lookups for methods of unverifiable classes!"); throw new AmbiguousDefinitionException("Cannot use name-based lookups for methods of unverifiable classes!");
this.elem = null; this.elem = null;
this.name = name; this.name = name;
this.descriptor = descriptor; this.descriptor = mapper == null ? descriptor : mapper.obfuscateMethodDescriptor(descriptor);
} else { } else {
this.elem = (ExecutableElement) findMember(parent, name, descriptor, descriptor != null && strict, false); this.elem = (ExecutableElement) findMember(parent, name, descriptor, descriptor != null && strict, false);
this.name = this.elem.getSimpleName().toString(); this.name = this.elem.getSimpleName().toString();
this.descriptor = descriptorFromExecutableElement(this.elem); String validatedDescriptor = descriptorFromExecutableElement(this.elem);
this.descriptor = mapper == null ? descriptor : mapper.obfuscateMethodDescriptor(validatedDescriptor);
} }
this.nameObf = findMemberName(parent.fqnObf, name, descriptor, mapper); this.nameObf = findMemberName(parent.fqnObf, name, descriptor, mapper);
} }

View file

@ -2,6 +2,8 @@ package ftbsc.lll.processor.tools.obfuscation;
import ftbsc.lll.exceptions.AmbiguousDefinitionException; import ftbsc.lll.exceptions.AmbiguousDefinitionException;
import ftbsc.lll.exceptions.MappingNotFoundException; import ftbsc.lll.exceptions.MappingNotFoundException;
import ftbsc.lll.tools.DescriptorBuilder;
import org.objectweb.asm.Type;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -93,6 +95,55 @@ public class ObfuscationMapper {
return member; return member;
} }
/**
* Obfuscates a method descriptor, replacing its class references
* with their obfuscated counterparts.
* @param descriptor a {@link String} containing the descriptor
* @return the obfuscated descriptor
* @since 0.5.1
*/
public String obfuscateMethodDescriptor(String descriptor) {
Type method = Type.getMethodType(descriptor);
Type[] arguments = method.getArgumentTypes();
Type returnType = method.getReturnType();
Type[] obfArguments = new Type[arguments.length];
for(int i = 0; i < obfArguments.length; i++)
obfArguments[i] = this.obfuscateType(arguments[i]);
return Type.getMethodDescriptor(this.obfuscateType(returnType), obfArguments);
}
/**
* Given a {@link Type} it returns its obfuscated counterpart.
* @param type the type in question
* @return the obfuscated type
* @since 0.5.1
*/
public Type obfuscateType(Type type) {
//unwrap arrays
Type unwrapped = type;
int arrayLevel = 0;
while(unwrapped.getSort() == org.objectweb.asm.Type.ARRAY) {
unwrapped = unwrapped.getElementType();
arrayLevel++;
}
//if it's a primitive no operation is needed
if(type.getSort() < org.objectweb.asm.Type.ARRAY)
return type;
String internalName = type.getInternalName();
String internalNameObf;
try {
internalNameObf = this.obfuscateClass(internalName);
return Type.getType(DescriptorBuilder.nameToDescriptor(internalNameObf, arrayLevel));
} catch(MappingNotFoundException e) {
return type;
}
}
/** /**
* Gets the unobfuscated name of the given member. * Gets the unobfuscated name of the given member.
* Due to how it's implemented, it's considerably less efficient than its * Due to how it's implemented, it's considerably less efficient than its