-
-
解决爱加密加固之后使用xposed hook的时候log打印不出来的问题
-
发表于:
2017-4-11 15:06
12913
-
解决爱加密加固之后使用xposed hook的时候log打印不出来的问题
最近在爱加密加固之后,用xposed去打印日志,开始用log.i一直打不出来,以为是插件有问题,后来才发现爱加密加固之后只有Log.e才能够打出日志。虽然Log.e打日志也可以,但是作为重度强迫症患者,一堆错误的日志看得很头疼
声明一下,我水平有限,不要骂我,谢谢
源码在https://github.com/smartdone/printlog
我试着用dlsym去调用Log在native层对应的方法android_util_Log_println_native
,以及在其中调用的__android_log_buf_write
方法直接去写日志,发现并不能够吧日志写出了,所以爱加密应该劫持了这些函数,并且在不是错误日志的时候都不把日志打出来
你可以跟踪log的源码,然后分析其原理,其实打印日志就是对/dev/log/下面的设备文件进行操作,在Log的d,i,v,w,e这些方法中都是写到/dev/log/main
这个文件里面的。我们先简单分析一下源码
首先是java层的代码代码位置在frameworks\base\core\java\android\util\Log.java
。我们可以发现,打印日志最终都是调用的这个native方法
我们看这个native方法实现的地方,在安卓源码的frameworks\base\core\jni\android_util_Log.cpp
这个位置,在这个里面,发现就只是调用了__android_log_buf_write
这个方法来打印日志,前面做了一些判断
接下来我们继续跟踪到__android_log_buf_write
方法定义的位置,在安卓源码的system\core\liblog\logd_write.c
中,这里在前面讲log的等级以及tag和log的消息装在一个结构体数组里面,然后调用了write_to_log打印日志
我们再看write_to_log
这个方法,这是前面定义的一个函数指针,他的初始值是指向__write_to_log_init
这个方法。这里面重点来了,他做了一下初始化,就是把日志这些设备文件打开,然后重新把write_to_log
指针指向__write_to_log_kernel
这个方法,也就是保证初始化完成之后,再使用这个函数指针调用函数的时候就不去做设备文件打开的操作了。
__write_to_log_kernel
方法如下,在这里就是去调用了log_writev
方法去写日志
好了,终于要分析完了,log_writev
是个宏定义,其实就是writev
方法,这个方法实现在system\core\liblog\uio.c
中,这里就是最终写日志的地方了,其实就是用write方法,向日志设备文件里面写日志,然后就完成了。
既然爱加密将打印日志的函数给hook了,那么我们就只能够自己去实现一个打印日志的方法了,实现的方式比较简单,就是打开设备文件,将日志写进去,返回写入的长度就行了,native层的代码如下
写好动态库之后,在xposed插件中动态的加载起来,然后再使用自己实现的log接口去写。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课