close

作者論壇賬號:正己

一、課程目標

1.了解JVM、Dalvik、ART2.初識smali語法3.實戰修改smali

二、工具

1.教程Demo(更新)2.MT管理器/NP管理器3.雷電模擬器4.jadx-gui5.核心破解

三、課程內容1.什麼是JVM、Dalvik、ART

JVM是JAVA虛擬機,運行JAVA字節碼程序Dalvik是Google專門為Android設計的一個虛擬機,Dalvik有專屬的文件執行格式dex(Dalvik executable)Art(Android Runtime)相當於Dalvik的升級版,本質與Dalvik無異

2.smali及其語法

smali是Dalvik的寄存器語言,smali代碼是dex反編譯而來的。

關鍵字

名稱注釋.class類名.super父類名,繼承的上級類名名稱.source源名.field變量.method方法名.register寄存器.end method方法名的結束public公有protected半公開,只有同一家人才能用private私有,只能自己使用.parameter方法參數.prologue方法開始.line xxx位於第xxx行

數據類型對應

smali類型java類型注釋Vvoid無返回值Zboolean布爾值類型,返回0或1Bbyte字節類型,返回字節Sshort短整數類型,返回數字Cchar字符類型,返回字符Iint整數類型,返回數字Jlong (64位 需要2個寄存器存儲)長整數類型,返回數字Ffloat單浮點類型,返回數字Ddouble (64位 需要2個寄存器存儲)雙浮點類型,返回數字stringString文本類型,返回字符串Lxxx/xxx/xxxobject對象類型,返回對象

常用指令

關鍵字注釋const重寫整數屬性,真假屬性內容,只能是數字類型const-string重寫字符串內容const-wide重寫長整數類型,多用於修改到期時間。return返回指令if-eq全稱equal(a=b),比較寄存器ab內容,相同則跳if-ne全稱not equal(a!=b),ab內容不相同則跳if-eqz全稱equal zero(a=0),z即是0的標記,a等於0則跳if-nez全稱not equal zero(a!=0),a不等於0則跳if-ge全稱garden equal(a>=b),a大於或等於則跳if-le全稱little equal(a<=b),a小於或等於則跳goto強制跳到指定位置switch分支跳轉,一般會有多個分支線,並根據指令跳轉到適當位置iget獲取寄存器數據

其餘指令可用語法工具查詢

定位方法:搜索彈窗關鍵字、抓取按鈕id

例子:

複製代碼 隱藏代碼//一個私有、靜態、不可變的方法 方法名.method private static final onCreate$lambda-2(Lkotlin/jvm/internal/Ref$IntRef;Lcom/zj/wuaipojie/ui/ChallengeSecond;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/view/View;)Z //(這裡面是方法的參數)這裡是方法返回值類型,表示布爾值類型,返回假或真 .registers 7//寄存器數量 .line 33//代碼所在的行數 iget p0, p0, Lkotlin/jvm/internal/Ref$IntRef;->element:I//讀取p0(第一個參數,參考寄存器知識)中element的值賦值給p0 const/4 p5, 0x1//p5賦值1 const/16 v0, 0xa //v0賦值10,在16進制里a表示10 if-ge p0, v0, :cond_15//判斷p0的值是否大於或等於v0的值(即p0的值是否大於或等於10),如果大於或等於則跳轉到:cond_15 .line 34//以下是常見的Toast彈窗代碼 check-cast p1, Landroid/content/Context; //檢查Context對象引用 const-string p0, "請先獲取10個硬幣哦" //彈窗文本信息,把""里的字符串數據賦值給p0 check-cast p0, Ljava/lang/CharSequence; //檢查CharSequence對象引用 invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; //將彈窗文本、顯示時間等信息傳給p1 move-result-object p0//結果傳遞給p0 invoke-virtual {p0}, Landroid/widget/Toast;->show()V//當看到這個Toast;->show你就應該反應過來這裡是彈窗代碼 goto :goto_31//跳轉到:goto_31 :cond_15 //跳轉的一個地址 invoke-virtual {p1}, Lcom/zj/wuaipojie/ui/ChallengeSecond;->isvip()Z//判斷isvip方法的返回值是否為真(即結果是否為1) move-result p0//結果賦值給p0 if-eqz p0, :cond_43 //如果結果為0則跳轉cond_43地址 const p0, 0x7f0d0018//在arsc中的id索引,這個值可以進行查詢 .line 37 invoke-virtual {p2, p0}, Landroid/widget/ImageView;->setImageResource(I)V //設置圖片資源 const p0, 0x7f0d0008 .line 38 invoke-virtual {p3, p0}, Landroid/widget/ImageView;->setImageResource(I)V const p0, 0x7f0d000a .line 39 invoke-virtual {p4, p0}, Landroid/widget/ImageView;->setImageResource(I)V .line 40 sget-object p0, Lcom/zj/wuaipojie/util/SPUtils;->INSTANCE:Lcom/zj/wuaipojie/util/SPUtils; check-cast p1, Landroid/content/Context; const/4 p2, 0x2 //p2賦值2 const-string p3, "level" //sp的索引 invoke-virtual {p0, p1, p3, p2}, Lcom/zj/wuaipojie/util/SPUtils;->saveInt(Landroid/content/Context;Ljava/lang/String;I)V //寫入數據 goto :goto_50 //跳轉地址 :cond_43 check-cast p1, Landroid/content/Context; const-string p0, "\u8bf7\u5148\u5145\u503c\u5927\u4f1a\u5458\u54e6\uff01" //請先充值大會員哦! check-cast p0, Ljava/lang/CharSequence; invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; move-result-object p0 invoke-virtual {p0}, Landroid/widget/Toast;->show()V :goto_50 return p5//返回p5的值.end method //方法結束//判斷是否是大會員的方法.method public final isvip()Z .registers 2 const/4 v0, 0x0 //v0賦值0 return v0 //返回v0的值.end method

修改方法:修改判斷、強制跳轉、修改寄存器的值

3.寄存器

在smali里的所有操作都必須經過寄存器來進行:本地寄存器用v開頭數字結尾的符號來表示,如v0、 v1、v2。參數寄存器則使用p開頭數字結尾的符號來表示,如p0、p1、p2。特別注意的是,p0不一定是函數中的第一個參數,在非static函數中,p0代指「this",p1表示函數的第一個 參數,p2代表函數中的第二個參數。而在static函數中p0才對應第一個參數(因為Java的static方法中沒有this方法)

四、課後小作業

1.關掉視頻自己復現三種方法2.完成這個作業demo(因為最近實在是太太太忙了,絕對不是因為我懶,咕咕咕。搞懂這個demo那也基本上能理解本節課的內容)醜小鴨師傅的demo鏈接:https://pan.baidu.com/s/1cUInoi 密碼:07p9原文鏈接:教我兄弟學Android逆向02 破解第一個Android程序

五、反思&答疑

由於準備不是很充足,我感覺我講的不是太好,多看看我列舉參考文檔有利於理解smali語法。

對於開發者而言,在打包應用時,最好對代碼進行混淆,否則逆向人員輕而易舉得進行Crack,或者說在寫代碼的時候就不要用isvip、getvip等易辨識的單詞作為方法名

待更新

六、視頻及課件地址

百度云:

https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9

阿里雲PS:阿里雲在維護,暫時看不到第三課內容

https://www.aliyundrive.com/s/TJoKMK6du6x

嗶哩嗶哩:

https://www.bilibili.com/video/BV1wT411N7sV

PS:解壓密碼都是52pj,阿里雲由於不能分享壓縮包,所以下載exe文件,雙擊自解壓

七、其他章節

《安卓逆向這檔事》一、模擬器環境搭建《安卓逆向這檔事》二、初識APK文件結構、雙開、漢化、基礎修改

八、參考文檔

吾愛破解安卓逆向入門教程(三)---深入Smali文件吾愛破解安卓逆向入門教程(四)---Smali函數分析【原木文章】‍Android改造者之路-02.初探smali功法‍

詳細文字介紹、視頻原件下載、視頻所用到的程序下載、課後作業和學習交流參看論壇原文:

https://www.52pojie.cn/thread-1701353-1-1.html

點擊左下角閱讀原文,進入B站在線觀看,歡迎點讚、投幣、收藏、轉發~

-官方論壇

www.52pojie.cn

--推薦給朋友

公眾微信號:吾愛破解論壇

或搜微信號:pojie_52

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()