3.胡乱分析第三波
在我以为一切大功告成,膨胀得沾沾自喜的时候,测试小哥发现了意外的发现了一个Bug, 发语音,图片,视频,虽然没撤回,但是打开失败,估计就是文件被删除了。
而Android里删除文件调用的是File类的delete方法,跟一波方法,直接搜File.delete看下是否真的有调用:
好吧,直接Hook掉File类的delete方法,看看微信删除对应类型文件的路径,观察一波这些路径的规律,然后如果delete方法被调用了,过滤一波,不删除文件,直接返回结果true,欺骗微信文件删除成功,以此瞒天过海~ 代码如下:
依次发送语音,图片,视频,然后撤回,对应的删除记录:
观察下路径规则,不难发现对应的文件夹是 voice2,image2,video,so过滤一波路
径,如果路径包含这三个 直接过滤设置返回值为True,另外公众号,外链,都是属于文本信息,只是微信做了特别的解析,比如上面那个 百度贴吧的,所以和普通信息一样处理就好。
然后发现只有语音能够正常打开,图片和视频都无法正常打开,跟了下路径,
用ES浏览器来到这个路径下:
这就很奇怪了,明明图片存在,但是就是不能正确加载,而且每次点开都会执行一次删除的操作, 就是说数据库里还保存着这个记录,撤销信息无非 删数据库记录+删文件,删文件肯定是没问题的, 那么问题肯定就出在删数据库记录那里了。跟踪一下SQLiteDatabase里的delete()方法,把参数和返回值打印下:
依次做:发送语音,发送图片,发送视频然后撤回的日志跟踪。
结合delete方法一起看:
结合上面的日志和delete方法的代码,可以得这样的结论:
- 1.音频相关放在voiceinfo表里,图片相关放在ImgInfo2表里,而视频相关则放在videoinfo2表里。
- 2.还有个WxFileIndex2表,从删除语句可以知道就是根据msgId去删除对应的文件记录,但是返回值却有1,6,2,0?
跟下返回值的代码:executeUpdateDelete()方法,在SQLiteStatement类中
改变的行的数目?一般来说删除一条数据,正确执行完,受影响的行数会是1。 而只有语音能正常播放,难道是这个原因?hook下这个方法,如果第一个参数是这四个表, 直接把返回值设置成1试试~
发下信息然后撤回下试试~
行吧,视频和图片都能打开了,到此总算完美解决的,真的是一波三折。 接着改下UI页面,补上上次下厨房Hook Xposed检测的开光和防撤回开关。 最后的界面如下: