反編譯Android App

大多數APP都對API接口進行了加密,防止第三方隨意調用接口绩聘,常用的方法是,設置一個key凿菩,在調用接口來發(fā)送請求時,組合各個參數和key按照一定的規(guī)則(排序帜讲,MD5等等)生成一個用于驗證的token參數,服務端接收到請求后似将,按照相同的規(guī)則組合參數和key去生成token,和收到的token去對比在验,判斷請求是否是第三方偽造發(fā)送的肢执。

但是通過抓包和反編譯APP,是可以得到key和生成token的規(guī)則兴溜,來將自己偽裝成官方的APP侦厚,調用API接口

下面的文章拙徽,主要是總結我自己反編譯魅族天氣的APP來獲取API的過程。

工具

反編譯class.dex獲取java代碼

原理:打包生成apk時,java源代碼先被編譯成.class文件岛心,然后Android SDK自帶的dx工具將這些.class文件轉換成classes.dex来破,所以可以反編譯classes.dex來得到java源代碼

步驟

  1. 下載dex2jar.zip和jd-gui徘禁,并解壓
  2. 將com.meizu.flyme.weather-2.2.1-2002001.apk重命名為com.meizu.flyme.weather-2.2.1-2002001.zip
  3. 解壓com.meizu.flyme.weather-2.2.1-2002001.zip,在解壓得到的目錄里找到classes.dex
  4. 使用dex2jar將classes.dex反編譯得到classes-dex2jar.jar
  5. 使用jd-gui查看classes-dex2jar.jar

操作截圖(Mac)

image
image

image
image

注意:執(zhí)行反編譯指令時送朱,可能會提示d2j_invoke.sh: Permission denied娘荡,輸入sudo chmod +x d2j_invoke.sh來解決

閱讀java代碼

這一步要耐心驶沼,因為代碼一般經過來混淆,生成很難看懂的代碼回怜,來到達保護代碼的目的

通過抓包大年,獲得了天氣信息的請求

image
image

然后我觀察到sign參數鹉戚,在每次請求時都會發(fā)生變化,它應該就是那個用于驗證的參數抹凳。

在一堆經過混淆的代碼中,會需要比較多的時間赢底,查找到生成驗證參數sign的相關代碼,這需要耐心幸冻。但利用搜索粹庞,可以加快查找的速度洽损。

在jd-gui里,F(xiàn)ile->Save All Sources碑定,將反編譯的java文件保存到source文件夾,我們利用請求的url去搜索(代碼里的常量字符串一般不會被混淆延刘,利用字符串去搜索漫试,一般都會找到有用的信息碘赖,來進一步查找


image
image

可以看到在source/com/meizu/flyme/weather/common/ad.java有拼接url的代碼,這很有可能是我們需要的代碼片段

在jd-gui里普泡,打開ad.java

image
image
paramAnonymousVarArgs = "cityId=" + paramString + "&bizId=" + "aider_app" + "&timestamp=" + l + "&sign=" + ad.a(paramAnonymousVarArgs);

這應該就是我們需要的代碼,可以點擊ad.a撼班,跳轉到函數內部,里面的代碼并不復雜权烧。通過閱讀代碼眯亦,可以很容易地得到生成sign的規(guī)則(MD5(城市id+"aider_app"+時間戳+"29cc0378-3802-4470-a1e2-07ce9f34b208"))。

反編譯APP獲取smali代碼

Android系統(tǒng)有自己的虛擬機Dalvik,代碼編譯最終不是采用的java的class妻率,而是使用的smali。我們反編譯得到的代碼宫静,jar的話可能很多地方無法正確的解釋出來走净,如果我們反編譯的是smali則可以正確的理解程序的意思孤里。

在抓取短時預報的請求,就出現(xiàn)了無法解釋的情況

image
image

通過搜索捌袜,最后跳轉到下圖的方法

image
image

這些看起來像偽代碼。虏等。弄唧。

我們可以利用apktool來反編譯App候引,獲取最終的smali代碼,解決無法解釋的問題

mv com.meizu.flyme.weather-2.2.1-2002001.zip com.meizu.flyme.weather-2.2.1-2002001.apk
apktool -o weather_apktool d com.meizu.flyme.weather-2.2.1-2002001.apk
image
image

切換到weather_apktool目錄敦跌,smali文件夾里就是反編譯得到的smali代碼,我們找到剛才解釋錯誤的文件

vim weather_apktool/smali/com/moji/mjweather/request/MJWeatherSDK.smali
image
image

上圖就是代碼對應的smali代碼柠傍,語法有點像匯編,這里有一篇教程(android反編譯-smali語法)携兵,可以先閱讀一遍教程,再去閱讀smali代碼

利用apktool反編譯apk來二次打包

看著smali代碼徐紧,還是有點懵逼...有沒有方法像debug一樣,可以隨時查看變量的值炭懊,一行一行地運行程序呢?

還真有N旮埂!父阻!我們可以用Android Studio來動態(tài)調試smali代碼S!履婉!

我們先用usb連接手機,開啟手機的開發(fā)者模式毁腿,然后打開Android Studio的Android Device Monitor辑奈,可以看到我們的手機已經連接上電腦了

image
image

但是我們沒有看到程序對應的進程已烤。。胯究。

經過google,原來真機上唐片,只有AndroidManifest.xml里設置有android:debuggable="true"時丙猬,ADM才會出現(xiàn)對應的進程费韭。那我們要如何添加android:debuggable="true"呢?這就涉及到了apk的二次打包星持。

我們可以修改程序的smali代碼,修改app的行為(例如去掉廣告督暂,或者游戲里面增加金幣)揪垄,然后重新打包成apk文件逻翁,安裝到我們的手機上“嘶兀看到這里,你當然會想缠诅,這樣我們不就可以隨意修改app了嗎溶浴?當然不可能這么簡單管引,一般大公司的app都會加入各種機制,來防止用戶修改app的行為褥伴,二次打包漾狼,難以重新打包成功或者運行程序時馬上崩潰。這就涉及到了如何防反編譯的話題了戏自。

我們拿之前的魅族天氣來嘗試進行二次打包,這種小的擅笔,不涉及到金錢的程序志衣,防反編譯的處理都比較弱

我們在之前apktool反編譯smali的weather_apktool里猛们,找到AndroidManifest.xml,加入

<application ....
    android:debuggable="true">...</application>
image
image

重新打包成apk后弯淘,還需要加上數字簽名,才能安裝到手機上庐橙,Android系統(tǒng)要求每一個Android應用程序必須要經過數字簽名才能夠安裝到系統(tǒng)中,也就是說如果一個Android應用程序沒有經過數字簽名态鳖,是沒有辦法安裝到系統(tǒng)中的转培!

我們使用keytool(Java數據證書的管理工具)
來生成數字簽名

keytool -genkey -keystore cmd.keystore -keyalg RSA -validity 10000 -alias cmd.keystore
image
image

給二次打包的apk加上數字簽名

jarsigner -verbose -keystore cmd.keystore -signedjar weather.apk weather.apk cmd.keystore

安裝app

adb devices
adb -s 手機編碼 install weather.apk

安裝過程中浆竭,可能會出現(xiàn)Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]的錯誤,這一般是卸載得不干凈的原因邦泄,可以執(zhí)行

adb shell pm list packages  # 列出手機安裝的所有app包名
adb uninstall 包名

然后重新安裝,安裝成功后顺囊,執(zhí)行

adb shell am start -D -n 包名/MainActivity  #(包名和MainActivity可以在AndroidManifest.xml找到)

在debug模式下啟動App肌索,成功了L靥肌!测萎!

天氣的自動定位問題
原因:重新打包后亡电,APK簽名文件的sha1與高德地圖的key對應的sha1不符合
http://lbs.amap.com/faq/top/hot-questions/249

Android Studio動態(tài)調試smali代碼

好硅瞧,我們開始動態(tài)調試smali代碼,先下載ideasmali腕唧,打開Android Studio或辖,安裝好ideasmali插件枣接,選擇Import project(Eclipse ADT, Gradle, etc.), 選擇weather_apktool文件夾,然后一路next

image
image

選著smali文件夾但惶,右鍵Mark Directory As -> Sources Root

image
image

配置遠程調試的選項耳鸯,選擇Run-->Edit Configurations:增加一個Remote調試的調試選項膀曾,端口選擇:8700

image
image

之后選擇File-->Project Structure 配置JDK

image
image

查看Android Device Monitor,查看進程的端口


image
image

以調試狀態(tài)啟動app添谊,并轉發(fā)端口


image
image

記得關閉Android Device Monitor

下好斷點之后Run-->Debug 'remote'


image
image

運行起來之后就可以單步執(zhí)行,查看寄存器的值斩狱,慢慢調試了


image
image

總結

Android的反編譯很有很多內容沒有深入了解過,為了能更好地反編譯出代碼所踊,深入了解Android系統(tǒng)是必要的泌枪,推薦一本書污筷,Android軟件安全與逆向分析,可以更加系統(tǒng)和深入的學習Android軟件的反編譯

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瓣蛀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惋增,更是在濱河造成了極大的恐慌叠殷,老刑警劉巖诈皿,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異稽亏,居然都是意外死亡,警方通過查閱死者的電腦和手機截歉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門胖腾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锨阿,你說我怎么就攤上這事〖欠#” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵桐智,是天一觀的道長。 經常有香客問我说庭,道長荐吉,這世上最難降的妖魔是什么口渔? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮缺脉,結果婚禮上痪欲,老公的妹妹穿的比我還像新娘攻礼。我一直安慰自己,他們只是感情好礁扮,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著太伊,像睡著了一般雇锡。 火紅的嫁衣襯著肌膚如雪僚焦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天芳悲,我揣著相機與錄音立肘,去河邊找鬼名扛。 笑死,一個胖子當著我的面吹牛肮韧,可吹牛的內容都是我干的融蹂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼殿较,長吁一口氣:“原來是場噩夢啊……” “哼桩蓉!你這毒婦竟也來了淋纲?” 一聲冷哼從身側響起院究,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎业汰,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體样漆,經...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡为障,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年放祟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跪妥。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖眉撵,靈堂內的尸體忽然破棺而出侦香,到底是詐尸還是另有隱情纽疟,我是刑警寧澤罐韩,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布伴逸,位于F島的核電站,受9級特大地震影響膘壶,放射性物質發(fā)生泄漏。R本人自食惡果不足惜颓芭,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一顷锰、第九天 我趴在偏房一處隱蔽的房頂上張望亡问。 院中可真熱鬧肛宋,春花似錦、人聲如沸束世。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沉帮。三九已至贫堰,卻和暖如春穆壕,著一層夾襖步出監(jiān)牢的瞬間其屏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工偎行, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留川背,地道東北人蛤袒。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像汗盘,于是被迫代替她去往敵國和親皱碘。 傳聞我的和親對象是個殘疾皇子隐孽,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容