首页 > 编程语言 >【ASeeker】Android 源码捞针,服务接口扫描神器

【ASeeker】Android 源码捞针,服务接口扫描神器

时间:2024-06-20 12:58:45浏览次数:16  
标签:String ASeeker 接口 捞针 源码 Android 查找

ASeeker是一个Android源码应用系统服务接口扫描工具。

项目已开源:

☞ Github ☜ 

如果您也喜欢 ASeeker,别忘了给我们点个星。

说明

ASeeker 项目是我们在做虚拟化分身产品( 『 空壳 』 )过程中的内部开发工具,目的是为了提升Android系统各版本适配效率。由于产品需支持 Android 9.x ~ Android 14.x,需在应用访问所有的系统服务接口时,将我们关心的参数进行修正和还原。

这导致每个系统版本适配的工作量巨大,且很容易遗漏。因此我们开发了这个源码接口扫描工具,可以快速从Android源码中搜索我们需要的AIDL接口和服务,并安装定制的格式输出。

感谢开源项目com.github.javaparser,因为它的存在才让ASeeker成为可能,这也是我们开源ASeeker的动力。

ASeeker的特点:

  • 完整源码AIDL接口扫描。
  • 支持多目录关联递归类型查找识别。
  • 支持泛型类,内部类和继承类递归查找。
  • 支持匹配配置名单。
  • 支持Android代码语言规范格式化。
  • 支持查找结果的定制输出。

如何使用

# 确保 asseker.jar 和 res 在同一目录下
# aseeker [-options]
#   -p [SDK version code] [source code path]
$ java -jar aseeker.jar -p 33 /Users/abc/android_13.0_r13

输出结果目录:(包含扫描结果和执行过程日志)

输出文件内容:(可自定义输出内容格式)

package android.app.os.service;

import android.app.os.base.ProxyServiceBase;

// source code: /frameworks/base/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl
public class IAccessibilityInteractionConnectionCallback extends ProxyServiceBase {

    // 10.0 void setFindAccessibilityNodeInfoResult(AccessibilityNodeInfo info, int interactionId);// argument: AccessibilityNodeInfo:info -> CharSequence::mPackageName
    public static final String sMethod_setFindAccessibilityNodeInfoResult = "setFindAccessibilityNodeInfoResult";
    // 10.0 void setFindAccessibilityNodeInfosResult(List<AccessibilityNodeInfo> infos, int interactionId);// argument: List<AccessibilityNodeInfo>:infos -> CharSequence::mPackageName
    public static final String sMethod_setFindAccessibilityNodeInfosResult = "setFindAccessibilityNodeInfosResult";

}

功能实现

需求

为了实现应用虚拟化,我们需要将应用与系统服务接口通信中包含包名,路径的参数,函数名和返回值的接口进行适配。在访问之前需要修正为安装应用的信息,访问结果需要还原为原应用的信息。

因此,我们需要:

  1. 递归查找参数中包含类型为String的名字含包名的接口,如:packagepkg等。

    void func(String pkg);
    void func(ComponentName cn);// 因为ComponentName中有成员:mPackageName
    
  2. 递归查找返回值中包含类型为String的名字含包名的接口,如:packagepkg等。

    ComponentName getComponentName();
    
  3. 查找返回值为String但是函数名包含包名的接口。

    String getPackageName();
    
  4. 打印输出找到的具体路径。

        // 11.0 boolean enterPictureInPictureMode(IBinder token, PictureInPictureParams params);// argument: PictureInPictureParams:params -> List<RemoteAction>::mUserActions -> PendingIntent::mActionIntent
        public static final String sMethod_enterPictureInPictureMode = "enterPictureInPictureMode";
    

文件预处理

由于javaparser只支持基础的Java类语言规范,对于Android平台定制标签,关键字等不支持,所以需要对目标文件先进行格式化处理,去除这些属性。

// @from: com.ifms.cmpt.aseeker.AidlFormator.java

Pattern.compile("(?<![\\w])IN\\s+([a-zA-Z_])"),
Pattern.compile("(?<![\\w])in\\s+([a-zA-Z_])"),
Pattern.compile("(?<![\\w])OUT\\s+([a-zA-Z_])"),
Pattern.compile("(?<![\\w])out\\s+([a-zA-Z_])"),
Pattern.compile("(?<![\\w])INOUT\\s+([a-zA-Z_])"),
Pattern.compile("(?<![\\w])inout\\s+([a-zA-Z_])"),

private static final String PATTERN_AT = "@\\w[\\w.]*\\s*(\\([^)]*\\))?"; // rm @Nullable, @android.app.XXX(xxx)
private static final String PATTERN_ABSTRACT = "\\)\\s*=\\s*\\d+\\s*;$";// rm ") = ${number};"
private static final String PATTERN_BRIEF = "/\\*.*?\\*/";// rm "/*xxx*/"
private static final String ONEWAY = "oneway ";
private static final String PARCELABLE = "parcelable ";
private static final String UNION = "union ";

类查找

为了可以准确识别类型,需要完整的查找到参数类型。

  1. 当前同目录下查找。
  2. 当前同工程目录下查找。
  3. framework/base目录下查找。
  4. Android SDK目录下查找(可在config.txt中配置ANDROID_HOME路径)。

个性化配置

1. 全局配置: config.txt

# 配置Android SDK源码路径
ANDROID_HOME=C:\Users\Administrator\AppData\Local\Android\Sdk
# 配置最大递归访问深度,提升效率
MAX_LEVEL=4

2. 忽略类型: ignore.txt

byte
short
int
long
char
float
double
void
boolean

3. 忽略文件: ignore-file.txt

忽略明确不需要关注的接口类,这样不会出现在结果中。

# 系统服务使用
RemoteServiceCallback.aidl

# 系统WiFi管理模块,需要系统权限
IWifiScanner.aidl

4. 匹配类型: match.txt

ApplicationInfo
ComponentName
PackageInfo
ActivityInfo
ServiceInfo
ProviderInfo

5. 文件映射: mapping.txt

可以定制输出结果文件名。

# rename out file
# ${Android source file}=${target file}
# such as:
IActivityManager=IAMS

6. 输出模板: template.java

定制输出模板可以更好的和我们工程的代码融合,易于代码和结果对比。

package android.app.os.service;

import android.app.os.base.ProxyServiceBase;

@templateFile@
public class @templateClass@ extends ProxyServiceBase {

    @templateMethod@

}

标签:String,ASeeker,接口,捞针,源码,Android,查找
From: https://www.cnblogs.com/iofomo/p/18258450

相关文章

  • Java计算机毕业设计+Vue实习实训管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今社会,实习实训已成为高等教育中不可或缺的一部分,对于学生实践能力和职业素养的提升具有重要意义。然而,传统的实习实训管理方式存在着诸多不便,如......
  • 前端网站(一) - 登录页面及账号密码验证(完善版)【附源码】
    登录页面及账号密码验证开篇(请大家看完):此网站写给挚爱,后续页面还会慢慢更新,大家敬请期待~~~轻舟所编写这个前端框架的设计初衷,纯粹是为了哄对象开心。除此之外,并无其它任何用途或目的。此前端框架,主要侧重于前端页面的视觉效果和交互体验。通过运用各种前端技术和创意,......
  • 广告变现小游戏对接广告平台开发 源码搭建
    对接广告平台以实现小游戏广告变现,并搭建相应的源码,是一个包含多个技术环节的过程。这涉及到游戏开发、广告SDK集成、后端服务配置等多个方面。以下是一个大致的开发与搭建流程:一、游戏开发需求分析:首先明确小游戏的定位、玩法、特色以及目标用户群体,为后续的广告变现策略奠......
  • 基于java的酒店管理系统(ppt+ER图+流程图+需求背景数据库+架构说明有文视频源码齐全)
    1引言1.1编写目的本文档为阳光酒店管理系统概要设计说明书,为阳光酒店管理系统详细设计的主要依据。1.2背景本软件全称为XX酒店管理系统。本软件为清华IT学习认证中心1123班顾俊小组毕业设计项目,由小组成员顾俊、董丰共同完成。软件适用于普通二星级酒店、宾馆。1.3参考资......
  • 基于springboot实现课程答疑管理系统项目【项目源码+论文说明】计算机毕业设计
    摘要随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势,针对这个问题开发一个专门适应师生交流形式的网站。本文介绍了课程答疑系统的开发全过程。通过分析企业对于课程答疑系统的需求,创建了一个计算机管理课程答疑系统的方案。文章介绍了课程答疑系统的系统分析部分......
  • 基于springboot实现宠物咖啡馆平台管理系统项目【项目源码+论文说明】计算机毕业设计
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于SpringBoot的宠物咖啡馆平台的设计与实现的开发全过程。通过分析基于SpringBoot的宠物咖啡馆平台的设计与实现管理的不足,创建了一个计算机管理基于SpringBoot的......
  • django线上兼职平台系统 毕业设计-附源码83320
    摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对线上兼职等问题,对线上兼职进行研究分析,然后开发设计出django线上兼职平台系统以解决问题。......
  • 数字信号处理作业 序列的卷积 实现 + MATLAB 源码
    实现有限长序列的基本运算(包括:加法、乘法、累加、移位、翻褶、抽取、插值、卷积和),并以GUI的形式将这些运算整合起来,使用者可通过向GUI输入任意有限长序列得到对应的运算结果。加法:对两个序列中对应位置的元素进行相加,得到一个新的序列,要求两个序列的长度......
  • 数字信号处理之展示 z 变换与 s 变换之间的所有关系 +matlab 源码
    题目分析:要求z变换与s变换的关系,首先考虑z变换与s变换之间运用领域的不同,s域是连续时间表示域,使用连续的时间变量s表示信号的自变量,取值范围为复平面上的所有点。而z域是离散时间表示域,使用离散的时间变量z表示信号的自变量取值范围虽然也为复平面上的所有点,但对于离散信号而......
  • 基于小程序056大学生心理健康测试系统微信小程序项目(源码+文档+运行视频+讲解视频)
    前言......