feat: Allow unknown opcodes using null

This is the same as `??` in IDA signatures.
This commit is contained in:
Lucaskyy 2022-04-14 18:29:37 +02:00
parent 3bfc24fc16
commit f4a47d4dc8
No known key found for this signature in database
GPG key ID: 1530BFF96D1EEB89
2 changed files with 11 additions and 3 deletions

View file

@ -10,13 +10,14 @@ import org.jf.dexlib2.Opcode
* @param accessFlags The access flags of the method. * @param accessFlags The access flags of the method.
* @param methodParameters The parameters of the method. * @param methodParameters The parameters of the method.
* @param opcodes The list of opcodes of the method. * @param opcodes The list of opcodes of the method.
* A `null` opcode is equals to an unknown opcode.
*/ */
class MethodSignature( class MethodSignature(
val metadata: MethodSignatureMetadata, val metadata: MethodSignatureMetadata,
internal val returnType: String?, internal val returnType: String?,
internal val accessFlags: Int?, internal val accessFlags: Int?,
internal val methodParameters: Iterable<String>?, internal val methodParameters: Iterable<String>?,
internal val opcodes: Iterable<Opcode>? internal val opcodes: Iterable<Opcode?>?
) { ) {
/** /**
* The result of the signature * The result of the signature

View file

@ -93,7 +93,11 @@ internal class SignatureResolver(
while (instructionIndex + patternIndex < count) { while (instructionIndex + patternIndex < count) {
val originalOpcode = instructions.elementAt(instructionIndex + patternIndex).opcode val originalOpcode = instructions.elementAt(instructionIndex + patternIndex).opcode
val patternOpcode = pattern.elementAt(patternIndex) val patternOpcode = pattern.elementAt(patternIndex)
if (originalOpcode != patternOpcode && currentThreshold-- == 0) break if (
patternOpcode != null && // unknown opcode
originalOpcode != patternOpcode &&
currentThreshold-- == 0
) break
if (++patternIndex < size) continue if (++patternIndex < size) continue
val result = PatternScanResult(instructionIndex, instructionIndex + patternIndex) val result = PatternScanResult(instructionIndex, instructionIndex + patternIndex)
@ -125,7 +129,10 @@ internal class SignatureResolver(
for ((patternIndex, originalIndex) in (scanResult.startIndex until scanResult.endIndex).withIndex()) { for ((patternIndex, originalIndex) in (scanResult.startIndex until scanResult.endIndex).withIndex()) {
val originalOpcode = instructions.elementAt(originalIndex).opcode val originalOpcode = instructions.elementAt(originalIndex).opcode
val patternOpcode = pattern.elementAt(patternIndex) val patternOpcode = pattern.elementAt(patternIndex)
if (originalOpcode != patternOpcode) { if (
patternOpcode != null && // unknown opcode
originalOpcode != patternOpcode
) {
this.add( this.add(
PatternScanMethod.Fuzzy.Warning( PatternScanMethod.Fuzzy.Warning(
originalOpcode, patternOpcode, originalOpcode, patternOpcode,