Skip to content

Commit

Permalink
chore: add UsingStringVector in DexKitTarget
Browse files Browse the repository at this point in the history
  • Loading branch information
cinit committed Jul 24, 2023
1 parent fe36450 commit 0279f7b
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ public static boolean step(@Nullable Object director) {
List<DexKitTarget> ids = new LinkedList<>();
for (String id : deobfIndexList) {
DexKitTarget target = DexKitTargetSealedEnum.INSTANCE.valueOf(id);
if (target instanceof DexKitTarget.UsingStr) {
if (target instanceof DexKitTarget) {
ids.add(target);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,6 @@ class TroubleshootFragment : BaseRootLayoutFragment() {
val colorNotice: Int = ThemeAttrUtils.resolveColorOrDefaultColorInt(ctx, androidx.appcompat.R.attr.colorAccent, Color.BLUE)
val sb = SpannableStringBuilder()
val targets = DexKitTarget.values
.filterIsInstance<DexKitTarget.UsingStr>()
.groupBy { it.findMethod }
targets[false]?.forEach {
kotlin.runCatching {
Expand Down
8 changes: 4 additions & 4 deletions app/src/main/java/io/github/qauxv/step/DexDeobfStep.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ public String getId() {
@Override
public boolean step() {
try {
if (target instanceof DexKitTarget.UsingStr) {
var t = (DexKitTarget.UsingStr) target;
if (target instanceof DexKitTarget) {
var t = (DexKitTarget) target;
if (t.getFindMethod()) {
DexKit.doFindMethod(t);
} else {
Expand All @@ -70,8 +70,8 @@ public int getPriority() {

@Override
public String getDescription() {
if (target instanceof DexKitTarget.UsingStr) {
var t = (DexKitTarget.UsingStr) target;
if (target instanceof DexKitTarget) {
var t = (DexKitTarget) target;
if (t.getFindMethod()) {
return "定位被混淆方法: " + getId();
} else {
Expand Down
6 changes: 4 additions & 2 deletions app/src/main/java/io/github/qauxv/util/dexkit/DexKit.kt
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ object DexKit {
@JvmStatic
fun doFindClass(target: DexKitTarget): Class<*>? {
when (target) {
is DexKitTarget.UsingStr -> {
is DexKitTarget.UsingStr,
is DexKitTarget.UsingStringVector -> {
loadClassFromCache(target)?.let { return it }
return DexDeobfsProvider.getCurrentBackend().doFindClass(target)
}
Expand All @@ -67,7 +68,8 @@ object DexKit {
@JvmStatic
fun doFindMethod(target: DexKitTarget): Method? {
when (target) {
is DexKitTarget.UsingStr -> {
is DexKitTarget.UsingStr,
is DexKitTarget.UsingStringVector -> {
check(target.findMethod) { "$target attempted to access method!" }
loadMethodFromCache(target)?.let { return it }
return DexDeobfsProvider.getCurrentBackend().doFindMethod(target)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ object DexKitFilter {
}

fun strInClsName(str: String, fullMatch: Boolean = false): dexkitFilter = { it: DexMethodDescriptor ->
if (fullMatch) str == it.declaringClass else str in it.declaringClass
val pattern = str.replace(".", "/")
if (fullMatch) pattern == it.declaringClass else pattern in it.declaringClass
}

fun strInSig(str: String, fullMatch: Boolean = false): dexkitFilter = { it: DexMethodDescriptor ->
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/java/io/github/qauxv/util/dexkit/DexKitTarget.kt
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@ sealed class DexKitTarget {
abstract val traitString: Array<String>
}

sealed class UsingStringVector : DexKitTarget() {
// relationship: ((v[0][0] && v[0][1] && ..) || (v[1][0] && v[1][1] && ..) || ..)
abstract val traitStringVectors: Array<Array<String>>
}

sealed class UsingDexkit : DexKitTarget()

abstract val declaringClass: String
Expand Down
93 changes: 55 additions & 38 deletions app/src/main/java/io/github/qauxv/util/dexkit/impl/DexKitDeobfs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import io.luckypray.dexkit.DexKitBridge
import io.luckypray.dexkit.builder.BatchFindArgs
import io.luckypray.dexkit.descriptor.member.DexMethodDescriptor as MethodDescriptor
import java.util.concurrent.locks.Lock
import kotlin.concurrent.withLock

class DexKitDeobfs private constructor(
private val mReadLock: Lock,
Expand All @@ -49,23 +50,33 @@ class DexKitDeobfs private constructor(
}

override fun doBatchFindMethodImpl(targetArray: Array<DexKitTarget>) {
data class TargetHolder(
val target: DexKitTarget,
val traitStringVectors: Array<Set<String>>
)

ensureOpen()
mReadLock.lock()
try {
mReadLock.withLock {
val helper = mDexKitBridge!!
val targets = targetArray.filterIsInstance<DexKitTarget.UsingStr>()
val methodDescriptorArray = Array(targets.size) {
DexKit.getMethodDescFromCacheImpl(targets[it])
val targets: MutableList<TargetHolder> = ArrayList()
targetArray.forEach { target ->
if (DexKit.getMethodDescFromCacheImpl(target) == null) {
if (target is DexKitTarget.UsingStringVector) {
// v2, Array<Array<String>> -> Array<Set<String>>
targets += TargetHolder(target, target.traitStringVectors.map { it.toSet() }.toTypedArray())
} else if (target is DexKitTarget.UsingStr) {
// v1, Array<String> -> Array<setOf<String>>
targets += TargetHolder(target, target.traitString.map { setOf(it) }.toTypedArray())
}
}
}
val deobfsMap = mutableMapOf<String, Set<String>>()
for (index in methodDescriptorArray.indices) {
if (methodDescriptorArray[index] == null) {
val target = targets[index]
val keys = target.traitString
keys.forEachIndexed { idx, key ->
// 可能存在不同版本的关键词,所以需要区分开来
deobfsMap["${target.name}#_#${idx}"] = setOf(key)
}
for (index in targets.indices) {
val target = targets[index]
val keys = target.traitStringVectors
keys.forEachIndexed { idx, key ->
// 可能存在不同版本的关键词,所以需要区分开来
deobfsMap["${target.target.name}#_#${idx}"] = key
}
}

Expand Down Expand Up @@ -94,42 +105,48 @@ class DexKitDeobfs private constructor(
target.descCache = ret.toString()
}
}
} finally {
mReadLock.unlock()
}
}

override fun doFindMethodImpl(target: DexKitTarget): DexMethodDescriptor? {
if (target !is DexKitTarget.UsingStr) return null
if (target !is DexKitTarget.UsingStr && target !is DexKitTarget.UsingStringVector) {
return null
}
ensureOpen()
mReadLock.lock()
try {
var ret = DexKit.getMethodDescFromCacheImpl(target)
if (ret != null) {
return ret
mReadLock.withLock {
val cached = DexKit.getMethodDescFromCacheImpl(target)
if (cached != null) {
return if (DexKit.NO_SUCH_METHOD.toString() == cached.toString()) null else cached
}
ensureOpen()
val helper = mDexKitBridge!!
val keys = target.traitString
val methods = keys.map { key ->
helper.findMethodUsingString {
usingString = key
}
}.flatMap { desc ->
desc.map { DexMethodDescriptor(it.descriptor) }
val keys: Array<Set<String>> = if (target is DexKitTarget.UsingStringVector) {
target.traitStringVectors.map { it.toSet() }.toTypedArray()
} else if (target is DexKitTarget.UsingStr) {
target.traitString.map { setOf(it) }.toTypedArray()
} else {
return null
}
if (methods.isNotEmpty()) {
ret = target.verifyTargetMethod(methods)
if (ret == null) {
Log.e("${methods.size} methods found for ${target.name}, none satisfactory, save null.")
ret = DexKit.NO_SUCH_METHOD
}
val resultMap = helper.batchFindMethodsUsingStrings(BatchFindArgs.build {
queryMap = keys.mapIndexed { index, set -> "${target.name}#_#${index}" to set }.toMap()
})
if(resultMap.isEmpty()){
Log.e("no result found for ${target.name}")
target.descCache = DexKit.NO_SUCH_METHOD.toString()
return null
}
val resultSet = resultMap.values.reduce { acc, set -> acc + set }
// verify
val ret = target.verifyTargetMethod(resultSet.map { DexMethodDescriptor(it.descriptor) })
if (ret == null) {
resultSet.map { it.descriptor }.forEach(Log::i)
Log.e("${resultSet.size} candidates found for " + target.name + ", none satisfactory, save null.")
target.descCache = DexKit.NO_SUCH_METHOD.toString()
return null
} else {
Log.d("save id: ${target.name},method: $ret")
target.descCache = ret.toString()
return ret
}
return ret
} finally {
mReadLock.unlock()
}
}

Expand Down

0 comments on commit 0279f7b

Please sign in to comment.