从0开始学微信逆向开发(android版)——第一栏
首先给大家普及一下啥叫微信逆向开发,以及微信逆向开发能做什么:
场景1:小明是做微商的,他每天需要加很多很多的好友。然后他会通过微信的各种渠道去添加好友,比如(附近的人、摇一摇、漂流瓶、手机号搜索等),这样小明每天会花费很多的时间在重复并且枯燥无趣的加人的操作上,如果设计一款程序,帮助小明很容易的去加人呢?
场景2:小花是做在线教育的,她建了很多群,每天在群里给学院们讲课。她讲课的时候需要先在一个群里面发送自己的语音,然后长按语音挨个的转发到其他的学员群里面。如果设计一款程序。能自动的把语音批量发给小花提前设置好的所有群呢?
场景3:小强在一个500强的企业做微信大客户营销,他每天需要操控几百上千个微信号,与客户互动,沟通,推销自己公司的产品。如果设计一款程序,自动把很多手机同步化操作,写好脚本一键操控几百上千个微信号呢?
好了,上面介绍了几个场景,大家大概也对微信逆向开发能做什么略知一二了。微信目前在国内是占有率最高的社交软件,其延伸的功能也是数不胜数,我这里只教大家方法,至于还有哪些有趣的功能,大家可以发挥自己的想象。
首先给大家介绍一下逆向需要用到哪些技术:
1、基于android的模拟点击,滑动等。
2、基于xposed框架的hook操作。
3、反编译工具的使用如:jadx-gui 、apk-tool等
4、Android Device Monitor的使用
由于是第一章,我们先从一个简单的demo来讲起,今天给大家讲解如何自动添加附近的人。
首先我们要用到的功能包含上面的 1和4,后面几章会陆续和大家讲到如何反编译 如何使用xposed模块。今天主要教大家如何使用Android Device Monitor和基于android辅助类的 模拟点击功能。
首先打开微信:
然后在android studio中进入Android Device Monitor
然后再里面找到com.tencent.mm包,点击上方的Dump View
然后可以看见打开的界面是这样的。在中间的屏显区域点击你想要查看的元素(这个感觉和浏览器调试比较类似。)
今天我们要做附近的人的功能,则在微信主界面首先查看“发现”
然后我们可以看见发现拥有text和resource-id 这两个值我们在后面会用到。其他的元素以此类推。
好了,后面来教大家如何使用android的辅助类来实现模拟点击。
基础使用
1. 创建服务类
编写自己的服务类,需要继承AccessibilityService类.其中要实现onAccessibilityEvent(AccessibilityEvent event)及onInterruput()两个重要的方法:
public class AutoService extends AccessibilityService implements View.OnClickListener
{
@Overridepublic void onAccessibilityEvent(final AccessibilityEvent event) {
//handle
}
@Overridepublic void onInterrupt() {
}
@Overrideprotected void onServiceConnected() {
}
}
2. 声明服务
像其他Service服务一样,需要在AndroidManifest.xml中声明.除此之外,该服务还必须配置以下两项:
· 配置<intent-filter>,其name为固定的android.accessibilityservice.AccessibilityService
· 声明BIND_ACCESSIBILITY_SERVICE权限,以便系统能够绑定该服务(4.1版本后要求)
注意:任何一点配置错误,系统都检测不到该服务,因此其固定配置如下:
<service android:enabled="true" android:exported="true" android:label="@string/app_name" android:name=".AutoService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
<meta-data android:name="android.accessibilityservice" android:resource="@xml/envelope_service_config"/>
</service>
3. 配置服务类
在AndroidManifest.xml声明了该服务之后,接下来就是需要对该服务进行一些参数设置了.该服务能够被配置用来接受指定类型的事件,监听指定package,检索窗口内容,获取事件类型的时间等等.目前有两种配置方法:
1. 4.0之后提供了可以通过<meta-data>标签进行配置
2. 通过setServiceInfo()进行配置
1. 通过<meta-data>进行配置
在manifest生命的servce中提供一个meta-data标签,然后通过android:resource指定相应的配置文件(在res目录下创建xml文件,并在其中创建配置文件
envelope_service_config.xml):
<?xml version="1.0" encoding="utf-8"?><accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged|typeWindowContentChanged" android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFlags="" android:canRetrieveWindowContent="true" android:description="@string/app_name" android:notificationTimeout="100" android:packageNames="com.tencent.mm,com.huawei.android.launcher" />
4. 启动服务
当我们做完以上操作,便可将app安装到手机.安装成功后,在设置->辅助功能中便可以找到我们的服务.该服务默认处在关闭状态,需要手动开启.
5. 获取事件信息
上面我们说道,onAccessibilityEvent(AccessibilityEvent event)是该服务的核心方法,其中参数event封装来自界面相关事件的信息,比如我们可以获得该事件的事件类型,进而根据起类型选择不同的处理方式:
6. 获取窗口内容
仅仅知道事件的信息是不够的,我们还希望通过事件来获取发出该事件(事件源)的信息,比如Button按钮被点击时它的text.一个服务可以配置为可以检索窗口内容,即获取窗口内容.整个窗口内容本质上是关于AccessibilityWindowInfo和AccessibilityNodeInfo的树结构,我称之为内容树.(类似View Tree,但由不完全相同)
需要注意,该服务可能配置了只检测了部分事件,而不是全部事件,这就意味着,当内容树发生变化后,该服务可能并不知道,即该服务无法及时的了解当前的内容树是否发生了变化.比如说,你的服务只检测了点击事件,但是此时界面的输入焦点已经变化,这样整个结点树也发生了变化,但是你的服务却不知道,此时你在结点中拿到的窗口内容可能已经不是最新的了.因此,如果你想及时的获知当前窗口的内容,那么就在配置的时候,设置监听全部事件.
正如上面所提到的,要想获取窗口内容,,在配置AccessibilityService时需设置canRetrieveWindowContent为true.之后,便可以通过AccessibilityEvent.getSource(),findFocus(int),getWindow()或者getRootInActiveWindow()获取窗口内容.
7. 服务的生命周期
要理解该中服务的生命周期只需要记住以下三点即可:
· 该种服务完全由系统管理,并遵循已有的服务周期.
· 开启一个服务只能由用户在设置中打开,而关闭则只能由用户在设置中关闭或者服务本身通过diableSelf()方法关闭(当然,现在有些第三放软件也可以强制关闭该类型服务)
· 系统绑定该服务之后,会调用onServiceConnected()方法,这个方法可以被重写,在其中,你可以做一些初始化的操作.
下面贴上核心代码
public void onAccessibilityEvent(final AccessibilityEvent event) {
int eventType = event.getEventType();
switch (status)
{
case "dzh_zt1"://点击发现 countI = 0;
openDelay(1000, "发现", "dzh_zt2");
break;
case "dzh_zt2"://d点击附近的人 openDelay(1000, "附近的人","dzh_xb1"); break;
case "dzh_xb1"://如果sex有值则进行筛选 if (event.getClassName().equals("com.tencent.mm.plugin.nearby.ui.NearbyFriendsUI") && eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
if (sex != null) {
AccessibilityNodeInfo sexInfo = getRootInActiveWindow();
recursionFun(sexInfo, "android.widget.TextView", "更多");
status="dzh_xb2";
}
}
case "dzh_xb2"://根据sex点击筛选条件 if (event.getClassName().equals("com.tencent.mm.plugin.nearby.ui.NearbyFriendsUI") && eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
if (sex != null) {
AccessibilityNodeInfo sexInfo = getRootInActiveWindow();
List<AccessibilityNodeInfo> list = sexInfo.findAccessibilityNodeInfosByText(sex);
list.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
list.get(0).getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
status="dzh_zt3";
}
}
break;
case "dzh_zt3"://附近的人界面 开始选人打招呼 nearPersonList(event,eventType);
break;
case "dzh_zt4"://打招呼界面 nearPersonSeayHello(event,eventType);
break;
case "dzh_zt5"://打招呼详情界面 sayHelloDetails(event,eventType);
break;
}
}
从0开始学微信逆向开发(android版)——第一栏的更多相关文章
- 从零開始开发Android版2048 (一)初始化界面
自学Android一个月多了,一直在工作之余零零散散地看一些东西.感觉经常使用的东西都有些了解了,可是一開始写代码总会出各种奇葩的问题.感觉还是代码写得太少.这样继续杂乱地学习下去进度也太慢了,并且学 ...
- 从零開始开发Android版2048 (三)逻辑推断
近期工作比較忙,所以更新的慢了一点,今天的主要内容是关于Android版2048的逻辑推断,经过本篇的解说,基本上完毕了这个游戏的主体部分. 首先还是看一下,我在实现2048时用到的一些存储的数据结构 ...
- 从零開始开发Android版2048 (二)获取手势信息
今天是尝试開始Android版2048小游戏的第二天.在今天,我主要学习了怎样获取用户在屏幕滑动的手势,以及对布局进行了一些小小的完好. 获取用户操作的手势(比方向左滑.向右滑等)主要用到了Gestu ...
- 从0系统学 Android--1.1认识 Android
一转眼工作也有几年的时间了,一直想沉下心来,再回过头来重新系统的学习一遍 Android.所以就有了这个读书笔记.俗话说温故而知新,下面就请大家再跟着我系统的学习一篇 Android 吧! 这一系列主 ...
- maui BlazorWebView+本地html (vue、uniapp等都可以) 接入微信sdk 开发 Android app
首先添加微信sdk的绑定库 nuget 包:Chi.MauiBinding.Android.WeChat 项目地址:https://github.com/realZhangChi/MauiBindin ...
- 从零開始开发Android版2048 (四) 分数、重置、结束
这一篇的内容主要是在上一篇的基础上,增加分数计算(包含当前分数和最高分数).游戏结束的推断以及游戏界面的重置这三个部分的功能. 一.分数的计算和保存 首先,2048这个游戏的分数包含 ...
- 百度地图开发 Android版应用Key申请
一 申请API key 在使用百度地图之前,我们必须去申请一个百度地图的API key,申请地址http://lbsyun.baidu.com/apiconsole/key,自己自行注册一个百度账号, ...
- 从零開始开发Android版2048 (五) 撤销的实现
本篇的内容是,在前一篇的基础上添�了撤销的功能.撤销事实上就是将当前的用户界面恢复到这次滑动值前的样子.我实现撤销的主要原理是,将每次滑动后界面上的格子和相应的数字记录下来,当然还有分数,把这些数据写 ...
- c#开发Android初学(一)
我也是最近开始学习用c#开发android,最近找在好心网友那里下到了四个android开发安卓的视频(传智的)有想要的朋友可以留下邮箱 废话不多收,分享我最近一个星期的成果. 先看最主要的一个获取数 ...
- Android微信逆向--实现发朋友圈动态
0x0 前言 最近一直在研究Windows逆向的东西,想着快要把Android给遗忘了.所以就想利用工作之余来研究Android相关的技术,来保持对Android热情.调用微信代码来发送朋友圈动态一直 ...
随机推荐
- Record - Dec. 1st, 2020 - Exam. REC
Prob. 1 Desc. & Link. 行走的形式是比较自由的,因为只要走到了最优答案处就可以不管了,所以不需要考虑游戏的结束. 考虑二分答案. 然后预处理出每个节点到 \(s\)(另一棵 ...
- python爬虫——爬取天气预报信息
在本文中,我们将学习如何使用代理IP爬取天气预报信息.我们将使用 Python 编写程序,并使用 requests 和 BeautifulSoup 库来获取和解析 HTML.此外,我们还将使用代理服务 ...
- nfls10.1
T1 大水题,用位运算更加便捷求解. T2 看出来有环了,但是没往基环树上想,寄. 暴力分,有部分分是基础树,可以跑一遍深搜,根节点的选择是 k 种颜色,剩下的是 k - 1 种颜色.还有暴力是可以二 ...
- [WUSTCTF 2020]朴实无华
打开网页,就显示一个Hack me ,查看源码也是啥也没有,就用御剑扫一下 发现存在robots.txt文件 根据提示,打开/fAke_f1agggg.php 还真就一个错误的flag 仔细看了看,居 ...
- 漫谈C#的定时执行程序
1.写法1 task的lambda表达式 #region 写法1 task的lambda表达式 //static void Main() //{ // // 创建并启动两个任务 // Task tas ...
- 【不限框架】超好用的3d开源图片预览插件推荐
今天给大家推荐一款超好用的图片预览插件-image-preview 简单说明 image-preview是一款主要面向移动端web应用,同时兼容pc,基于原生js,不限框架,react,vue,ang ...
- Nginx-自动漂移VIP
自动漂移VIP-1 #!/bin/bash #2020-03-16 14:24 #auto change nginx vip.sh #By Precious ##################### ...
- Spring5学习随笔-Spring5的第一个程序(环境搭建、日志框架整合)
第二章.第一个Spring程序 1.软件版本 1.JDK1.8+ 2.Maven3.5+ 3.IDEA2018+ 4.SpringFramework 5.1.4 官网:www.spring.io 2. ...
- 老是听到做PPT要会“内容可视化”,到底啥是内容可视化?
在PPT中,内容可视化是指将文字.数据和概念等抽象信息转化为图像.图表.图表及其他可视化元素来呈现.通过合适的颜色.形状.大小和布局等视觉设计元素来强调信息的关键点和关系, 从而提高观众对信息的理解和 ...
- Echarts 柱形图最全详解
Echarts 是一款基于 JavaScript 的开源可视化图表库,被广泛应用于数据可视化领域.它提供了丰富的图表类型和交互功能,其中柱形图是最常用和重要的一种图表类型之一.下面是对 Echarts ...