首先给大家普及一下啥叫微信逆向开发,以及微信逆向开发能做什么:

场景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版)——第一栏的更多相关文章

  1. 从零開始开发Android版2048 (一)初始化界面

    自学Android一个月多了,一直在工作之余零零散散地看一些东西.感觉经常使用的东西都有些了解了,可是一開始写代码总会出各种奇葩的问题.感觉还是代码写得太少.这样继续杂乱地学习下去进度也太慢了,并且学 ...

  2. 从零開始开发Android版2048 (三)逻辑推断

    近期工作比較忙,所以更新的慢了一点,今天的主要内容是关于Android版2048的逻辑推断,经过本篇的解说,基本上完毕了这个游戏的主体部分. 首先还是看一下,我在实现2048时用到的一些存储的数据结构 ...

  3. 从零開始开发Android版2048 (二)获取手势信息

    今天是尝试開始Android版2048小游戏的第二天.在今天,我主要学习了怎样获取用户在屏幕滑动的手势,以及对布局进行了一些小小的完好. 获取用户操作的手势(比方向左滑.向右滑等)主要用到了Gestu ...

  4. 从0系统学 Android--1.1认识 Android

    一转眼工作也有几年的时间了,一直想沉下心来,再回过头来重新系统的学习一遍 Android.所以就有了这个读书笔记.俗话说温故而知新,下面就请大家再跟着我系统的学习一篇 Android 吧! 这一系列主 ...

  5. maui BlazorWebView+本地html (vue、uniapp等都可以) 接入微信sdk 开发 Android app

    首先添加微信sdk的绑定库 nuget 包:Chi.MauiBinding.Android.WeChat 项目地址:https://github.com/realZhangChi/MauiBindin ...

  6. 从零開始开发Android版2048 (四) 分数、重置、结束

    这一篇的内容主要是在上一篇的基础上,增加分数计算(包含当前分数和最高分数).游戏结束的推断以及游戏界面的重置这三个部分的功能. 一.分数的计算和保存          首先,2048这个游戏的分数包含 ...

  7. 百度地图开发 Android版应用Key申请

    一 申请API key 在使用百度地图之前,我们必须去申请一个百度地图的API key,申请地址http://lbsyun.baidu.com/apiconsole/key,自己自行注册一个百度账号, ...

  8. 从零開始开发Android版2048 (五) 撤销的实现

    本篇的内容是,在前一篇的基础上添�了撤销的功能.撤销事实上就是将当前的用户界面恢复到这次滑动值前的样子.我实现撤销的主要原理是,将每次滑动后界面上的格子和相应的数字记录下来,当然还有分数,把这些数据写 ...

  9. c#开发Android初学(一)

    我也是最近开始学习用c#开发android,最近找在好心网友那里下到了四个android开发安卓的视频(传智的)有想要的朋友可以留下邮箱 废话不多收,分享我最近一个星期的成果. 先看最主要的一个获取数 ...

  10. Android微信逆向--实现发朋友圈动态

    0x0 前言 最近一直在研究Windows逆向的东西,想着快要把Android给遗忘了.所以就想利用工作之余来研究Android相关的技术,来保持对Android热情.调用微信代码来发送朋友圈动态一直 ...

随机推荐

  1. Python并发编程——操作系统发展史、多道技术、进程理论、开启进程、join方法、进程间的数据隔离

    文章目录 必备知识回顾 今日内容详细 操作系统发展史 多道技术 必备知识点 多道技术图解 多道技术重点知识 进程理论 必备知识点 进程调度 进程运行的三状态图 两对重要概念 开启进程的两种方式 joi ...

  2. 9. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP2改造篇之HPACK示例, 了解http2头信息如何处理

    9. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP2改造篇之HPACK示例, 了解http2头信息如何处理 项目 ++wmproxy++ gite: https://gite ...

  3. 一些常见小程序的UI设计分享

    外卖优惠券小程序的UI设计 电子商城系统UI分享 A B C

  4. 从原理到实战,详解XXE攻击

    本文分享自华为云社区<[安全攻防]深入浅出实战系列专题-XXE攻击>,作者: MDKing. 1 基本概念 XML基础:XML 指可扩展标记语言(Extensible Markup Lan ...

  5. WPF绘图(一):几何(Geometry)与形状(Shape)

    1. Geometry 在数学中,我们可以用一个方程描述圆:x2+y2=25.这个方程描述的是,一个半径为5,中心点在(0,0)的圆.这种纯数学的描述就是Geometry(几何). 但此时,这个&qu ...

  6. Redis 6 学习笔记 4 —— 通过秒杀案例,学习并发相关和apache bench的使用,记录遇到的问题

    背景 这是某硅谷的redis案例,主要问题是解决计数器和人员记录的事务操作 按照某硅谷的视频敲完之后出现这样乱码加报错的问题 乱码的问题要去tomcat根目录的conf文件夹下修改logging.pr ...

  7. Hooks的核心原理梳理

    我们前端都在诟病专业版,它的组件,它的耦合嵌套之深,它的性能. 我们希望改善,我们认为,如果--就好了. 如果重构就好了,如果技术栈统一就好了,如果有规范就好了. 其实,不用等,我们只要在写代码,就可 ...

  8. SVN分支与合并透析

    做法: 1.拉分支开发代码 2.开发完成后要和到主干去发布,这时候先把主干合并到分支,解决冲突 3.运行分支系统,看是否正确 4.再把该分支合并到主干 要知道分支分出去时的版本号,cmd打开命令行,使 ...

  9. SNN_STDP

    STDP 是一种时间不对称的Hebbian学习形式,由突触前和突触后神经元的脉冲时间的时间相关性引起的.是一种双向Hebbian学习法则. 突触权重变化\(\Delta w\)依赖于突触前脉冲的到达和 ...

  10. MySQL函数解读

    一.字符串函数 1.1.instr() INSTR(str,substr)一共有两个参数str被查询字符,substr查询字符,查询时下标从1开始记,只查询第一次出现的地方,为查询到显示为0 一般用法 ...