爱加密加固之后恢复原始的log

来源:互联网 发布:卡帝乐鳄鱼 知乎 编辑:程序博客网 时间:2024/05/13 15:31

转:http://bbs.pediy.com/thread-217079.htm

这篇文章是接上一篇的一个改进,http://bbs.pediy.com/thread-216965.htm

上一篇是介绍log的原理,以及自己实现一个log,并且由xposed加载起来,使我们自己的log能够显示出来,现在我们要更进一步,将加固应用原始的log也给显示出来。

准备一个apk

我们自己写一个apk,然后用各种方式输出log,demo apk很简单,只要输出几句log就行了

Log.e("LOGTESTS", "this is a log protected by ijiami");Log.i("LOGTESTS", "this is a log protected by ijiami");Log.v("LOGTESTS", "this is a log protected by ijiami");Log.w("LOGTESTS", "this is a log protected by ijiami");Log.d("LOGTESTS", "this is a log protected by ijiami");

然后我们就可以去修改xposed插件了,改起来也很简单,就是将android.util.Log里面的几个方法替换成我们的方法。然后他原始的日志就会通过我们定义的方法打印出来,代码很简单然后我们上传到爱加密进行加固,加固之后下载下来进行签名。demo apk可以从附件中下载

MethodReplaceImpl.java

package com.smartdone.printlog;import de.robv.android.xposed.XC_MethodHook;import de.robv.android.xposed.XC_MethodReplacement;/** * Created by smartdone on 2017/4/17. */public class MethodReplaceImpl extends XC_MethodReplacement {    @Override    protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {        String methodname = methodHookParam.method.getName();        if (methodname.equals("v")) {            return Log.v((String) methodHookParam.args[0], (String) methodHookParam.args[1]);        } else if (methodname.equals("i")) {            return Log.i((String) methodHookParam.args[0], (String) methodHookParam.args[1]);        } else if (methodname.equals("d")) {            return Log.d((String) methodHookParam.args[0], (String) methodHookParam.args[1]);        } else if (methodname.equals("w")) {            return Log.w((String) methodHookParam.args[0], (String) methodHookParam.args[1]);        } else if (methodname.equals("e")) {            return Log.e((String) methodHookParam.args[0], (String) methodHookParam.args[1]);        }        return null;    }}

Main.java

package com.smartdone.printlog;import android.app.Application;import android.content.Context;import android.util.*;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.lang.reflect.Method;import de.robv.android.xposed.IXposedHookLoadPackage;import de.robv.android.xposed.XC_MethodHook;import de.robv.android.xposed.XposedBridge;import de.robv.android.xposed.XposedHelpers;import de.robv.android.xposed.callbacks.XC_LoadPackage;/** * Created by smartdone on 2017/4/5. */public class Main implements IXposedHookLoadPackage {    @Override    public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {        if (loadPackageParam.packageName.equals("com.smartdone.logtests")) {            XposedHelpers.findAndHookMethod("com.shell.SuperApplication", loadPackageParam.classLoader, "attachBaseContext", Context.class, new XC_MethodHook() {                @Override                protected void afterHookedMethod(MethodHookParam param) throws Throwable {                    Context context = (Context) param.args[0];                    Context plicontext = context.createPackageContext("com.smartdone.printlog", Context.CONTEXT_IGNORE_SECURITY);                    InputStream in = plicontext.getAssets().open("libslog.so");                    File so = new File(context.getFilesDir(), "libslog.so");                    if (!so.getParentFile().exists()) {                        so.getParentFile().mkdirs();                    }                    FileOutputStream fout = new FileOutputStream(so);                    byte[] buffer = new byte[1024];                    int len = in.read(buffer);                    while (len > 0) {                        fout.write(buffer);                        len = in.read(buffer);                    }                    fout.flush();                    fout.close();                    in.close();                    android.util.Log.e("LOGTEST", "write so to /data/data/... success");                    System.load(so.getAbsolutePath());                    Class<?> log = XposedHelpers.findClass("android.util.Log", context.getClassLoader());                    MethodReplaceImpl methodReplace = new MethodReplaceImpl();                    XposedHelpers.findAndHookMethod(log, "i", String.class, String.class, methodReplace);                    XposedHelpers.findAndHookMethod(log, "v", String.class, String.class, methodReplace);                    XposedHelpers.findAndHookMethod(log, "e", String.class, String.class, methodReplace);                    XposedHelpers.findAndHookMethod(log, "w", String.class, String.class, methodReplace);                    XposedHelpers.findAndHookMethod(log, "d", String.class, String.class, methodReplace);                }            });        }    }}

当然,源代码还是在上次的那个github地址 https://github.com/smartdone/printlog

使用这个之后,应用自身打印的log又可以显示出来了,效果如下


上传的附件:

  •  app-debug_unsign_sign.apk (2.11MB,1次下载)

0 0