使用AndroidKiller進行APK反編譯
安裝環境
- JDK
最好用JDK8,問就是坑太多了 - Android Studio
官網安裝即可,安裝教程如下
//www.runoob.com/android/android-studio-install.html
實際上還有一些雜七雜八的東西,後面遇到的時候再安裝
編寫第一個Android APP
打開Android Studio
,創建一個Empty Activity
編寫MainActivity.java
程式碼
package com.example.test2;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
EditText Name; //定義Plain Test控制項第一個輸入框的名字
EditText Pass; //定義Plain Test控制項第二個輸入框的名字
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Name = (EditText) findViewById(R.id.TEST_NAME); //通過findViewById找到輸入框控制項對應的id並給它起一個名字
Pass = (EditText) findViewById(R.id.TEST_PASS);//通過findViewById
// 找到輸入框控制項對應的id並給它起一個名字
Button Login = (Button) findViewById(R.id.BTN_Login);//通過findViewById找到按鈕控制項對應的id並給它起一個名字
Login.setOnClickListener(new View.OnClickListener() { //監聽有沒有點擊按鈕控制項 如果點擊了就會執行onClick函數
@Override
public void onClick(View view) {
check(Name.getText().toString().trim(),Pass.getText().toString().trim()); //調用check函數
}
});
}
public void check(String name,String pass)
{
if(name.equals("admin")&&pass.equals("admin123"))
{
Toast.makeText(MainActivity.this,"登錄成功", Toast.LENGTH_SHORT).show();//彈框
}
else
Toast.makeText(MainActivity.this,"登錄失敗", Toast.LENGTH_SHORT).show();//彈框
}
}
打開activity_main.xml
,點擊Design
進行可視化拖拽編程
拖拽生成用戶名和密碼框,以及一個登錄按鈕
組件的屬性需要跟上面的MainActivity.java
中的對應
例如這裡的用戶名輸入框的id是TEST_NAME
,MainActivity.java
中用戶名輸入框程式碼為:
Name = (EditText) findViewById(R.id.TEST_NAME);
模擬運行、手機安裝
選擇一個對應的手機型號模板,開始運行
輸入用戶名密碼正確時(admin/admin123),顯示登錄成功;輸入用戶名密碼錯誤時(xxx/xxx),顯示登陸失敗
登陸成功
登陸失敗
選擇build apk,生成手機安裝的apk文件
將生成的apk文件傳給手機就能夠安裝運行了
Android逆向工具
Android逆向的工具很多,這裡我們使用Android Killer
鏈接://pan.baidu.com/s/1skClh3f 密碼:6u0q
下載解壓,配置JDK路徑
現在就能夠正常使用該工具了
逆向初體驗
將我們剛才生成的apk文件拖進Android Killer
,等待反編譯結束
可以注意到這裡是smali文件,smali是Android虛擬機的反彙編語言
我們都知道,Android程式碼一般是用java編寫的,執行java程式一般需要用到java虛擬機,在Android平台上也不例外,但是出於性能上的考慮,並沒有使用標準的JVM,而是使用專門的Android虛擬機(5.0以下為Dalvik,5.0以上為ART)。Android虛擬機的可執行文件並不是普通的class文件,而是再重新整合打包後生成的dex文件。dex文件反編譯之後就是Smali程式碼,所以說,Smali語言是Android虛擬機的反彙編語言。
我們暫時不需要刻意去學習smali語法,看不懂的地方就先百度,看得多了常見的就會了
尋找smali文件中的check
方法,也就是之前我們編寫用來判斷用戶輸入用戶名密碼是否正確的函數,下面對該部分程式碼逐行講解
# virtual methods
在smali
中函數分為兩類:direct method
和virtual method
,direct method
就是private
私有方法,virtual method
就是指其餘的方法。
.method public check(Ljava/lang/String;Ljava/lang/String;)V
check方法
.locals 2
指定了方法內局部變數的個數,這裡是用戶名和密碼兩個
兩個變數
.param p1, "name" # Ljava/lang/String;
.param p2, "pass" # Ljava/lang/String;
.line 31
表示java源文件中指定行
const-string v0, "admin"
定義常量字元串,即 v0 = admin
invoke-virtual {p1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
把p1
和v0
的值進行比較
move-result v0
將上個函數的執行結果傳遞給v0,這裡的上個函數是equals
const/4 v1, 0x0
將值0x0存到v1本地暫存器
if-eqz v0, :cond_0
如果v0等於0,則跳轉到cond_0
cond_0
部分的程式碼為登陸失敗程式碼
:cond_0
const-string v0, "\u767b\u5f55\u5931\u8d25"
invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v0
invoke-virtual {v0}, Landroid/widget/Toast;->show()V
檢測密碼的流程也類似,當檢測通過後,就會進入登錄成功邏輯
const-string v0, "\u767b\u5f55\u6210\u529f"
invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v0
invoke-virtual {v0}, Landroid/widget/Toast;->show()V
所以整個邏輯就是用戶名密碼傳遞給了p1,p2,然後與硬編碼的v0依次進行比較,如果不相等則v0為0,登錄失敗,如果用戶名密碼都正確,程式才會往下執行,顯示登錄成功
想要在不知道密碼的情況下修改smali程式碼,從而登陸成功的方法有很多種,比如原文中給出了將if-eqz
修改為if-nez
;刪除掉判斷語句;使用goto語句直接跳轉等方式
這裡我們直接修改比較邏輯
然後重新編譯為新的apk
回編的時候報錯了
Exception in thread "main" brut.androlib.AndrolibException: brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1)
出現這個問題一般是apktool.jar
的版本太老了的原因,在官網下載最新版本即可://ibotpeaches.github.io/Apktool/install/
將下載的jar
放置在AndroidKiller\bin\apktool\apktool
文件夾下,並且重命名為ShakaApktool.jar
,也就是將原來的那個過時jar
覆蓋掉
該問題也可以編輯APKTOOL管理器來進行指定apktool.jar進行操作
重新編譯時出現新的問題:
brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1)
添加參數-r
添加後依然報錯
刪除掉C:\Users\<這裡填自己的用戶名>\AppData\Local\apktool\framework\1.apk
文件,重新編譯,無報錯,修改成功
參考鏈接
- 教我兄弟學Android逆向系列課程+附件導航帖
- Android逆向基礎:Smali語法
- Android Killer中apktool插件更新
- AndroidKiller回編譯BrutException錯誤
END
建了一個微信的安全交流群,歡迎添加我微信備註進群
,一起來聊天吹水哇,以及一個會發布安全相關內容的公眾號,歡迎關注 😃

