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

news/2024/9/28 10:58:17

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::mPackageNamepublic static final String sMethod_setFindAccessibilityNodeInfoResult = "setFindAccessibilityNodeInfoResult";// 10.0 void setFindAccessibilityNodeInfosResult(List<AccessibilityNodeInfo> infos, int interactionId);// argument: List<AccessibilityNodeInfo>:infos -> CharSequence::mPackageNamepublic 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::mActionIntentpublic static final String sMethod_enterPictureInPictureMode = "enterPictureInPictureMode";
    

文件预处理

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

// @from: com.ifms.cmpt.aseeker.AidlFormator.javaPattern.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@}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/45670.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【日记】上班居然睡了一上午(230 字)

正文昨天色到了很晚,早上没什么精神,于是睡了一个上午。在监控下面睡,只能说不愧是我。高中练就的无痕上课睡觉绝技居然在上班时也能派上用场。反洗钱系统今天卡到爆炸,这部分工作只能明天再做了。下午写了一篇文章。今天似乎也没做什么呢。晚上很想好好地在舞蹈室里练习,…

Linux 安装mongodb

1.1 Mongodb要求使用最新稳定版本 安装包下载地址:https://www.mongodb.com/try/download/community 本次选择:mongodb-linux-x86_64-rhel70-4.4.13.tgz 1.2安装步骤 上传安装包到服务器,并解压 #tar –zxvf mongodb-linux-x86_64-rhel70-4.4.13.tgz重命名解压后的文件名 # …

聊一聊 Monitor.Wait 和 Pluse 的底层玩法

一:背景 1. 讲故事 在dump分析的过程中经常会看到很多线程卡在Monitor.Wait方法上,曾经也有不少人问我为什么用 !syncblk 看不到 Monitor.Wait 上的锁信息,刚好昨天有时间我就来研究一下。 二:Monitor.Wait 底层怎么玩的 1. 案例演示 为了方便讲述,先上一段演示代码,Work…

Sql注入基础

1. Sql 注入基础 1.1 SQL 注入的发生1.2 如何获取数据库信息show 命令 select +函数 系统库1.3 参数会如何处理?1.4 Sql 注入的完整流程判断是否可以注入 获得数据库名 获得表名 获取列名 获得数据2. SQL 注入自动化工具 2.1 sqlmap2.2 sqlmap 参数详解 sqlmap -hh 基本用法:…

易基因:MeRIP-seq等揭示RNA m6A去甲基化酶调控植物雄性不育的分子机制 | 科研速递

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 水稻是全球重要的农作物,也是单子叶植物模型。在水稻中,N6-甲基腺苷(m6A)mRNA修饰对植物的发育和胁迫响应至关重要。OsFIP37作为m6A甲基化复合体的核心组分,其缺乏会导致雄性不育,强调了m6A在雄性生育中…

硬件开发笔记(二十):AD21导入外部下载的元器件原理图库、封装库和3D模型

前言在硬件设计的过程中,会遇到一些元器件,这些元器件在本地已有的库里面没有,但是可以从外部下载或者获取到对应的。  本篇就是引入TPS54331D电源芯片作为示例,详细描述整个过程。 创建TPS54331D步骤一:下载TPS54331D模型云汉芯城  注意:无需注册登录,搜索到有,就…

2024-06-20 HarmonyOs开发初体验

2024华为开发者大会将于东莞松山湖举行,为此,特写此文。记录自己第一天入坑鸿蒙开发。鸿蒙开发简述:鸿蒙开发是指针对华为开发的一款全场景分布式操作系统的应用、服务和功能的开发工作,该操作系统名为鸿蒙,英文名为HarmonyOs。 官网地址:https://hmxt.org/ 开发工具下载…

[笔记]Splay树

前置知识:树的左旋、右旋。 Splay树是一种平衡树。能够做到每个操作均摊\(O(\log N)\)。 前言 与上文AVL树不同之处在于,AVL树在任何操作结束后,都能保证每个节点的左右子树高度相差不超过\(1\)。相应地,每个操作都是严格的\(O(\log N)\)。而Splay树并没有对“平衡”的确切…