从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热情.调用微信代码来发送朋友圈动态一直 ...
随机推荐
- 6.swagger完善:界面显示注释+多版本控制
周末,写点简单的水一下. 新版本的vs创建项目的时候可以选择自带一个swagger.然而这只是基本的swagger功能. 几个接口无所谓啦,随着接口越来越多,就这么丢给你,一时间也会懵逼,所以这篇文章 ...
- IDEA降低注解检测级别
在 File | Settings | Editor | Inspections 选项中使用搜索功能找到 Autowiring for Bean Class,将 Severity 的级别由之前的 er ...
- ORA-01008:并非所有变量都已绑定-解决办法
近期批量处理数据,后台用JAVA编写,连接Oracle数据库,程序运行报ORA-01008问题.解决这个问题时遇见的坑较多,下面复盘现象.问题提出解决办法,希望能帮到遇见同类问题的你. 调试问题: 后 ...
- 其它——ASCII码,Unicode和UTF-8编码
文章目录 一 ASCII码 二 非ASCII编码 三 Unicode 3.1 Unicode存在的问题 3.2 它们造成的结果是 四 UTF-8 4.1 UTF-8 特点 4.2 UTF-8 的编码规 ...
- bash解释器特性、目录结构、命令种类及优先级、常用命令
bash解释器的交互式环境特性 命令和文件自动补全 注意:Tab只能补全命令和文件及其文件路径 [root@localhost ~]# ls /etc/sysconfig/network-script ...
- 使用 TensorFlow 进行机器学习
使用 TensorFlow 进行机器学习 这是使用 TensorFlow 进行机器学习的官方代码存储库. 使用 TensorFlow(Google 最新.最好的机器学习库)开始进行机器学习. 概括 第 ...
- Android 通过solid来定义不同边框的颜色,可以只定义一个边框的颜色
以下是设置按钮的右边框和底边框颜色为红色,边框大小为3dp,如下图: 在drawable新建一个 btnstyle.xml的文件,内容如下: <?xml version="1.0&qu ...
- oauth2单点登录集成
单点登陆 概念: 单点登录其实就是在多个系统之间建立链接, 打通登录系统, 让同一个账号在多个系统中通用 举个例子: 登录Gmail的时候可以用账号密码登录, 也可以用google账号登录, 而使用g ...
- 9.17 多校联测 Day3 总结
全程罚坐场. 模拟赛考试状态持续低迷,为明天的状态感到深深担忧. <题目并不难,请喧哗的同学不要大声 AK>,离谱. 不保证按难度顺序排序,尝试改变策略.开始第 1h 将四道题通读一遍并做 ...
- ELK中 Elasticsearch和Logstash内存大小设置的考虑
本文为博主原创,转载请注明出处: 在ELK(Elasticsearch.Logstash和Kibana)日志采集和分析场景中,适当设置Logstash和Elasticsearch的内存大小非常重要.这 ...