本文继续上篇文章
本文不再粘贴java转smali语法详细过程,只是讲诉下思路
Xposed版本 不是所有手机环境都支持,所以我才想试试直接反编译代码写入微信apk中,这样用户就不需要配置什么复杂的环境.
第一个目标
效果如图
怎么做呢?很简单嘛拿TraceView 简体这个按钮触发点击事件在哪即可.
可以看到点击处理在HomeUI$25这个类中
那么我们先写一个弹窗函数m_show函数 嵌入HomeUI$25这个类
public boolean m_show(View view) { try { //LauncherUI.m_instance_LauncherUI是一个上下文对象 AlertDialog.Builder builder = new AlertDialog.Builder(LauncherUI.m_instance_LauncherUI); builder.setTitle("桂电的互联扫地僧"); String options[] = new String[]{"抢红包", "塞子控制", "猜拳控制", "防撤销", "闪图保存"}; builder.setItems(options, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.setNegativeButton("关闭", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.show(); } catch (Exception e) { Log.e("FMY=================", "m_show: "); e.printStackTrace(); } return true; }
特别提醒的就是上面这个java转smali会生成匿名类文件,请一并拷贝到反编译的微信中
上面这个方法是嵌入在我们要反编译之后的微信之中的,我们直接嵌入HomeUI$25这个类即可,当用户点击微信界面的十字先执行它原本的的onclick函数,我们在onclick函数中调用m_show()即可.(当然这里嵌入的是smali代码,上一篇文章讲诉过怎么做了)
再来解决一个问题如何得到上下文对象实例?因为我们弹窗代码需要用到这个作为参数.
解决办法,也很简单,View有一个函数getContent来获取 .然后你会发现用这个方法不一定成功哦,这里不做原因解释
我们直接干脆拿微信界面的Activity界面的对象实例.(Activity也是一个上下文对象的子类)
首先打开微信界面,然后再命令行输入 adb shell dumpsys acitivity top
我们这里采用的思想如下.
在LanucherUi这个类中创建public的静态实例指向自己,
伪代码如下(请自行修改微信源smali代码)
此时弹窗代码基本思路介绍完了.我们把弹窗完善下,当用户点击弹窗的控制撒子按钮时我们在弹窗一个选择1到6的选择界面,目的是让用户选择塞子点数.
这里直接贴代码吧
class HomeUI$25 { public void onClick(View view){ /** * ************************ * ********************** * 这里注释表示原本程序的逻辑代码 * ********************* * ********************** */ m_show(view);//弹窗 /** * ************************ * ********************** * 这里注释表示原本程序的逻辑代码 * ********************* * ********************** */ } public boolean m_show(View view) { try { AlertDialog.Builder builder = new AlertDialog.Builder(LauncherUI.m_instance_LauncherUI); builder.setTitle("桂电的互联扫地僧"); String options[] = new String[]{"抢红包", "塞子控制", "猜拳控制", "防撤销", "闪图保存"}; builder.setItems(options, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); switch (which) { case 1: dialog.dismiss(); ctl_dice(); break; } } }); builder.setNegativeButton("关闭", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.show(); } catch (Exception e) { Log.e("FMY=================", "m_show: "); e.printStackTrace(); } return true; } public void ctl_dice() { try { AlertDialog.Builder builder = new AlertDialog.Builder(LauncherUI.m_instance_LauncherUI); builder.setTitle("选择点数"); String options[] = new String[]{"1", "2", "3", "4", "5", "6"}; builder.setItems(options, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //给bi类的dice变量设置摇骰子点数.这个类是上一篇文章中分析过的 用户随机生成一个0-5的数字 // 控制骰子.我们这里在手动的添加了一个静态int变量名为dice.后文在继续详细讲解 bi.dice = which; Toast.makeText(LauncherUI.m_instance_LauncherUI, "修改点数成功", Toast.LENGTH_SHORT).show(); } }); builder.show(); } catch (Exception e) { Log.e("FMY=================", "m_show: "); e.printStackTrace(); } } }
还有一处思想要改就是如何完美控制?
上面一行代码如下
bi.dice = which;
上一篇文章解释过bi类中有个eF函数,我们在eF函数返回塞子点数.
我们这里可以在这个类中创建一个变量叫dice,当调用eF的时候直接返回dice作为结果(当然你还要在eF中判断是否为当前函数调用是为了生成塞子点数,这个函数有可能为其他目的而被调用)
以上就是整体的思路.反编译会apk即可,实现非xposed实现点数控制
现在网上有一些卖什么vip版本微信 原理也是如此.当然也可以添加微信帐号密码监听功能,所以请小心.
不打算放出