转: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次下载)