smali文檔下載地址,點(diǎn)進(jìn)去有個(gè)Download按鈕下載下來(lái)即可卵迂。
- dalvik-bytecode.css
- dalvik-bytecode.html
- instruction-formats.css
- instruction-formats.html
smali baksmali
使用方法:
//反編譯成smali
java -jar baksmali-2.2.2.jar d classes.dex[dex文件名]
//smali轉(zhuǎn)成dex
java -jar smali-2.2.2.jar a out[需要轉(zhuǎn)成dex的smali目錄名稱]
重打包:把生成的dex文件替換到apk中串稀,并且刪除簽名信息重新簽名
apktool
apktool
使用方法:
//反編譯apk成smali
java -jar apktool_2.5.0.jar d xes.apk
//回編譯成apk
java -jar apktool_2.5.0.jar b xes[上一步驟反編譯生成的目錄名]
//簽名后即可運(yùn)行崖技。
常用smali
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int a = 2,b=3;
if(a>1){
b=4;
}
b=5;
}
對(duì)應(yīng)下面的smali:
.method protected onCreate(Landroid/os/Bundle;)V
.registers 5
.param p1, "savedInstanceState" # Landroid/os/Bundle;
.line 13
invoke-super {p0, p1}, Landroidx/appcompat/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V
.line 14
const v0, 0x7f0b001c
invoke-virtual {p0, v0}, Lcom/example/testsmail/MainActivity;->setContentView(I)V
.line 20
const/4 v0, 0x2
.local v0, "a":I
const/4 v1, 0x3
.line 21
.local v1, "b":I
const/4 v2, 0x1
if-le v0, v2, :cond_f
.line 22
const/4 v1, 0x4
.line 24
:cond_f
const/4 v1, 0x5
.line 25
return-void
.end method
這里要注意的:
v0<=v2,在java代碼中是翻譯成if(v0>v2){const/4 v1, 0x4}const/4 v1, 0x5,把要跳轉(zhuǎn)的函數(shù)地方的代碼寫在{}的外面眠屎。
-
const/4 v1, 0x3
.line 21
.local v1, "b":I 表示int b=3
靜態(tài)代碼塊:
//這里的cinit表示的是靜態(tài)代碼塊翎嫡,init表示構(gòu)造函數(shù)
.method static constructor <cinit>()V
.end method
常用指令
//取前面2個(gè)字節(jié)的數(shù)據(jù)港谊,v0=0x1234
const/high16 v0,#0x12340000
//Class cls =MainActivity.class;
const-class v1,Lcom/cr33/test/MainActivity
//Byte[] sz4 = new Byte[];
const/16 v10,0x1000
new-array v0,v0,[B
.local v0,"sz4":[B
//類型強(qiáng)轉(zhuǎn),把v0強(qiáng)轉(zhuǎn)成Activity對(duì)象
move-object v0,p1
check-cast v0,Landroid/app/Activity;
//判斷p1是否是Activity的派生類吨述,并把結(jié)果存在v0
instance-of v0,p1,Landroid/app/Activity;
//int[] ary2= {1,2,3,4};
const/4 v2,4
new-array v2,v2,[I
fill-array-data v2,:20
.local v2,"ary2":[I
:20 .array-data 4//這里的4表示是每一項(xiàng)4個(gè)字節(jié)岩睁,如果是byte的話,是array-data 1
0x1
0x2
0x3
0x4
.end array-data
//把1給v4[1]=1揣云,
const/4 v5,1
aput-byte v5,v4,v5
- 分支循環(huán)
if(a>0){
:cond_1
}else{
:cond2
}
goto:
- switch
.packed-switch 0x1 //把switch的值減掉1后捕儒,再進(jìn)行調(diào)整(因?yàn)閟itch之間相差的是1)
:66
:56
:46
java的switch case是可以使用String類型的字符串,它是直接通過(guò)hashcode來(lái)比較
開啟代碼混淆:在build.gradle中minifyEnabled false改成true
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}