【茶余饭后-【ASeeker】Android 源码捞针,服务接口扫描神器】此文章归类为:茶余饭后。
ASeeker
是一个Android
源码应用系统服务接口扫描工具。
项目已开源:
☞ Github ☜
如果您也喜欢 ASeeker,别忘了给我们点个星。
说明
ASeeker
项目是我们在做虚拟化分身产品( 『 空壳 』 )过程中的内部开发工具,目的是为了提升Android
系统各版本适配效率。由于产品需支持 Android 9.x ~ Android 14.x
,需在应用访问所有的系统服务接口时,将我们关心的参数进行修正和还原。
这导致每个系统版本适配的工作量巨大,且很容易遗漏。因此我们开发了这个源码接口扫描工具,可以快速从Android
源码中搜索我们需要的AIDL
接口和服务,并安装定制的格式输出。
感谢开源项目com.github.javaparser
,因为它的存在才让ASeeker
成为可能,这也是我们开源ASeeker
的动力。
ASeeker
的特点:
- 完整源码
AIDL
接口扫描。
- 支持多目录关联递归类型查找识别。
- 支持泛型类,内部类和继承类递归查找。
- 支持匹配配置名单。
- 支持
Android
代码语言规范格式化。
- 支持查找结果的定制输出。
如何使用
1 2 3 4 | $ java -jar aseeker.jar -p 33 /Users/abc/android_13 .0_r13
|
输出结果目录:(包含扫描结果和执行过程日志)
输出文件内容:(可自定义输出内容格式)
1 2 3 4 5 6 7 8 9 10 11 12 13 | package android.app.os.service;
import android.app.os.base.ProxyServiceBase;
public class IAccessibilityInteractionConnectionCallback extends ProxyServiceBase {
public static final String sMethod_setFindAccessibilityNodeInfoResult = "setFindAccessibilityNodeInfoResult" ;
public static final String sMethod_setFindAccessibilityNodeInfosResult = "setFindAccessibilityNodeInfosResult" ;
}
|
功能实现
需求
为了实现应用虚拟化,我们需要将应用与系统服务接口通信中包含包名,路径的参数,函数名和返回值的接口进行适配。在访问之前需要修正为安装应用的信息,访问结果需要还原为原应用的信息。
因此,我们需要:
递归查找参数中包含类型为String
的名字含包名的接口,如:package
,pkg
等。
1 2 | void func(String pkg);
void func(ComponentName cn);
|
递归查找返回值中包含类型为String
的名字含包名的接口,如:package
,pkg
等。
1 | ComponentName getComponentName();
|
查找返回值为String
但是函数名包含包名的接口。
打印输出找到的具体路径。
1 2 | public static final String sMethod_enterPictureInPictureMode = "enterPictureInPictureMode" ;
|
文件预处理
由于javaparser
只支持基础的Java
类语言规范,对于Android
平台定制标签,关键字等不支持,所以需要对目标文件先进行格式化处理,去除这些属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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*(\\([^)]*\\))?" ;
private static final String PATTERN_ABSTRACT = "\\)\\s*=\\s*\\d+\\s*;$" ;
private static final String PATTERN_BRIEF = "/\\*.*?\\*/" ;
private static final String ONEWAY = "oneway " ;
private static final String PARCELABLE = "parcelable " ;
private static final String UNION = "union " ;
|
类查找
为了可以准确识别类型,需要完整的查找到参数类型。
- 当前同目录下查找。
- 当前同工程目录下查找。
framework/base
目录下查找。
Android SDK
目录下查找(可在config.txt
中配置ANDROID_HOME
路径)。
个性化配置
1. 全局配置: config.txt
1 2 3 4 | ANDROID_HOME=C:\Users\Administrator\AppData\Local\Android\Sdk
MAX_LEVEL=4
|
2. 忽略类型: ignore.txt
1 2 3 4 5 6 7 8 9 | byte
short
int
long
char
float
double
void
boolean
|
3. 忽略文件: ignore-file.txt
忽略明确不需要关注的接口类,这样不会出现在结果中。
1 2 3 4 5 | RemoteServiceCallback.aidl
IWifiScanner.aidl
|
4. 匹配类型: match.txt
1 2 3 4 5 6 | ApplicationInfo
ComponentName
PackageInfo
ActivityInfo
ServiceInfo
ProviderInfo
|
5. 文件映射: mapping.txt
可以定制输出结果文件名。
6. 输出模板: template.java
定制输出模板可以更好的和我们工程的代码融合,易于代码和结果对比。
1 2 3 4 5 6 7 8 9 10 | package android.app.os.service;
import android.app.os.base.ProxyServiceBase;
@templateFile @
public class @templateClass @ extends ProxyServiceBase {
@templateMethod @
}
|
更多【茶余饭后-【ASeeker】Android 源码捞针,服务接口扫描神器】相关视频教程:www.yxfzedu.com