前言

之前讲到得 VirtualAppRoot 可能大家还没实际体会到它的好处,这篇文章教大家如何拿到女神微信「朋友圈」的封面(邪恶脸)

实战过程

微信好友的头像是能够直接保存到相册的,但是朋友圈的封面,却没有提供保存的入口,下面我们来一步步找到朋友圈封面的地址。

说明一下:这里是针对「微信 v6.6.7」 的源码分析,不同版本的代码因为混淆之后的缘故,不一定适用。如果想下载微信的历史版本安装包,可以下载 「PP 助手」,就能找到微信的历史版本。

1、TopActivity 分析

定位到朋友圈当前的 Activitycom.tencent.mm.plugin.sns.ui.SnsUserUI

2、Jadx 反编译源码

用 Jadx 将反编译的源码,另存为 Gradle 项目,这样可以直接在 Android Studio 看源码了,不过这样导出来的,是不能够运行的。我个人习惯在 Android Studio 查看源码,因为可以方便地使用查找、跳转和类结构等功能。

  • 看看 SnsUserUI 源码,发现并没有设置封面相关的地方,不过里面有个类似乎把很多操作隐藏起来,并且传入几个关键字段信息进去,值得怀疑:
  • 点进去看 bb 类,在它的 onCreate() 方法里面,找到了封面的封装类 SnsHeader
  • 继续看 SnsHeader 的源码,找到封面设置的 ImageView ,应该就是图片红框的控件,为啥这么确定?因为点击封面会弹出更换封面的弹窗,里面的 log 提示的也很明显
  • 跟踪变量 this.nWh.nWt 是在哪里设置值,找到以下代码,可以看到给封面设置 bitmap 值以及默认封面的资源名称,其中 bitmap 对应的变量名称是 a
  • 找到这个 a 赋值的地方,这方法有个可疑参数:accSnsPath ,跟一下
  • 可以看到 accSnsPath 有两处赋值的地方,猜测封面图片的处理应该是用了「三级缓存」机制的,先读内存,内存没有,就读本地,本地没有,再网络请求获取。所以对应的第一个赋值的地方是:本地存储路径;第二个赋值的地方是:网络的 url

3、Hook

根据上面的分析过程,对以下 3 个类,进行 hook ,这里有个 「小技巧」,是「尼古拉斯·赵四」分享的,如果在进行代码分析过程没有头绪的时候,可以对 Log 类进行 hook,在打印出来的日志,找寻蛛丝马迹。

再次强调,hook 针对微信 v6.6.7 源码,采用 YAHFA hook

public class HookWxG {public static String className = "com.tencent.mm.plugin.sns.model.g";public static String methodName = "a";public static String methodSig = "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLcom/tencent/mm/storage/av;)Landroid/graphics/Bitmap;";public static Bitmap hook(String str, String str2, String str3, boolean z, Object avVar) {//图片 url Log.w("@@@", "url:" + str2);return backup();}public static Bitmap backup() {return null;}
}
复制代码
public class HookWxAf {public static String className = "com.tencent.mm.plugin.sns.model.af";public static String methodName = "getAccSnsPath";public static String methodSig = "()Ljava/lang/String;";public static String hook() {String result = backup();//图片存储路径(不含id)Log.w("@@@", "path:"+result);return result;}public static String backup() {return"";}
}
复制代码
public class HookWxLog {public static String className = "com.tencent.mm.sdk.platformtools.x";public static String methodName = "d";public static String methodSig = "(Ljava/lang/String;Ljava/lang/String;)V";public static void hook(String tag,String msg) {if ("MicroMsg.SnsHeader".equals(tag)) {Log.w("@@@", tag + ":" + msg);}}public static void backup(String tag,String msg) {return;}
}
复制代码
  • 看一下打印出来的结果:
  • 将这个 url 的值复制到浏览器看看:
  • 验证一下本地路径对不对,找到对应的文件夹看看 ,其实里面还有很多子文件夹,这里面我们 log 有打印出 bgId ,找到前缀是 snsb_ + bgId 的文件/storage/emulated/0/tencent/MicroMsg/c3d467aeabb4fae4b1bbf3a7a6839f5d/sns/b/c/snsb_12944115522489626761),以图片方式-打开即可。
path: /storage/emulated/0/tencent/MicroMsg/c3d467aeabb4fae4b1bbf3a7a6839f5d/sns/
复制代码
MicroMsg.SnsHeader:showName x452460984 get bgId : 12944115522489626761  olderBgId: null
复制代码
  • 给界面加个按钮,复制url然后跳转到系统浏览器查看,代码如下:
public class HookWxSnsUserUI {public static String className = "com.tencent.mm.plugin.sns.ui.SnsUserUI";public static String methodName = "onCreate";public static String methodSig = "(Landroid/os/Bundle;)V";public static Activity SnsUserUI;public static void hook(Object thiz, Bundle b) {Log.w("@@@", "SnsUserUI oncreate");SnsUserUI = (Activity) thiz;new Handler().postDelayed(new Runnable() {@Overridepublic void run() {View decorView = SnsUserUI.getWindow().getDecorView();if (decorView != null && decorView instanceof ViewGroup) {LinearLayout llContainer = new LinearLayout(SnsUserUI);FrameLayout.LayoutParams containerLp = new FrameLayout.LayoutParams(-2, -2);containerLp.gravity = Gravity.CENTER_VERTICAL | Gravity.RIGHT;llContainer.setOrientation(LinearLayout.VERTICAL);llContainer.setLayoutParams(containerLp);llContainer.setGravity(Gravity.CENTER);llContainer.setBackgroundColor(Color.parseColor("#ececec"));Button btnCopy = new Button(SnsUserUI);int wrapContent = LinearLayout.LayoutParams.WRAP_CONTENT;LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(wrapContent, wrapContent);params.topMargin = SizeUtils.dp2px(8);btnCopy.setLayoutParams(params);btnCopy.setText("到浏览器打开");btnCopy.setTextSize(12);btnCopy.setIncludeFontPadding(false);btnCopy.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (!HookWxG.URL.equals("empty")) {ToastUtils.showShort("复制成功`");// 复制ClipboardManager clip = (ClipboardManager) SnsUserUI.getSystemService(Context.CLIPBOARD_SERVICE);clip.setText(HookWxG.URL);Intent intent = new Intent();intent.setAction("android.intent.action.VIEW");Uri content_url = Uri.parse(HookWxG.URL);intent.setData(content_url);SnsUserUI.startActivity(intent);} else {ToastUtils.showShort("哎呀,地址没有赋值成功~");}}});llContainer.addView(btnCopy);((ViewGroup) decorView).addView(llContainer);}}}, 2000);backup(thiz, b);}public static void backup(Object thiz, Bundle b) {return;}
}
复制代码

VirtualApp实战之拿到女神朋友圈封面相关推荐

  1. 点赞封面未发送已删除_微信表白新功能:有种喜欢,是给你朋友圈封面点赞

    微信最成功的设计,就是朋友圈封面点赞. 你的朋友圈封面被多少人点赞过,按照概率,这个次数的五分之一,应该就是喜欢过你的人. 有读者说:大叔,为什么他又赞了我朋友圈封面? 其实答案很简单. 给你朋友圈封 ...

  2. vue怎么设置封面_微信朋友圈封面视频如何制作?微信朋友圈封面视频制作软件VUE功能介绍...

    貌似最近挺火的,很多人都把朋友圈相册封面变成了小视频,有声音还可以动;那么微信朋友圈封面视频如何制作呢?下面请看微信朋友圈封面视频制作软件VUE功能介绍. 微信朋友圈封面视频制作软件:VUE VUE怎 ...

  3. Android挂逼修练之行--微信设置朋友圈封面视频插件开发详解

    一.背景介绍 最近在刷抖音的时候看见别人发了一个可以把微信朋友圈封面图设置成视频的功能,比较好奇就自己研究了一下,最开始的时候第一灵感就是是不是微信设置封面图的接口有后门,就是微信为了后续功能扩展,服 ...

  4. Android挂逼修练之行---微信中把朋友圈封面设置成酷炫视频功能插件开发详解

    一.背景介绍 最近在刷抖音的时候看见别人发了一个可以把微信朋友圈封面图设置成视频的功能,比较好奇就自己研究了一下,最开始的时候第一灵感就是是不是微信设置封面图的接口有后门,就是微信为了后续功能扩展,服 ...

  5. PHP获取朋友圈封面,用这 3 招做朋友圈封面,绝对独一无二!| 领客专栏 · 微信时刻...

    A 君注:领客专栏又有新的伙伴:WeChatMoments,接下来他们会在 AppSo 分享更多玩转微信的技巧,喜欢的朋友不要错过啦. 今天这篇文章教你 3 招用 app 制作独一无二的朋友圈封面图: ...

  6. vue如何设置视频封面_微信朋友圈封面视频怎么制作的 VUE怎么进行使用

    类型:图形图像大小:32.7M语言:中文 评分:10.0 标签: 立即下载 最近不少小伙伴发现别人的微信朋友圈封面是动态视频,但是不知道怎么进行制作,因此就让小编给大家讲讲如何制作属于自己的动态视频吧 ...

  7. 点赞封面未发送已删除_连朋友圈封面都点赞的人,到底是哪些人

    大多数人的暗恋都有这样的敏感和小心翼翼: 喜欢一个人的时候,会不厌其烦地一遍一遍地刷TA的朋友圈,每一条都细细研究. 只是从不评论从不点赞,默默截图. 但是朋友圈的封面图有点特别,只有特意去看朋友圈的 ...

  8. 韩梦飞沙朋友圈封面在线制作工具

    韩梦飞沙朋友圈封面在线制作工具. 效果预览.套用模板.发布共享.盈利收入.我的封面历史.我的收藏. 效果比对. 封面视频模板,交互封面模板. 效果预览:其他工具只是做图片,效果不能直接知道,其他工具必 ...

  9. 封面|朋友圈封面图来了,超个性的哦!

    编辑|排版| @宅哥技术 壁纸来源[壁纸]APP如侵联删 ---------♥--------- 朋友圈封面 更多朋友圈壁纸可以在翻看历史文章,或者在微信公众号:[宅哥技术]搜索文章

最新文章

  1. 领导者有3个要求,你做到了吗?
  2. 文件目录管理及vi编辑器的使用
  3. Centos6.3下rsync+sersync安装配置笔记
  4. 路由器的×××流量过滤
  5. MySQL数据库的性能优化总结
  6. 《3D数学基础》实践1 向量类代码分析
  7. php asp.net des,转DES的dotNet到php实现
  8. 2017-2018-1 20155227 《信息安全系统设计基础》第十三周学习总结
  9. linux系统监控和进程管理
  10. android 获取文件夹的字节数,android java file 清理垃圾获取文件大小 删除文件等操作...
  11. 免费开源低代码拖拽开发_资料来源:面向开源开发人员的免费代码搜索工具
  12. 做系统的U盘如何格式化
  13. JAVA JDK 、Maven、IDEA安装
  14. RS报内存错误XQE-ROL-0183
  15. 正交相机和透视相机的区别
  16. python外国网站爬虫_用python爬过这些网站,才敢说自己会爬虫!
  17. processing交互应用——双人对战游戏
  18. 取消苹果商店简短验证_苹果:其实我赚钱的是配件!
  19. 三分建设,七分运营|用现代化安全运营应对数据安全风险
  20. mysql navicat怎么打开文件_navicat怎么打开sql

热门文章

  1. StyleCop学习笔记——默认的规则
  2. symbian获取中文的拼音
  3. FTPClient.listFiles()不能获取目录里的文件
  4. PowerShell 解决红字一闪而过问题
  5. Lesson 1- exchange 2010 installing
  6. 如何禁止特定用户使用sqlplus或PL/SQL Developer等工具登陆?
  7. 定义和使用结构体变量
  8. maven的基本用法
  9. EF – 4.CRUD与事务
  10. 设计模式(五)学习----装饰模式