我需要分析各種機器人的APK,發現執行意圖的方法,然後得到的意圖的動作名稱,比如「ACTION_VIEW」等- 使用菸灰Android的意圖分析
我能夠獲取所有相關的方法,如startActivity(),startActivityForResult()和onCreate()。但是我無法在相應的本地(Intent引用)中獲取動作名稱或常量。是否有可能將Intent.java類加載到Scene中(添加爲基本類已經這樣做了?),然後將Local轉換爲Intent對象? 或者你能推薦一種使用煤煙的完全不同的方法嗎?
下面我當前自定義菸灰類的列表:
Options.v().set_src_prec(Options.src_prec_apk);
Options.v().set_whole_program(true);
Options.v().set_output_format(Options.output_format_none);
Scene.v().addBasicClass("java.lang.Object");
Scene.v().addBasicClass("android.content.Intent");
PackManager.v().getPack("jtp").add(new Transform("jtp.myInstrumenter", new BodyTransformer() {
@Override
protected void internalTransform(Body b, String phaseName, Map options) {
final PatchingChain<Unit> units = b.getUnits();
//important to use snapshotIterator here
for(Iterator<Unit> iter = units.snapshotIterator(); iter.hasNext();) {
final Unit u = iter.next();
u.apply(new AbstractStmtSwitch() {
// getting invoke statements
public void caseInvokeStmt(InvokeStmt stmt) {
InvokeExpr invokeExpr = stmt.getInvokeExpr();
// getting intent respective methods
if(invokeExpr.getMethod().getName().equals("onCreate") ||
invokeExpr.getMethod().getName().equals("startActivity") ||
invokeExpr.getMethod().getName().equals("startActivityForResult")) {
System.out.println(invokeExpr.getMethod().getSignature());
// get value 0, always an Intent in those methods
Value val = invokeExpr.getArg(0); // references Intent
if(val.getType() instanceof RefType) {
RefType rt = (RefType) val.getType();
// Cast to android.content.Intent here..
// Intent in = (Intent) val;
System.out.println(rt.getClassName());
}
}
}
});
}
}
}));
輸出以下的一些例子APK:
<android.app.Activity: void startActivityForResult(android.content.Intent,int)>
android.content.Intent
<android.app.Activity: void startActivityForResult(android.content.Intent,int)>
android.content.Intent
<android.app.Activity: void startActivityForResult(android.content.Intent,int)>
android.content.Intent
<android.app.Activity: void onCreate(android.os.Bundle)>
android.os.Bundle
<android.content.Context: void startActivity(android.content.Intent)>
android.content.Intent