【ASeeker】Android 源碼撈針,服務(wù)接口掃描神器
ASeeker是一個Android源碼應(yīng)用系統(tǒng)服務(wù)接口掃描工具。

項目已開源:
如果您也喜歡 ASeeker,別忘了給我們點(diǎn)個星。
說明
ASeeker 項目是我們在做虛擬化分身產(chǎn)品( 『 空殼 』 )過程中的內(nèi)部開發(fā)工具,目的是為了提升Android系統(tǒng)各版本適配效率。由于產(chǎn)品需支持 Android 9.x ~ Android 14.x,需在應(yīng)用訪問所有的系統(tǒng)服務(wù)接口時,將我們關(guān)心的參數(shù)進(jìn)行修正和還原。
這導(dǎo)致每個系統(tǒng)版本適配的工作量巨大,且很容易遺漏。因此我們開發(fā)了這個源碼接口掃描工具,可以快速從Android源碼中搜索我們需要的AIDL接口和服務(wù),并安裝定制的格式輸出。
感謝開源項目com.github.javaparser,因為它的存在才讓ASeeker成為可能,這也是我們開源ASeeker的動力。
ASeeker的特點(diǎn):
- 完整源碼
AIDL接口掃描。 - 支持多目錄關(guān)聯(lián)遞歸類型查找識別。
- 支持泛型類,內(nèi)部類和繼承類遞歸查找。
- 支持匹配配置名單。
- 支持
Android代碼語言規(guī)范格式化。 - 支持查找結(jié)果的定制輸出。
如何使用
# 確保 asseker.jar 和 res 在同一目錄下
# aseeker [-options]
# -p [SDK version code] [source code path]
$ java -jar aseeker.jar -p 33 /Users/abc/android_13.0_r13
輸出結(jié)果目錄:(包含掃描結(jié)果和執(zhí)行過程日志)

輸出文件內(nèi)容:(可自定義輸出內(nèi)容格式)
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";
}
功能實(shí)現(xiàn)
需求
為了實(shí)現(xiàn)應(yīng)用虛擬化,我們需要將應(yīng)用與系統(tǒng)服務(wù)接口通信中包含包名,路徑的參數(shù),函數(shù)名和返回值的接口進(jìn)行適配。在訪問之前需要修正為安裝應(yīng)用的信息,訪問結(jié)果需要還原為原應(yīng)用的信息。
因此,我們需要:
-
遞歸查找參數(shù)中包含類型為
String的名字含包名的接口,如:package,pkg等。void func(String pkg); void func(ComponentName cn);// 因為ComponentName中有成員:mPackageName -
遞歸查找返回值中包含類型為
String的名字含包名的接口,如:package,pkg等。ComponentName getComponentName(); -
查找返回值為
String但是函數(shù)名包含包名的接口。String getPackageName(); -
打印輸出找到的具體路徑。
// 11.0 boolean enterPictureInPictureMode(IBinder token, PictureInPictureParams params);// argument: PictureInPictureParams:params -> List<RemoteAction>::mUserActions -> PendingIntent::mActionIntent public static final String sMethod_enterPictureInPictureMode = "enterPictureInPictureMode";
文件預(yù)處理
由于javaparser只支持基礎(chǔ)的Java類語言規(guī)范,對于Android平臺定制標(biāo)簽,關(guān)鍵字等不支持,所以需要對目標(biāo)文件先進(jìn)行格式化處理,去除這些屬性。
// @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 ";
類查找
為了可以準(zhǔn)確識別類型,需要完整的查找到參數(shù)類型。
- 當(dāng)前同目錄下查找。
- 當(dāng)前同工程目錄下查找。
framework/base目錄下查找。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
忽略明確不需要關(guān)注的接口類,這樣不會出現(xiàn)在結(jié)果中。
# 系統(tǒng)服務(wù)使用
RemoteServiceCallback.aidl
# 系統(tǒng)WiFi管理模塊,需要系統(tǒng)權(quán)限
IWifiScanner.aidl
4. 匹配類型: match.txt
ApplicationInfo
ComponentName
PackageInfo
ActivityInfo
ServiceInfo
ProviderInfo
5. 文件映射: mapping.txt
可以定制輸出結(jié)果文件名。
# rename out file
# ${Android source file}=${target file}
# such as:
IActivityManager=IAMS
6. 輸出模板: template.java
定制輸出模板可以更好的和我們工程的代碼融合,易于代碼和結(jié)果對比。
package android.app.os.service;
import android.app.os.base.ProxyServiceBase;
@templateFile@
public class @templateClass@ extends ProxyServiceBase {
@templateMethod@
}
浙公網(wǎng)安備 33010602011771號