一:閱讀dalvik字節碼,可用ida閱讀dex, 或直接文本閱讀smali文件
二:閱讀java源碼,可用dex2jar生成jar文件,再使用jd-gui來閱讀jar文件的源碼。
Android.intent.category.LAUNCHER 在程序列表中可見。
1. application類用於組件之間傳遞全局變量在主activity啓動之前做一些工作,主activity可以通過AndroidManifest.xml中的android.intent.action.MAIN來定位。
2. dex文件的數據結構大部分在dalvik\libdex\DexFile.h中,可以整理成ida的idc腳本來導入ida6.1中。
3. ida分析中,imp表明該方法爲androidSDK中的API,@後爲聲明,類名與方法名用_分開,並且能識別隱參數this,由於this取代p0, 則後面的參數命名都依次-1.
4. 1. d2j-dex2jar xxx.apk 2. Ja-gui
Smali文件格式:
//smali文件的頭三行描述類信息
.class <訪問權限>[修飾關鍵字]<類名>
.super<父類名>
.source<源文件名>
#static fields
.field<訪問權限>static[修飾關鍵字]<字段名>:<字段類型>
#instance fields
.field<訪問權限>[修飾關鍵字]<字段名>:<字段類型>
#direct methods
.method <訪問權限> [修飾關鍵字] <方法原型>
<.locals> #局部變量數
[.parameter] #dalvik使用.parameters指定參數個數,而這表示一個參數,多個參數者出現多個.parameter.
[.prologue] #代碼開始處
[.line] #指定該處指令在源碼中行號
<代碼體>
.end method
#interfaces
.implements <接口名>
如何類使用註解,則生成.annotation指令
#annotation
.annotation[註解屬性]<註解類名>
[註解字段=值]
.end annotation
循環語句:
Iterator<對象><對象名> = <方法返回一個對象列表>;
For(<對象><對象名>:<對象列表>){
[處理單個對象代碼]
}
Iterator<對象><迭代器> = <方法返回一個迭代器>;
While(<迭代器>.hasNext()){
<對象><對象名> = <迭代器>.next();
[處理單個對象的代碼]
}
:goto_0
invoke-interface{v2}, Ljava/util/Iterator;->hasNext()Z
move-result v5
if-nez v5, :cond_0
…
:cond_0
invoke-interface {v2},Ljava/util/Iterator;->next()Ljava/lang/Object;
move-result-object v1
…
goto :goto_0
try catch:
try {
String a = "sdf";
Toast.makeText(this,a,Toast.LENGTH_SHORT);
try {
if( true ){
throw newNumberFormatException();
}
} catch (NumberFormatException e) {
Toast.makeText(this,"number format exception", Toast.LENGTH_SHORT);
}
} catch (IllegalArgumentException e){
Toast.makeText(this,"IllegalArgumentException",Toast.LENGTH_SHORT);
}
Smali:
.line 19
:try_start_0
const-string v0, "sdf"
.line 20
.local v0, "a":Ljava/lang/String;
const/4 v2, 0x0
invoke-static {p0, v0, v2},Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
:try_end_0
.catch Ljava/lang/IllegalArgumentException;{:try_start_0 .. :try_end_0} :catch_1
.line 23
:try_start_1
new-instance v2,Ljava/lang/NumberFormatException;
invoke-direct {v2},Ljava/lang/NumberFormatException;-><init>()V
throw v2
:try_end_1
.catch Ljava/lang/NumberFormatException;{:try_start_1 .. :try_end_1} :catch_0
.catch Ljava/lang/IllegalArgumentException;{:try_start_1 .. :try_end_1} :catch_1
.line 25
:catch_0
move-exception v1
.line 26
.local v1,"e":Ljava/lang/NumberFormatException;
:try_start_2
const-string v2, "number format exception"
const/4 v3, 0x0
invoke-static {p0, v2, v3},Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
:try_end_2
.catch Ljava/lang/IllegalArgumentException;{:try_start_2 .. :try_end_2} :catch_1
Ida6.1 ctrl+s 選擇String 搜索字符串, 選擇code搜索api
Dex2jar 轉換apk to jar, jd-gui 查看jar源碼。