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

转: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又可以显示出来了,效果如下


上传的附件:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值