BCryptClassMapper.kt (1492B) - raw


      1 package me.rhunk.snapenhance.mapper.impl
      2 
      3 import com.android.tools.smali.dexlib2.iface.instruction.formats.ArrayPayload
      4 import me.rhunk.snapenhance.mapper.AbstractClassMapper
      5 import me.rhunk.snapenhance.mapper.ext.getClassName
      6 import me.rhunk.snapenhance.mapper.ext.getStaticConstructor
      7 import me.rhunk.snapenhance.mapper.ext.isFinal
      8 
      9 class BCryptClassMapper : AbstractClassMapper("BCryptClass") {
     10     val classReference = classReference("class")
     11     val hashMethod = string("hashMethod")
     12 
     13     init {
     14         mapper {
     15             for (clazz in classes) {
     16                 if (!clazz.isFinal()) continue
     17 
     18                 val isBcryptClass = clazz.getStaticConstructor()?.let { constructor ->
     19                     constructor.implementation?.instructions?.filterIsInstance<ArrayPayload>()?.any { it.arrayElements.size == 18 && it.arrayElements[0] == 608135816 }
     20                 }
     21 
     22                 if (isBcryptClass == true) {
     23                     val hashDexMethod = clazz.methods.first {
     24                         it.parameterTypes.size == 2 &&
     25                                 it.parameterTypes[0] == "Ljava/lang/String;" &&
     26                                 it.parameterTypes[1] == "Ljava/lang/String;" &&
     27                                 it.returnType == "Ljava/lang/String;"
     28                     }
     29 
     30                     hashMethod.set(hashDexMethod.name)
     31                     classReference.set(clazz.getClassName())
     32                     return@mapper
     33                 }
     34             }
     35         }
     36     }
     37 }