Skip to content

VirtualXposed 0.16.0里面的Xposed日志存在重复记录 #455

Open
@willdeadmonkeyking

Description

@willdeadmonkeyking

反馈BUG之前,先issue里面搜看看有没有别人已经反馈过,重复的不予处理!!

问题描述

在VirtualXposed 0.16.0里面hook 微信6.73版本,使用XposedBridge.log记录日志信息,发现在某些情况下(不太明确)会记录一样的2条记录。挂钩程序中采用了JAVA的文件锁FileLock,,记录当前微信进程号,如果已经存在了则不在重复写日志,但每次打开Xposed日志查看总是看到记录了2条一摸一样的。

逻辑如下
if(isHooked())return;//已经hook了则直接不再处理
else XposedBridge.log("欢迎["+Process.myPid()+"]"+Thread.currentThread().getName()+"."+Thread.currentThread().getId());

最终启动微信后,结果总是能看到如下类似的2条一模一样的日志记录
10.31 08:07:47.890 I/Xposed (4098): 欢迎[4089]main.2
10.31 08:07:47.890 I/Xposed (4098): 欢迎[4089]main.2

重启手机或者点击VirtualXposed设置里面的重启都没用

判断程序isHooked的原型定义如下
private boolean isHooked(){
FileLock fileLock=null;
RandomAccessFile randomAccessFile=null;
try {
randomAccessFile=new RandomAccessFile("/sdcard/wx.txt","rw");

            while(fileLock==null) {//等待获取文件锁
                try {
                    fileLock = randomAccessFile.getChannel().lock();
                }
                catch(Throwable e){
                }
                try{
                    if(fileLock==null)Thread.sleep(20);
                }
                catch(Throwable e){
                }
            }

            try{
                Thread.sleep(40);//获取到FileLock后故意多等一会
            }
            catch(Throwable e){
            }

            if(randomAccessFile.length()==0){//还未记录,说明还未hook
                randomAccessFile.write(Integer.toString(Process.myPid()).getBytes());
            }
            else{
                randomAccessFile.seek(0);
                byte[] data = new byte[100];
                int readNum = randomAccessFile.read(data);
                int recordPid = Integer.parseInt(new String(data, 0, readNum).trim());
                if (Process.myPid() == recordPid) return true;//已经记录了当前进程号,已经hook过了

                //当前进程号和记录的不一致,说明还未hook 
                randomAccessFile.setLength(0);
                randomAccessFile.seek(0);
                randomAccessFile.write(Integer.toString(Process.myPid()).getBytes());
            }
            return false;

        } catch (Throwable e) {
            return false;
        }
        finally {//释放文件锁等相关资源
            try {
                if (fileLock != null) fileLock.release();
            }
            catch(Throwable e){
            }

            try {
                if (randomAccessFile != null) randomAccessFile.close();
            }
            catch(Throwable e){
            }
        }
}

复现步骤

只要出现了重复,无论如何重启手机或者VirtualXposed都没用,打开查看日志总是出现重复。
最终我是去掉了VirtualXposed设置里面 高级设置->启用桌面功能 ,然后重启手机,然后手工把
VirtualXposed再强杀掉之后,50%左右的机会才正常。

环境

机型:MIX2S
系统版本:Android 8.0.0
ROM版本:MIUI 10.0.3.0
Xposed 插件以及插件版本:0.16.0自带,微信6.73版本
VirtualXposed版本:0.16.0

补充

实际中感觉不只是日志记录重复,反而觉得好像就是微信相同的进程号被启动了2个(瞎彩的,因为
在微信里面注册了接收广播的action,发送广播的时候Toast.makeText了信息,明显看到了2次)

最后顺便问一下:兄弟精力十足啊,这个好像还不是太稳定的情况又去折腾太极,那个太极我试着渡劫
微信6.73 支付宝10.1.38 都不行啊

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions