HookHelper.smali
.class public final Landhook/lib/HookHelper;
.super Ljava/lang/Object;
.source "HookHelper.java"
# annotations
.annotation system Ldalvik/annotation/MemberClasses;
value = {
Landhook/lib/HookHelper$Hook;
}
.end annotation
# static fields
.field public static final constructorName:Ljava/lang/String; = "<init>"
.field private static final sBackups:Ljava/util/concurrent/ConcurrentHashMap;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/util/concurrent/ConcurrentHashMap<",
"Landroid/util/Pair<",
"Ljava/lang/String;",
"Ljava/lang/String;",
">;",
"Ljava/lang/Integer;",
">;"
}
.end annotation
.end field
# direct methods
.method static constructor <clinit>()V
.registers 1
.line 19
new-instance v0, Ljava/util/concurrent/ConcurrentHashMap;
invoke-direct {v0}, Ljava/util/concurrent/ConcurrentHashMap;-><init>()V
sput-object v0, Landhook/lib/HookHelper;->sBackups:Ljava/util/concurrent/ConcurrentHashMap;
return-void
.end method
.method public constructor <init>()V
.registers 1
.line 17
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static applyHooks(Ljava/lang/Class;)V
.registers 2
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/Class<",
"*>;)V"
}
.end annotation
.line 287
invoke-virtual {p0}, Ljava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;
move-result-object v0
invoke-static {p0, v0}, Landhook/lib/HookHelper;->applyHooks(Ljava/lang/Class;Ljava/lang/ClassLoader;)V
return-void
.end method
.method public static applyHooks(Ljava/lang/Class;Ljava/lang/ClassLoader;)V
.registers 14
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/Class<",
"*>;",
"Ljava/lang/ClassLoader;",
")V"
}
.end annotation
const-string v0, "AndHook"
.line 292
invoke-virtual {p0}, Ljava/lang/Class;->getDeclaredMethods()[Ljava/lang/reflect/Method;
move-result-object p0
array-length v1, p0
const/4 v2, 0x0
const/4 v3, 0x0
:goto_9
if-ge v3, v1, :cond_82
aget-object v4, p0, v3
.line 293
const-class v5, Landhook/lib/HookHelper$Hook;
invoke-virtual {v4, v5}, Ljava/lang/reflect/Method;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
move-result-object v5
check-cast v5, Landhook/lib/HookHelper$Hook;
if-eqz v5, :cond_7f
.line 295
invoke-interface {v5}, Landhook/lib/HookHelper$Hook;->name()Ljava/lang/String;
move-result-object v6
.line 296
invoke-virtual {v6}, Ljava/lang/String;->isEmpty()Z
move-result v7
if-eqz v7, :cond_25
.line 297
invoke-virtual {v4}, Ljava/lang/reflect/Method;->getName()Ljava/lang/String;
move-result-object v6
.line 299
:cond_25
invoke-interface {v5}, Landhook/lib/HookHelper$Hook;->clazz()Ljava/lang/Class;
move-result-object v7
.line 301
:try_start_29
const-class v8, Landhook/lib/HookHelper$Hook;
if-ne v7, v8, :cond_35
.line 302
invoke-interface {v5}, Landhook/lib/HookHelper$Hook;->value()Ljava/lang/String;
move-result-object v7
invoke-virtual {p1, v7}, Ljava/lang/ClassLoader;->loadClass(Ljava/lang/String;)Ljava/lang/Class;
move-result-object v7
.line 304
:cond_35
invoke-virtual {v4}, Ljava/lang/reflect/Method;->getParameterTypes()[Ljava/lang/Class;
move-result-object v8
.line 305
array-length v9, v8
const/4 v10, 0x1
if-ge v9, v10, :cond_43
const-string v4, "unexpected args number!"
.line 306
invoke-static {v0, v4}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
goto :goto_7f
.line 309
:cond_43
array-length v9, v8
sub-int/2addr v9, v10
new-array v9, v9, [Ljava/lang/Class;
.line 310
array-length v11, v9
invoke-static {v8, v10, v9, v2, v11}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 314
invoke-static {v7, v6}, Landhook/lib/HookHelper;->isConstructor(Ljava/lang/Class;Ljava/lang/String;)Z
move-result v8
if-eqz v8, :cond_56
.line 315
invoke-static {v7, v9}, Landhook/lib/HookHelper;->findConstructorHierarchically(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
move-result-object v6
goto :goto_5a
.line 318
:cond_56
invoke-static {v7, v6, v9}, Landhook/lib/HookHelper;->findMethodHierarchically(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
move-result-object v6
:goto_5a
if-eqz v6, :cond_7f
.line 322
invoke-interface {v6}, Ljava/lang/reflect/Member;->getModifiers()I
move-result v8
invoke-static {v8}, Ljava/lang/reflect/Modifier;->isStatic(I)Z
move-result v8
if-eqz v8, :cond_69
.line 323
invoke-static {v7}, Landhook/lib/AndHook;->ensureClassInitialized(Ljava/lang/Class;)Z
.line 325
:cond_69
invoke-interface {v5}, Landhook/lib/HookHelper$Hook;->need_origin()Z
move-result v5
if-eqz v5, :cond_73
.line 326
invoke-static {v6, v4}, Landhook/lib/HookHelper;->hook(Ljava/lang/reflect/Member;Ljava/lang/reflect/Method;)V
goto :goto_7f
.line 328
:cond_73
invoke-static {v6, v4}, Landhook/lib/AndHook;->hookNoBackup(Ljava/lang/reflect/Member;Ljava/lang/Object;)V
:try_end_76
.catch Ljava/lang/Exception; {:try_start_29 .. :try_end_76} :catch_77
goto :goto_7f
:catch_77
move-exception v4
.line 332
invoke-virtual {v4}, Ljava/lang/Exception;->getMessage()Ljava/lang/String;
move-result-object v5
invoke-static {v0, v5, v4}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
:cond_7f
:goto_7f
add-int/lit8 v3, v3, 0x1
goto :goto_9
:cond_82
return-void
.end method
.method public static findClass(Ljava/lang/String;)Ljava/lang/Class;
.registers 2
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/String;",
")",
"Ljava/lang/Class<",
"*>;"
}
.end annotation
.line 186
const-class v0, Landhook/lib/AndHook;
invoke-virtual {v0}, Ljava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;
move-result-object v0
invoke-static {p0, v0}, Landhook/lib/HookHelper;->findClass(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/Class;
move-result-object p0
return-object p0
.end method
.method public static findClass(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/Class;
.registers 5
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/String;",
"Ljava/lang/ClassLoader;",
")",
"Ljava/lang/Class<",
"*>;"
}
.end annotation
.line 192
:try_start_0
invoke-virtual {p1, p0}, Ljava/lang/ClassLoader;->loadClass(Ljava/lang/String;)Ljava/lang/Class;
move-result-object p0
:try_end_4
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_4} :catch_5
return-object p0
:catch_5
move-exception v0
.line 194
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "failed to find class "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
const-string p0, " on ClassLoader "
invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p0
const-string p1, "AndHook"
invoke-static {p1, p0, v0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
const/4 p0, 0x0
return-object p0
.end method
.method public static varargs findConstructorHierarchically(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
.registers 4
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/Class<",
"*>;[",
"Ljava/lang/Class<",
"*>;)",
"Ljava/lang/reflect/Constructor<",
"*>;"
}
.end annotation
const/4 v0, 0x0
move-object v1, v0
move-object v0, p0
.line 228
:cond_3
:try_start_3
invoke-virtual {v0, p1}, Ljava/lang/Class;->getDeclaredConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
move-result-object v1
:try_end_7
.catch Ljava/lang/NoSuchMethodException; {:try_start_3 .. :try_end_7} :catch_8
goto :goto_f
.line 230
:catch_8
invoke-virtual {v0}, Ljava/lang/Class;->getSuperclass()Ljava/lang/Class;
move-result-object v0
if-nez v0, :cond_f
goto :goto_11
:cond_f
:goto_f
if-eqz v1, :cond_3
:goto_11
if-eqz v1, :cond_18
const/4 p0, 0x1
.line 236
invoke-virtual {v1, p0}, Ljava/lang/reflect/Constructor;->setAccessible(Z)V
goto :goto_32
.line 238
:cond_18
new-instance p1, Ljava/lang/StringBuilder;
invoke-direct {p1}, Ljava/lang/StringBuilder;-><init>()V
const-string v0, "failed to find constructor of class "
invoke-virtual {p1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 239
invoke-virtual {p0}, Ljava/lang/Class;->getName()Ljava/lang/String;
move-result-object p0
invoke-virtual {p1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p0
const-string p1, "AndHook"
.line 238
invoke-static {p1, p0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
:goto_32
return-object v1
.end method
.method public static findFieldHierarchically(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field;
.registers 5
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/Class<",
"*>;",
"Ljava/lang/String;",
")",
"Ljava/lang/reflect/Field;"
}
.end annotation
const/4 v0, 0x0
move-object v1, v0
move-object v0, p0
.line 206
:cond_3
:try_start_3
invoke-virtual {v0, p1}, Ljava/lang/Class;->getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field;
move-result-object v1
:try_end_7
.catch Ljava/lang/NoSuchFieldException; {:try_start_3 .. :try_end_7} :catch_8
goto :goto_f
.line 208
:catch_8
invoke-virtual {v0}, Ljava/lang/Class;->getSuperclass()Ljava/lang/Class;
move-result-object v0
if-nez v0, :cond_f
goto :goto_11
:cond_f
:goto_f
if-eqz v1, :cond_3
:goto_11
if-eqz v1, :cond_18
const/4 p0, 0x1
.line 214
invoke-virtual {v1, p0}, Ljava/lang/reflect/Field;->setAccessible(Z)V
goto :goto_3a
.line 216
:cond_18
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "failed to find field "
invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
const-string p1, " of class "
invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 217
invoke-virtual {p0}, Ljava/lang/Class;->getName()Ljava/lang/String;
move-result-object p0
invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p0
const-string p1, "AndHook"
.line 216
invoke-static {p1, p0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
:goto_3a
return-object v1
.end method
.method public static varargs findMethodHierarchically(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
.registers 5
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/Class<",
"*>;",
"Ljava/lang/String;",
"[",
"Ljava/lang/Class<",
"*>;)",
"Ljava/lang/reflect/Method;"
}
.end annotation
const/4 v0, 0x0
move-object v1, v0
move-object v0, p0
.line 250
:cond_3
:try_start_3
invoke-virtual {v0, p1, p2}, Ljava/lang/Class;->getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
move-result-object v1
:try_end_7
.catch Ljava/lang/NoSuchMethodException; {:try_start_3 .. :try_end_7} :catch_8
goto :goto_f
.line 252
:catch_8
invoke-virtual {v0}, Ljava/lang/Class;->getSuperclass()Ljava/lang/Class;
move-result-object v0
if-nez v0, :cond_f
goto :goto_11
:cond_f
:goto_f
if-eqz v1, :cond_3
:goto_11
if-eqz v1, :cond_18
const/4 p0, 0x1
.line 258
invoke-virtual {v1, p0}, Ljava/lang/reflect/Method;->setAccessible(Z)V
goto :goto_3a
.line 260
:cond_18
new-instance p2, Ljava/lang/StringBuilder;
invoke-direct {p2}, Ljava/lang/StringBuilder;-><init>()V
const-string v0, "failed to find method "
invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p2, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
const-string p1, " of class "
invoke-virtual {p2, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 261
invoke-virtual {p0}, Ljava/lang/Class;->getName()Ljava/lang/String;
move-result-object p0
invoke-virtual {p2, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p0
const-string p1, "AndHook"
.line 260
invoke-static {p1, p0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
:goto_3a
return-object v1
.end method
.method private static getBackupSlot(I)I
.registers 6
.line 81
invoke-static {}, Ljava/lang/Thread;->currentThread()Ljava/lang/Thread;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/Thread;->getStackTrace()[Ljava/lang/StackTraceElement;
move-result-object v0
const/4 v1, 0x4
aget-object v0, v0, v1
.line 82
invoke-virtual {v0}, Ljava/lang/StackTraceElement;->getClassName()Ljava/lang/String;
move-result-object v1
const-string v2, "com.applisto.appcloner.hooking.Hooking"
.line 83
invoke-virtual {v2, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v2
if-eqz v2, :cond_26
.line 84
invoke-static {}, Ljava/lang/Thread;->currentThread()Ljava/lang/Thread;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/Thread;->getStackTrace()[Ljava/lang/StackTraceElement;
move-result-object v0
const/4 v1, 0x5
aget-object v0, v0, v1
.line 85
invoke-virtual {v0}, Ljava/lang/StackTraceElement;->getClassName()Ljava/lang/String;
move-result-object v1
.line 88
:cond_26
sget-object v2, Landhook/lib/HookHelper;->sBackups:Ljava/util/concurrent/ConcurrentHashMap;
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
.line 89
invoke-virtual {v0}, Ljava/lang/StackTraceElement;->getMethodName()Ljava/lang/String;
move-result-object v4
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v3, p0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v3
.line 88
invoke-static {v1, v3}, Landroid/util/Pair;->create(Ljava/lang/Object;Ljava/lang/Object;)Landroid/util/Pair;
move-result-object v3
invoke-virtual {v2, v3}, Ljava/util/concurrent/ConcurrentHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v2
check-cast v2, Ljava/lang/Integer;
if-nez v2, :cond_71
.line 91
new-instance v2, Ljava/lang/StringBuilder;
invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V
const-string v3, "no backup found for "
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
const-string v1, "@"
invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 93
invoke-virtual {v0}, Ljava/lang/StackTraceElement;->getMethodName()Ljava/lang/String;
move-result-object v0
invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v2, p0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p0
const-string v0, "AndHook"
.line 91
invoke-static {v0, p0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
const/4 p0, -0x1
return p0
.line 96
:cond_71
invoke-virtual {v2}, Ljava/lang/Integer;->intValue()I
move-result p0
return p0
.end method
.method public static hook(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/reflect/Method;)V
.registers 6
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/Class<",
"*>;",
"Ljava/lang/String;",
"Ljava/lang/String;",
"Ljava/lang/reflect/Method;",
")V"
}
.end annotation
.line 47
invoke-static {p3}, Landhook/lib/HookHelper;->uniqueKey(Ljava/lang/reflect/Method;)Landroid/util/Pair;
move-result-object v0
if-nez v0, :cond_7
return-void
.line 50
:cond_7
invoke-static {p3}, Landhook/lib/HookHelper;->warnKnownIssue(Ljava/lang/reflect/Method;)V
.line 51
invoke-static {p0, p1, p2}, Landhook/lib/AndHook;->backup(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)I
move-result v0
const/4 v1, -0x1
if-eq v0, v1, :cond_1e
.line 52
invoke-static {v0}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v1
invoke-static {v1, p3}, Landhook/lib/HookHelper;->saveBackupSlot(Ljava/lang/Integer;Ljava/lang/reflect/Method;)Z
move-result v1
if-eqz v1, :cond_1e
.line 53
invoke-static {p0, p1, p2, p3, v0}, Landhook/lib/AndHook;->hook(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;I)Z
:cond_1e
return-void
.end method
.method public static hook(Ljava/lang/reflect/Member;Ljava/lang/reflect/Method;)V
.registers 4
.line 35
invoke-static {p1}, Landhook/lib/HookHelper;->uniqueKey(Ljava/lang/reflect/Method;)Landroid/util/Pair;
move-result-object v0
if-nez v0, :cond_7
return-void
.line 38
:cond_7
invoke-static {p1}, Landhook/lib/HookHelper;->warnKnownIssue(Ljava/lang/reflect/Method;)V
.line 39
invoke-static {p0}, Landhook/lib/AndHook;->backup(Ljava/lang/reflect/Member;)I
move-result v0
const/4 v1, -0x1
if-eq v0, v1, :cond_1e
.line 40
invoke-static {v0}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v1
invoke-static {v1, p1}, Landhook/lib/HookHelper;->saveBackupSlot(Ljava/lang/Integer;Ljava/lang/reflect/Method;)Z
move-result v1
if-eqz v1, :cond_1e
.line 41
invoke-static {p0, p1, v0}, Landhook/lib/AndHook;->hook(Ljava/lang/reflect/Member;Ljava/lang/Object;I)Z
:cond_1e
return-void
.end method
.method public static varargs invokeBooleanOrigin(Ljava/lang/Object;[Ljava/lang/Object;)Z
.registers 3
.line 106
array-length v0, p1
invoke-static {v0}, Landhook/lib/HookHelper;->getBackupSlot(I)I
move-result v0
invoke-static {v0, p0, p1}, Landhook/lib/AndHook;->invokeBooleanMethod(ILjava/lang/Object;[Ljava/lang/Object;)Z
move-result p0
return p0
.end method
.method public static varargs invokeByteOrigin(Ljava/lang/Object;[Ljava/lang/Object;)B
.registers 3
.line 112
array-length v0, p1
invoke-static {v0}, Landhook/lib/HookHelper;->getBackupSlot(I)I
move-result v0
invoke-static {v0, p0, p1}, Landhook/lib/AndHook;->invokeByteMethod(ILjava/lang/Object;[Ljava/lang/Object;)B
move-result p0
return p0
.end method
.method public static varargs invokeCharOrigin(Ljava/lang/Object;[Ljava/lang/Object;)C
.registers 3
.line 124
array-length v0, p1
invoke-static {v0}, Landhook/lib/HookHelper;->getBackupSlot(I)I
move-result v0
invoke-static {v0, p0, p1}, Landhook/lib/AndHook;->invokeCharMethod(ILjava/lang/Object;[Ljava/lang/Object;)C
move-result p0
return p0
.end method
.method public static varargs invokeDoubleOrigin(Ljava/lang/Object;[Ljava/lang/Object;)D
.registers 3
.line 148
array-length v0, p1
invoke-static {v0}, Landhook/lib/HookHelper;->getBackupSlot(I)I
move-result v0
invoke-static {v0, p0, p1}, Landhook/lib/AndHook;->invokeDoubleMethod(ILjava/lang/Object;[Ljava/lang/Object;)D
move-result-wide p0
return-wide p0
.end method
.method public static varargs invokeFloatOrigin(Ljava/lang/Object;[Ljava/lang/Object;)F
.registers 3
.line 142
array-length v0, p1
invoke-static {v0}, Landhook/lib/HookHelper;->getBackupSlot(I)I
move-result v0
invoke-static {v0, p0, p1}, Landhook/lib/AndHook;->invokeFloatMethod(ILjava/lang/Object;[Ljava/lang/Object;)F
move-result p0
return p0
.end method
.method public static varargs invokeIntOrigin(Ljava/lang/Object;[Ljava/lang/Object;)I
.registers 3
.line 130
array-length v0, p1
invoke-static {v0}, Landhook/lib/HookHelper;->getBackupSlot(I)I
move-result v0
invoke-static {v0, p0, p1}, Landhook/lib/AndHook;->invokeIntMethod(ILjava/lang/Object;[Ljava/lang/Object;)I
move-result p0
return p0
.end method
.method public static varargs invokeLongOrigin(Ljava/lang/Object;[Ljava/lang/Object;)J
.registers 3
.line 136
array-length v0, p1
invoke-static {v0}, Landhook/lib/HookHelper;->getBackupSlot(I)I
move-result v0
invoke-static {v0, p0, p1}, Landhook/lib/AndHook;->invokeLongMethod(ILjava/lang/Object;[Ljava/lang/Object;)J
move-result-wide p0
return-wide p0
.end method
.method public static varargs invokeObjectOrigin(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
.registers 3
.annotation system Ldalvik/annotation/Signature;
value = {
"<T:",
"Ljava/lang/Object;",
">(",
"Ljava/lang/Object;",
"[",
"Ljava/lang/Object;",
")TT;"
}
.end annotation
.line 155
array-length v0, p1
invoke-static {v0}, Landhook/lib/HookHelper;->getBackupSlot(I)I
move-result v0
invoke-static {v0, p0, p1}, Landhook/lib/AndHook;->invoke(ILjava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
move-result-object p0
return-object p0
.end method
.method public static varargs invokeShortOrigin(Ljava/lang/Object;[Ljava/lang/Object;)S
.registers 3
.line 118
array-length v0, p1
invoke-static {v0}, Landhook/lib/HookHelper;->getBackupSlot(I)I
move-result v0
invoke-static {v0, p0, p1}, Landhook/lib/AndHook;->invokeShortMethod(ILjava/lang/Object;[Ljava/lang/Object;)S
move-result p0
return p0
.end method
.method public static varargs invokeVoidOrigin(Ljava/lang/Object;[Ljava/lang/Object;)V
.registers 3
.line 101
array-length v0, p1
invoke-static {v0}, Landhook/lib/HookHelper;->getBackupSlot(I)I
move-result v0
invoke-static {v0, p0, p1}, Landhook/lib/AndHook;->invokeVoidMethod(ILjava/lang/Object;[Ljava/lang/Object;)V
return-void
.end method
.method private static isConstructor(Ljava/lang/Class;Ljava/lang/String;)Z
.registers 4
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/Class<",
"*>;",
"Ljava/lang/String;",
")Z"
}
.end annotation
.line 268
invoke-virtual {p0}, Ljava/lang/Class;->getName()Ljava/lang/String;
move-result-object p0
const-string v0, "<init>"
.line 269
invoke-virtual {p1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-nez v0, :cond_3d
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v1, "."
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
.line 270
invoke-virtual {p0, v0}, Ljava/lang/String;->endsWith(Ljava/lang/String;)Z
move-result v0
if-nez v0, :cond_3d
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v1, "$"
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p1
.line 271
invoke-virtual {p0, p1}, Ljava/lang/String;->endsWith(Ljava/lang/String;)Z
move-result p0
if-eqz p0, :cond_3b
goto :goto_3d
:cond_3b
const/4 p0, 0x0
goto :goto_3e
:cond_3d
:goto_3d
const/4 p0, 0x1
:goto_3e
return p0
.end method
.method private static saveBackupSlot(Ljava/lang/Integer;Ljava/lang/reflect/Method;)Z
.registers 4
.line 69
invoke-static {p1}, Landhook/lib/HookHelper;->uniqueKey(Ljava/lang/reflect/Method;)Landroid/util/Pair;
move-result-object p1
if-nez p1, :cond_8
const/4 p0, 0x0
return p0
.line 73
:cond_8
sget-object v0, Landhook/lib/HookHelper;->sBackups:Ljava/util/concurrent/ConcurrentHashMap;
invoke-virtual {v0, p1, p0}, Ljava/util/concurrent/ConcurrentHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
.line 74
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v1, "saved backup for "
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
iget-object v1, p1, Landroid/util/Pair;->first:Ljava/lang/Object;
check-cast v1, Ljava/lang/String;
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
const-string v1, "@"
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
iget-object p1, p1, Landroid/util/Pair;->second:Ljava/lang/Object;
check-cast p1, Ljava/lang/String;
invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
const-string p1, ", slot = "
invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p0
const-string p1, "AndHook"
invoke-static {p1, p0}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
const/4 p0, 0x1
return p0
.end method
.method public static setObjectField(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V
.registers 4
.line 161
invoke-virtual {p0}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
move-result-object v0
invoke-static {v0, p1}, Landhook/lib/HookHelper;->findFieldHierarchically(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field;
move-result-object v0
if-eqz v0, :cond_25
.line 164
:try_start_a
invoke-virtual {v0, p0, p2}, Ljava/lang/reflect/Field;->set(Ljava/lang/Object;Ljava/lang/Object;)V
:try_end_d
.catch Ljava/lang/Exception; {:try_start_a .. :try_end_d} :catch_e
goto :goto_25
:catch_e
move-exception p0
.line 166
new-instance p2, Ljava/lang/StringBuilder;
invoke-direct {p2}, Ljava/lang/StringBuilder;-><init>()V
const-string v0, "failed to set instance field "
invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p2, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p1
const-string p2, "AndHook"
invoke-static {p2, p1, p0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
:cond_25
:goto_25
return-void
.end method
.method public static setStaticObjectField(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Object;)V
.registers 5
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/Class<",
"*>;",
"Ljava/lang/String;",
"Ljava/lang/Object;",
")V"
}
.end annotation
.line 174
invoke-static {p0, p1}, Landhook/lib/HookHelper;->findFieldHierarchically(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field;
move-result-object v0
if-eqz v0, :cond_2e
const/4 v1, 0x0
.line 177
:try_start_7
invoke-virtual {v0, v1, p2}, Ljava/lang/reflect/Field;->set(Ljava/lang/Object;Ljava/lang/Object;)V
:try_end_a
.catch Ljava/lang/Exception; {:try_start_7 .. :try_end_a} :catch_b
goto :goto_2e
:catch_b
move-exception p2
.line 179
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v1, "failed to set static field "
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
const-string p1, " for class "
invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 180
invoke-virtual {p0}, Ljava/lang/Class;->getName()Ljava/lang/String;
move-result-object p0
invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p0
const-string p1, "AndHook"
.line 179
invoke-static {p1, p0, p2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
:cond_2e
:goto_2e
return-void
.end method
.method private static uniqueKey(Ljava/lang/reflect/Method;)Landroid/util/Pair;
.registers 4
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/reflect/Method;",
")",
"Landroid/util/Pair<",
"Ljava/lang/String;",
"Ljava/lang/String;",
">;"
}
.end annotation
.line 59
invoke-virtual {p0}, Ljava/lang/reflect/Method;->getDeclaringClass()Ljava/lang/Class;
move-result-object v0
.line 60
invoke-virtual {v0}, Ljava/lang/Class;->getName()Ljava/lang/String;
move-result-object v0
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {p0}, Ljava/lang/reflect/Method;->getName()Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p0}, Ljava/lang/reflect/Method;->getParameterTypes()[Ljava/lang/Class;
move-result-object p0
array-length p0, p0
add-int/lit8 p0, p0, -0x1
invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p0
.line 59
invoke-static {v0, p0}, Landroid/util/Pair;->create(Ljava/lang/Object;Ljava/lang/Object;)Landroid/util/Pair;
move-result-object p0
.line 61
sget-object v0, Landhook/lib/HookHelper;->sBackups:Ljava/util/concurrent/ConcurrentHashMap;
invoke-virtual {v0, p0}, Ljava/util/concurrent/ConcurrentHashMap;->containsKey(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_36
const-string p0, "AndHook"
const-string v0, "duplicate key error! already hooked?"
.line 62
invoke-static {p0, v0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
const/4 p0, 0x0
:cond_36
return-object p0
.end method
.method private static warnKnownIssue(Ljava/lang/reflect/Method;)V
.registers 3
.line 22
invoke-virtual {p0}, Ljava/lang/reflect/Method;->getModifiers()I
move-result v0
invoke-static {v0}, Ljava/lang/reflect/Modifier;->isStatic(I)Z
move-result v0
if-eqz v0, :cond_1f
.line 23
invoke-virtual {p0}, Ljava/lang/reflect/Method;->getParameterTypes()[Ljava/lang/Class;
move-result-object v0
array-length v0, v0
const/4 v1, 0x1
if-lt v0, v1, :cond_1f
.line 24
invoke-virtual {p0}, Ljava/lang/reflect/Method;->getParameterTypes()[Ljava/lang/Class;
move-result-object v0
const/4 v1, 0x0
aget-object v0, v0, v1
invoke-virtual {v0}, Ljava/lang/Class;->isPrimitive()Z
move-result v0
if-eqz v0, :cond_4e
.line 25
:cond_1f
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v1, "method "
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 27
invoke-virtual {p0}, Ljava/lang/reflect/Method;->getDeclaringClass()Ljava/lang/Class;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/Class;->getName()Ljava/lang/String;
move-result-object v1
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
const-string v1, "@"
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 29
invoke-virtual {p0}, Ljava/lang/reflect/Method;->getName()Ljava/lang/String;
move-result-object p0
invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
const-string p0, " must be static and its first argument must be Class<?> or Object!"
invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p0
const-string v0, "AndHook"
.line 25
invoke-static {v0, p0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
:cond_4e
return-void
.end method