Android修改Smali重打包初探

由于某些需求胚膊,我們需要對特定Apk進行修改。下面我們嘗試向某Apk的主Activity注入發(fā)送http請求的操作。鄭重申明:學會以后不可以做壞事哦~

  • 需要的工具

  1. 反編譯/重打包/簽名 工具: 我使用的是mac下的Android Crack Tool集成工具朴肺, 包含了這三個功能窖剑。Windows下有類似的工具坚洽,讀者自行搜索下載即可。
  2. Android Studio: 由于直接編寫smali代碼難度很大西土!(牛批的大神可以略過~)我們這里使用IDEA的Java2Smali插件讶舰,可以直接將java文件轉換為smali文件。所以需了,Android Studio不是必須的跳昼,只要你能把java轉成smali就行。我這里徒省事肋乍,就直接用AS啦鹅颊。
  3. Jeb: 追蹤Apk代碼的強大工具!可以直接查看smali或decompile后的java代碼并自由切換墓造。當然堪伍,其他類似工具也可以~
  • 反編譯Apk

Android Crack Tool

可以看到,使用類似的集成化工具進行反編譯或其他操作是很簡單的觅闽。好吧好吧帝雇,我承認這不是簡單,簡直就是傻瓜式?(PД`q?)?゜ 不懂Android蛉拙,不會寫程序的也可以反編譯了好嗎尸闸!為了展現(xiàn)出我們Android逆向研究人員的專業(yè)性,為了b格孕锄,下面我們使用命令進行反編譯吮廉!(自己學吧~我才不教,費勁畸肆!ˋˊ )
回歸正題宦芦,執(zhí)行后,目錄下會生成test-O文件夾恼除,里面包含了反編譯后的文件踪旷。

  • 重建Apk

選中我們剛才反編譯好的文件夾test-O再重建即可。目錄下會出現(xiàn)test-O-R.apk豁辉。

  • 簽名Apk

重建好的apk是沒有簽名的令野,無法安裝到手機。所以我們用工具給apk簽個名就ok啦~

  • 尋找Apk內的主Activity

這里先說明為什么我們要先走一遍 反編譯-重建-簽名 的流程徽级,因為某種神秘的因素气破,就算你沒有做任何修改,二次打包后的apk都無法安裝使用(′°????????ω°????????`) (其實這是別人告訴我的餐抢,如不正確請指正现使。為了不走彎路低匙,我就信了,反正事先試一下也不費事~)碳锈。下面開始正題顽冶。
在test-O文件夾里有AndroidManifest.xml,在里面看一下就知道售碳。我這里的主Activity為DeamonActivity,所在包為com.xxx.game.ui强重。對,包也要記住贸人,后面用得上间景!

  • 編寫Java并轉Smali

還記得剛才找到的包名不?我的是com.xxx.game.ui∫罩牵現(xiàn)在我們新建一個Android工程倘要,并且新建com.xxx.game.ui包。我們的Activity和需要添加的類均在此包內創(chuàng)建(具體為什么我后面再解釋)十拣。這里看一下我寫好的幾個類:


很簡單封拧,就這三個

LinkwebActivity內onCreate代碼:

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        HttpRequester.sendGetHttp();
    }

調用的方法必須靜態(tài)!靜態(tài)父晶!靜態(tài)哮缺!重要的事情說3遍!(原因我后面再解釋甲喝,我就不現(xiàn)在說~~不服你打我呀(?)?)
使用Java2Smali轉換java文件:


生成的smali

可以看到HttpRequester的smali有兩個尝苇,HttpReponser和LinkwebActivity的smali只有一個。這并不是轉換錯誤埠胖,而是因為HttpRequester的java文件中有對HttpResponser類的引用:

public HttpResponser sendPost(String urlString, Map<String, String> params)
            throws IOException {
        return this.send(urlString, "POST", params, null);
    }

****$1.smali的代碼結構是比較復雜的糠溜,我們可以看一下:

.class final Lcom/xxx/game/ui/HttpRequester$1;
.super Ljava/lang/Object;
.source "HttpRequester.java"
# interfaces
.implements Ljava/lang/Runnable;
# annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
    value = Lcom/xxx/game/ui/HttpRequester;->sendGetHttp()V
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
    accessFlags = 0x8
    name = null
.end annotation
# direct methods
.method constructor <init>()V
    .registers 1
    .prologue
    .line 32
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
    return-void
.end method

為了更容易修改apk內smali的代碼,我們應該避免LinkwebActivity的$1.smali文件的生成直撤,否則就需要修改Apk內DeamonActivity的$1.smali文件(代碼少還好改非竿,稍微多一點改起來就很恐怖了!)谋竖。這里就解釋了我為什么要把三個方法都放在com.xxx.game.ui包下,并且使用了靜態(tài)方法來調用红柱。

  • 修改Apk內的smali文件

這里我們用Jeb打開apk,定位DeamonActivity的oncreate的smali具體在哪一行蓖乘,好做修改锤悄。

//java代碼
 protected void onCreate(Bundle arg5) {
        BroadcastReceiver v1 = null;
        super.onCreate(arg5);
        if(GameAssist.getInstance() == null) {
            n.c("[onCreate] >>> instance==null");
            this.c = v1;
            this.a();
        }
        else if(GameAssist.getReady()) {
            n.c("[onCreate] >>> instance get ready");
            this.c = v1;
            this.a();
        }
}
//smali代碼
.method protected onCreate(Bundle)V
          .registers 6
const/4                 v1, 0x0
invoke-super            Activity->onCreate(Bundle)V, p0, p1
invoke-static           GameAssist->getInstance()GameAssist
move-result-object      v0
if-nez                  v0, :2A
:14
const-string            v0, "[onCreate] >>> instance==null"
invoke-static           n->c(String)V, v0
iput-object             v1, p0, DeamonActivity->c:BroadcastReceiver
invoke-direct           DeamonActivity->a()V, p0

定位到需要修改的代碼位置后,我們在test-O/smali/com/xxx/game/ui/下打開DeamonActivity.smali文件添加代碼:

//LinkwebActivity中oncreate的smali代碼:
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
    .registers 2
    .param p1, "savedInstanceState"    # Landroid/os/Bundle;
        .annotation build Landroid/support/annotation/Nullable;
        .end annotation
    .end param
    .prologue
    .line 16
    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
    .line 17
    invoke-static {}, Lcom/xxx/game/ui/HttpRequester;->sendGetHttp()V
    .line 18
    return-void
.end method
//DeamonActivity修改后的smali代碼
.method protected onCreate(Bundle)V
          .registers 6
const/4                 v1, 0x0
invoke-super            Activity->onCreate(Bundle)V, p0, p1
 invoke-static {}, Lcom/xxx/game/ui/HttpRequester;->sendGetHttp()V
invoke-static           GameAssist->getInstance()GameAssist
move-result-object      v0
if-nez                  v0, :2A
:14
const-string            v0, "[onCreate] >>> instance==null"
invoke-static           n->c(String)V, v0
iput-object             v1, p0, DeamonActivity->c:BroadcastReceiver invoke-direct           DeamonActivity->a()V, p0

只需要在Activity->onCreate后添加 invoke-static {}, Lcom/xxx/game/ui/HttpRequester;->sendGetHttp()V,然后直接保存嘉抒。接著把HttpRequest.smali零聚,HttpRequester$1.smali 和HttpResponser.smali都拷貝到目錄下即可。

  • finally

利用修改后的文件夾重建Apk-簽名-安裝到手機運行,抓包抓到我們寫入的httppost請求隶症,大功告成~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末政模,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚂会,更是在濱河造成了極大的恐慌淋样,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颂龙,死亡現(xiàn)場離奇詭異习蓬,居然都是意外死亡纽什,警方通過查閱死者的電腦和手機措嵌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芦缰,“玉大人企巢,你說我怎么就攤上這事∪美伲” “怎么了浪规?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長探孝。 經(jīng)常有香客問我笋婿,道長,這世上最難降的妖魔是什么顿颅? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任缸濒,我火速辦了婚禮,結果婚禮上粱腻,老公的妹妹穿的比我還像新娘庇配。我一直安慰自己,他們只是感情好绍些,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布捞慌。 她就那樣靜靜地躺著,像睡著了一般柬批。 火紅的嫁衣襯著肌膚如雪啸澡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天氮帐,我揣著相機與錄音嗅虏,去河邊找鬼。 笑死揪漩,一個胖子當著我的面吹牛旋恼,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼冰更,長吁一口氣:“原來是場噩夢啊……” “哼产徊!你這毒婦竟也來了?” 一聲冷哼從身側響起蜀细,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤舟铜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奠衔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谆刨,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年归斤,在試婚紗的時候發(fā)現(xiàn)自己被綠了痊夭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡脏里,死狀恐怖她我,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情迫横,我是刑警寧澤番舆,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站矾踱,受9級特大地震影響恨狈,放射性物質發(fā)生泄漏。R本人自食惡果不足惜呛讲,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一禾怠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧圣蝎,春花似錦刃宵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至关面,卻和暖如春坦袍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背等太。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工捂齐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缩抡。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓奠宜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子压真,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容