爱加密 linux,解决爱加密加固之后使用xposed hook的时候log打印不出来的问题

当在爱加密加固的安卓应用上使用xposed框架进行日志打印时,发现只有Log.e能输出日志。深入研究发现,爱加密可能劫持了非错误级别的日志函数。本文详细分析了Log的源码流程,从java层到native层,揭示了日志打印的原理。最后,通过自定义log接口和动态加载本地库,实现了在加固环境中正常打印日志的功能。
摘要由CSDN通过智能技术生成

最近在爱加密加固之后,用xposed去打印日志,开始用log.i一直打不出来,以为是插件有问题,后来才发现爱加密加固之后只有Log.e才能够打出日志。虽然Log.e打日志也可以,但是作为重度强迫症患者,一堆错误的日志看得很头疼

猜测

我试着用dlsym去调用Log在native层对应的方法android_util_Log_println_native,以及在其中调用的__android_log_buf_write方法直接去写日志,发现并不能够吧日志写出了,所以爱加密应该劫持了这些函数,并且在不是错误日志的时候都不把日志打出来

Log的原理

你可以跟踪log的源码,然后分析其原理,其实打印日志就是对/dev/log/下面的设备文件进行操作,在Log的d,i,v,w,e这些方法中都是写到/dev/log/main这个文件里面的。我们先简单分析一下源码

首先是java层的代码代码位置在frameworks\base\core\java\android\util\Log.java。我们可以发现,打印日志最终都是调用的这个native方法...

public static int i(String tag, String msg) {

return println_native(LOG_ID_MAIN, INFO, tag, msg);

}

...

/** @hide */ public static native int println_native(int bufID,

int priority, String tag, String msg);

我们看这个native方法实现的地方,在安卓源码的frameworks\base\core\jni\android_util_Log.cpp这个位置,在这个里面,发现就只是调用了__android_log_buf_write这个方法来打印日志,前面做了一些判断/*

* In class android.util.Log:

*  public static native int println_native(int buffer, int priority, String tag, String msg)

*/

static jint android_util_Log_println_native(JNIEnv* env, jobject clazz,

jint bufID, jint priority, jstring tagObj, jstring msgObj)

{

const char* tag = NULL;

const char* msg = NULL;

if (msgObj == NULL) {

jniThrowNullPointerException(env, "println needs a message");

return -1;

}

if (bufID = LOG_ID_MAX) {

jniThrowNullPointerException(env, "bad bufID");

return -1;

}

if (tagObj != NULL)

tag = env->GetStringUTFChars(tagObj, NULL);

msg = env->GetStringUTFChars(msgObj, NULL);

int res = __android_log_buf_write(bufID, (android_LogPriority)priority, tag, msg);

if (tag != NULL)

env->ReleaseStringUTFChars(tagObj, tag);

env->ReleaseStringUTFChars(msgObj, msg);

return res;

}

接下来我们继续跟踪到__android_log_buf_write方法定义的位置,在安卓源码的system\core\liblog\logd_write.c中,这里在前面讲log的等级以及tag和log的消息装在一个结构体数组里面,然后调用了write_to_log打印日志int __android_log_buf_write(int bufID, int prio, const char *tag, const char *msg)

{

struct iovec vec[3];

char tmp_tag[32];

if (!tag)

tag = "";

/* XXX: This needs to go! */

if ((bufID != LOG_ID_RADIO) &&

(!strcmp(tag, "HTC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值