一:阅读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源码。