Android反编译破解签名验证
2016-12-18 本文已影响4000人
2b75747cf703
很多apk对签名做了验证,重新打包的apk没办法运行,不过签名验证都是可破解的。
Paste_Image.png不管代码如何混淆,核心代码怎么藏,肯定离不开签名获取的API调用。
如果涉及到服务端验证,先安装原包,读取原包的签名数据,得到签名数据后原包就可以删除了。
从这里我们可以知道,获取签名肯定离不开signatures这个变量,对反编译出来smali文件夹全文查找。
推荐使用Sublime Text
Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature;
可能会搜索出很多地方,不过一般第三方sdk可以不用考虑,比如支付、推送、广告等。
Paste_Image.png然后分析一下前后代码,看不懂smali语法也没关系,切换到Java Decompiler看java代码就行。
Paste_Image.png前后可能看不到最终的验证结果判断,所以要能够知道函数调用堆栈。
invoke-static { }, Lcom/qiang/framework/LogHelper;->debug()V
在logcat中可以看到如下结果
Paste_Image.png
LogHelper.java
package com.qiang.framework;
import android.util.Log;
import com.qiang.gson.Gson;
import com.qiang.gson.GsonBuilder;
public class LogHelper
{
private static final String TAG = "Debug";
private static Gson gson = new GsonBuilder().setPrettyPrinting().create();
public static String getStackTrace(int start)
{
return getStackTrace(start, 5);
}
public static String getStackTrace(int start, int count)
{
StringBuilder stringBuilder = new StringBuilder();
StackTraceElement[] stackTraceElements = new RuntimeException().getStackTrace();
int i = start;
while (i < stackTraceElements.length && i < start + count)
{
stringBuilder.append("\t");
stringBuilder.append("at");
stringBuilder.append(" ");
stringBuilder.append(stackTraceElements[i].toString());
stringBuilder.append("\n");
i += 1;
}
return stringBuilder.toString();
}
public static int debug(String tag, String msg)
{
return Log.d(TAG, tag + ": " + msg + "\n" + getStackTrace(3));
}
public static int debug(String tag, String msg, Throwable throwable)
{
return Log.d(TAG, tag + ": " + msg + "\n" + getStackTrace(3), throwable);
}
public static void debug()
{
Log.d(TAG, TAG + "\n" + getStackTrace(3));
}
public static void debug(Object msg)
{
Log.d(TAG, gson.toJson(msg) + "\n" + getStackTrace(3));
}
public static void debug(Object msg, int count)
{
Log.d(TAG, gson.toJson(msg) + "\n" + getStackTrace(3, count));
}
public static int error(String tag, String msg)
{
return Log.e(TAG, tag + ": " + msg + "\n" + getStackTrace(3));
}
public static int error(String tag, String msg, Throwable throwable)
{
return Log.e(TAG, tag + ": " + msg + "\n" + getStackTrace(3), throwable);
}
public static void error()
{
Log.e(TAG, TAG + "\n" + getStackTrace(3));
}
public static void error(Object msg)
{
Log.e(TAG, gson.toJson(msg) + "\n" + getStackTrace(3));
}
public static void error(Object msg, int paramInt)
{
Log.e(TAG, gson.toJson(msg) + "\n" + getStackTrace(3, paramInt));
}
public static int info(String tag, String msg)
{
return Log.i(TAG, tag + ": " + msg + "\n" + getStackTrace(3));
}
public static int info(String tag, String msg, Throwable throwable)
{
return Log.i(TAG, tag + ": " + msg + "\n" + getStackTrace(3), throwable);
}
public static void info()
{
Log.i(TAG, TAG + "\n" + getStackTrace(3));
}
public static void info(Object msg)
{
Log.i(TAG, gson.toJson(msg) + "\n" + getStackTrace(3));
}
public static void info(Object msg, int count)
{
Log.i(TAG, gson.toJson(msg) + "\n" + getStackTrace(3, count));
}
public static int warning(String tag, String msg)
{
return Log.w(TAG, tag + ": " + msg + "\n" + getStackTrace(3));
}
public static int warning(String tag, String msg, Throwable throwable)
{
return Log.w(TAG, tag + ": " + msg + "\n" + getStackTrace(3), throwable);
}
public static void warning()
{
Log.w(TAG, TAG + "\n" + getStackTrace(3));
}
public static void warning(Object msg)
{
Log.w(TAG, gson.toJson(msg) + "\n" + getStackTrace(3));
}
public static void warning(Object msg, int count)
{
Log.w(TAG, gson.toJson(msg) + "\n" + getStackTrace(3, count));
}
}
LogHelper.smali
.class public Lcom/qiang/framework/LogHelper;
.super Ljava/lang/Object;
.source "LogHelper.java"
# static fields
.field private static final TAG:Ljava/lang/String; = "Debug"
.field private static gson:Lcom/qiang/gson/Gson;
# direct methods
.method static constructor <clinit>()V
.locals 1
.prologue
.line 10
new-instance v0, Lcom/qiang/gson/GsonBuilder;
invoke-direct {v0}, Lcom/qiang/gson/GsonBuilder;-><init>()V
invoke-virtual {v0}, Lcom/qiang/gson/GsonBuilder;->setPrettyPrinting()Lcom/qiang/gson/GsonBuilder;
move-result-object v0
invoke-virtual {v0}, Lcom/qiang/gson/GsonBuilder;->create()Lcom/qiang/gson/Gson;
move-result-object v0
sput-object v0, Lcom/qiang/framework/LogHelper;->gson:Lcom/qiang/gson/Gson;
return-void
.end method
.method public constructor <init>()V
.locals 0
.prologue
.line 7
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static debug(Ljava/lang/String;Ljava/lang/String;)I
.locals 3
.param p0, "tag" # Ljava/lang/String;
.param p1, "msg" # Ljava/lang/String;
.prologue
.line 37
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, ": "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
move-result v0
return v0
.end method
.method public static debug(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
.locals 3
.param p0, "tag" # Ljava/lang/String;
.param p1, "msg" # Ljava/lang/String;
.param p2, "throwable" # Ljava/lang/Throwable;
.prologue
.line 42
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, ": "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1, p2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
move-result v0
return v0
.end method
.method public static debug()V
.locals 3
.prologue
.line 47
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "Debug\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 48
return-void
.end method
.method public static debug(Ljava/lang/Object;)V
.locals 3
.param p0, "msg" # Ljava/lang/Object;
.prologue
.line 52
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
sget-object v2, Lcom/qiang/framework/LogHelper;->gson:Lcom/qiang/gson/Gson;
invoke-virtual {v2, p0}, Lcom/qiang/gson/Gson;->toJson(Ljava/lang/Object;)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 53
return-void
.end method
.method public static debug(Ljava/lang/Object;I)V
.locals 3
.param p0, "msg" # Ljava/lang/Object;
.param p1, "count" # I
.prologue
.line 57
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
sget-object v2, Lcom/qiang/framework/LogHelper;->gson:Lcom/qiang/gson/Gson;
invoke-virtual {v2, p0}, Lcom/qiang/gson/Gson;->toJson(Ljava/lang/Object;)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2, p1}, Lcom/qiang/framework/LogHelper;->getStackTrace(II)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 58
return-void
.end method
.method public static error(Ljava/lang/String;Ljava/lang/String;)I
.locals 3
.param p0, "tag" # Ljava/lang/String;
.param p1, "msg" # Ljava/lang/String;
.prologue
.line 62
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, ": "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
move-result v0
return v0
.end method
.method public static error(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
.locals 3
.param p0, "tag" # Ljava/lang/String;
.param p1, "msg" # Ljava/lang/String;
.param p2, "throwable" # Ljava/lang/Throwable;
.prologue
.line 67
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, ": "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1, p2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
move-result v0
return v0
.end method
.method public static error()V
.locals 3
.prologue
.line 72
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "Debug\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
.line 73
return-void
.end method
.method public static error(Ljava/lang/Object;)V
.locals 3
.param p0, "msg" # Ljava/lang/Object;
.prologue
.line 77
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
sget-object v2, Lcom/qiang/framework/LogHelper;->gson:Lcom/qiang/gson/Gson;
invoke-virtual {v2, p0}, Lcom/qiang/gson/Gson;->toJson(Ljava/lang/Object;)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
.line 78
return-void
.end method
.method public static error(Ljava/lang/Object;I)V
.locals 3
.param p0, "msg" # Ljava/lang/Object;
.param p1, "paramInt" # I
.prologue
.line 82
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
sget-object v2, Lcom/qiang/framework/LogHelper;->gson:Lcom/qiang/gson/Gson;
invoke-virtual {v2, p0}, Lcom/qiang/gson/Gson;->toJson(Ljava/lang/Object;)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2, p1}, Lcom/qiang/framework/LogHelper;->getStackTrace(II)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
.line 83
return-void
.end method
.method public static getStackTrace(I)Ljava/lang/String;
.locals 1
.param p0, "start" # I
.prologue
.line 14
const/4 v0, 0x5
invoke-static {p0, v0}, Lcom/qiang/framework/LogHelper;->getStackTrace(II)Ljava/lang/String;
move-result-object v0
return-object v0
.end method
.method public static getStackTrace(II)Ljava/lang/String;
.locals 4
.param p0, "start" # I
.param p1, "count" # I
.prologue
.line 19
new-instance v2, Ljava/lang/StringBuilder;
invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V
.line 20
.local v2, "stringBuilder":Ljava/lang/StringBuilder;
new-instance v3, Ljava/lang/RuntimeException;
invoke-direct {v3}, Ljava/lang/RuntimeException;-><init>()V
invoke-virtual {v3}, Ljava/lang/RuntimeException;->getStackTrace()[Ljava/lang/StackTraceElement;
move-result-object v1
.line 21
.local v1, "stackTraceElements":[Ljava/lang/StackTraceElement;
move v0, p0
.line 22
.local v0, "i":I
:goto_0
array-length v3, v1
if-ge v0, v3, :cond_0
add-int v3, p0, p1
if-ge v0, v3, :cond_0
.line 24
const-string v3, "\t"
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 25
const-string v3, "at"
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 26
const-string v3, " "
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 27
aget-object v3, v1, v0
invoke-virtual {v3}, Ljava/lang/StackTraceElement;->toString()Ljava/lang/String;
move-result-object v3
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 28
const-string v3, "\n"
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 29
add-int/lit8 v0, v0, 0x1
goto :goto_0
.line 32
:cond_0
invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v3
return-object v3
.end method
.method public static info(Ljava/lang/String;Ljava/lang/String;)I
.locals 3
.param p0, "tag" # Ljava/lang/String;
.param p1, "msg" # Ljava/lang/String;
.prologue
.line 87
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, ": "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
move-result v0
return v0
.end method
.method public static info(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
.locals 3
.param p0, "tag" # Ljava/lang/String;
.param p1, "msg" # Ljava/lang/String;
.param p2, "throwable" # Ljava/lang/Throwable;
.prologue
.line 92
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, ": "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1, p2}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
move-result v0
return v0
.end method
.method public static info()V
.locals 3
.prologue
.line 97
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "Debug\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
.line 98
return-void
.end method
.method public static info(Ljava/lang/Object;)V
.locals 3
.param p0, "msg" # Ljava/lang/Object;
.prologue
.line 102
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
sget-object v2, Lcom/qiang/framework/LogHelper;->gson:Lcom/qiang/gson/Gson;
invoke-virtual {v2, p0}, Lcom/qiang/gson/Gson;->toJson(Ljava/lang/Object;)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
.line 103
return-void
.end method
.method public static info(Ljava/lang/Object;I)V
.locals 3
.param p0, "msg" # Ljava/lang/Object;
.param p1, "count" # I
.prologue
.line 107
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
sget-object v2, Lcom/qiang/framework/LogHelper;->gson:Lcom/qiang/gson/Gson;
invoke-virtual {v2, p0}, Lcom/qiang/gson/Gson;->toJson(Ljava/lang/Object;)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2, p1}, Lcom/qiang/framework/LogHelper;->getStackTrace(II)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
.line 108
return-void
.end method
.method public static warning(Ljava/lang/String;Ljava/lang/String;)I
.locals 3
.param p0, "tag" # Ljava/lang/String;
.param p1, "msg" # Ljava/lang/String;
.prologue
.line 112
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, ": "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I
move-result v0
return v0
.end method
.method public static warning(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
.locals 3
.param p0, "tag" # Ljava/lang/String;
.param p1, "msg" # Ljava/lang/String;
.param p2, "throwable" # Ljava/lang/Throwable;
.prologue
.line 117
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, ": "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1, p2}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
move-result v0
return v0
.end method
.method public static warning()V
.locals 3
.prologue
.line 122
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "Debug\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I
.line 123
return-void
.end method
.method public static warning(Ljava/lang/Object;)V
.locals 3
.param p0, "msg" # Ljava/lang/Object;
.prologue
.line 127
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
sget-object v2, Lcom/qiang/framework/LogHelper;->gson:Lcom/qiang/gson/Gson;
invoke-virtual {v2, p0}, Lcom/qiang/gson/Gson;->toJson(Ljava/lang/Object;)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2}, Lcom/qiang/framework/LogHelper;->getStackTrace(I)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I
.line 128
return-void
.end method
.method public static warning(Ljava/lang/Object;I)V
.locals 3
.param p0, "msg" # Ljava/lang/Object;
.param p1, "count" # I
.prologue
.line 132
const-string v0, "Debug"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
sget-object v2, Lcom/qiang/framework/LogHelper;->gson:Lcom/qiang/gson/Gson;
invoke-virtual {v2, p0}, Lcom/qiang/gson/Gson;->toJson(Ljava/lang/Object;)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\n"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x3
invoke-static {v2, p1}, Lcom/qiang/framework/LogHelper;->getStackTrace(II)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I
.line 133
return-void
.end method
只要把LogHelper.smali和反编译出来的smali文件一起重新编译就能够使用了。
gson多版本兼容问题
最终确定了验证结果所在行,修改为true即可。
破解别人的apk添加自己的功能,可能会 最好用git或svn进行版本管理。
Paste_Image.png