All Downloads are FREE. Search and download functionalities are using the official Maven repository.

main.dev.datlag.sekret.generator.DeobfuscatorGenerator.kt Maven / Gradle / Ivy

package dev.datlag.sekret.generator

import dev.datlag.sekret.Logger
import dev.datlag.sekret.SekretHelper
import dev.datlag.sekret.common.declareObjectConstructor
import dev.datlag.sekret.common.declareThisReceiver
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.lower.DeclarationIrBuilder
import org.jetbrains.kotlin.backend.wasm.ir2wasm.allFields
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.addField
import org.jetbrains.kotlin.ir.builders.declarations.addFunction
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
import org.jetbrains.kotlin.ir.builders.declarations.buildClass
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.createType
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.name.*
import org.jetbrains.kotlin.types.Variance
import kotlin.properties.Delegates

object DeobfuscatorGenerator {

    internal var irClass: IrClass? = null
        private set

    internal var getFunction: IrSimpleFunction? = null
        private set

    internal var valuesField: IrProperty? = null
        private set

    val exists: Boolean
        get() = irClass != null

    private fun listOfVararg(pluginContext: IrPluginContext): IrSimpleFunctionSymbol {
        val listOfFunction = pluginContext.referenceFunctions(
            CallableId(
                packageName = FqName("kotlin.collections"),
                className = null,
                callableName = Name.identifier("listOf")
            )
        )

        val varargListOf = listOfFunction.firstNotNullOf { function ->
            val params = function.owner.valueParameters
            if (params.isNotEmpty()) {
                if (params.first().isVararg) {
                    function
                } else {
                    null
                }
            } else {
                null
            }
        }

        return varargListOf
    }

    private var seed by Delegates.notNull()
    private val builder = StringBuilder()

    fun createIrClass(pluginContext: IrPluginContext, logger: Logger) {
        irClass = pluginContext.referenceClass(ClassId.fromString("dev/datlag/sekret/DeobfuscatorHelper"))?.owner

        logger.warn("Class found: ${irClass != null}")

        irClass?.fields?.firstNotNullOf {
            logger.warn(it.name.asString())
        }

        val props = irClass?.properties?.toList() ?: emptyList()
        valuesField = props.firstOrNull {
            it.name == Name.identifier("values")
        }

        irClass?.addFunction {
            name = Name.identifier("get")
            isOperator = true
            returnType = pluginContext.irBuiltIns.stringType
        }?.also { function ->
            val id = function.addValueParameter {
                name = Name.identifier("id")
                type = pluginContext.irBuiltIns.longType
            }

            function.body = DeclarationIrBuilder(pluginContext, function.symbol).irBlockBody {
                +irReturn(irString("Generated"))
            }
        }
    }

    fun registerString(value: String): Long {
        var mask = 0L
        var state = SekretHelper.Random.seed(seed)
        state = SekretHelper.Random.next(state)
        mask = mask or (state and 0xffff_0000_0000L)
        state = SekretHelper.Random.next(state)
        mask = mask or ((state and 0xffff_0000_0000L) shl 16)

        val index = builder.length
        val id = seed or ((index.toLong() shl 32) xor mask)

        state = SekretHelper.Random.next(state)
        builder.append((((state ushr 32) and 0xffffL) xor value.length.toLong()).toInt().toChar())

        for (char in value) {
            state = SekretHelper.Random.next(state)
            builder.append((((state ushr 32) and 0xffffL) xor char.code.toLong()).toInt().toChar())
        }

        return id
    }

    fun getAllChunks(): List {
        return builder.toString().chunked(0x1fff)
    }

    fun generateList(pluginContext: IrPluginContext, logger: Logger) {
        val varargListOf = listOfVararg(pluginContext)
        val applyParameter = DeclarationIrBuilder(pluginContext, varargListOf).irCall(varargListOf)

        val irStrings = getAllChunks().map {
            DeclarationIrBuilder(pluginContext, pluginContext.symbols.string).irString(it)
        }
        val varargValue = DeclarationIrBuilder(pluginContext, varargListOf).irVararg(pluginContext.irBuiltIns.stringType, irStrings)
        applyParameter.putValueArgument(0, varargValue)


        valuesField?.backingField?.let {
            it.initializer = DeclarationIrBuilder(pluginContext, it.symbol).irExprBody(applyParameter)
        }
    }

    fun setSeed(value: Int) {
        seed = value.toLong() and 0xffff_ffffL
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy