編輯:Android資訊
xposed,主頁:http://repo.xposed.info/module/de.robv.android.xposed.installer
是個開源的框架,在github上有源碼的,直接下載apk後安裝激活就可以使用,很多地方有這方面的教程,針對不同的手機架構,有大牛做了針對性的修改。可以在論壇中進行搜索
通過替換/system/bin/app_process程序控制zygote進程,使得app_process在啟動過程中會加載XposedBridge.jar這個jar包,從而完成對Zygote進程及其創建的Dalvik虛擬機的劫持。
Xposed在開機的時候完成對所有的Hook Function的劫持,在原Function執行的前後加上自定義代碼。
很多人將這個框架用在對android的私有化定制上面,其實在android安全測試方面這個框架提供了很大的便利,xposed主要是對方法的hook,在以往的重打包技術中,需要對smali代碼的進行修改,修改起來比較麻煩。
利用xposed框架可以很容易的獲取到android應用中的信息,比如加密私鑰、salt值等等,不需要飯編譯獲取密鑰轉換算法、不需要了解密鑰保存機制,直接hook函數,獲取輸入輸出就可以。
在Android系統中,應用程序進程都是由Zygote進程孵化出來的,而Zygote進程是由Init進程啟動的。Zygote進程在啟動時會創建一個Dalvik虛擬機實例,每當它孵化一個新的應用程序進程時,都會將這個Dalvik虛擬機實例復制到新的應用程序進程裡面去,從而使得每一個應用程序進程都有一個獨立的Dalvik虛擬機實例。這也是Xposed選擇替換app_process的原因。
Zygote進程在啟動的過程中,除了會創建一個Dalvik虛擬機實例之外,還會將Java運行時庫加載到進程中來,以及注冊一些Android核心類的JNI方法來前面創建的Dalvik虛擬機實例中去。注意,一個應用程序進程被Zygote進程孵化出來的時候,不僅會獲得Zygote進程中的Dalvik虛擬機實例拷貝,還會與Zygote一起共享Java運行時庫。這也就是可以將XposedBridge這個jar包加載到每一個Android應用程序中的原因。XposedBridge有一個私有的Native(JNI)方法hookMethodNative,這個方法也在app_process中使用。這個函數提供一個方法對象利用Java的Reflection機制來對內置方法覆寫。有能力的可以針對xposed的源碼進行分析,不得不說,作者對於android的機制和java的了解已經相當深入了。
很簡單的一個android登入代碼:
很簡單的就是判斷下用戶輸入的用戶名和密碼是正確,這裡做個簡單的演示,將用戶輸入的用戶名和密碼信息hook出來不管正確與否
簡單說下xposed模塊的開發,首先需要的是導入api,具體的可以參考:https://github.com/rovo89/XposedBridge/wiki/Using-the-Xposed-Framework-API
在manifest中定義
聲明這個是xposed模塊,名稱為hook test 並且使用api版本號是82
下面創建運行時候的hook代碼:
看代碼中的注釋,主要是三個方法的調用,handleLoadPackage,主要是獲取到android包的相關信息,這裡由於只是對logintest進行hook,做下簡單的判斷。
findAndHookMethod 是主要的hook入口,裡面幾個參數分別為包名,classloader,hook的函數名,參數類型(這個比較容易出錯,比如list類型寫為List.class),回調函數
回調函數中比較重要的:beforeHookedMethod和afterHookedMethod,一個是在函數運行前劫持掉,一個是hook後放行,實例中對用戶輸入的字段進行劫持打印,後面將參數之改為正確登入用戶名和密碼,這樣在app中輸入任何字符都能登入成功
Frida是一款基於python + javascript 的hook框架,通殺android\ios\linux\win\osx等各平台,由於是基於腳本的交互,因此相比xposed和substrace cydia更加便捷,本文重點介紹Frida在android下面的使用。
Frida的官網為:http://www.frida.re/
安裝Frida非常簡單,在pc端直接執行
pip install frida
即可
在Android設備需要導入frida的服務端,需要root你的手機
設備上運行frida-server:
電腦上運行adb forward tcp轉發:
27042端口用於與frida-server通信,之後的每個端口對應每個注入的進程。
運行如下命令驗證是否成功安裝:
$ frida-ps-R
正常情況應該輸出進程列表如下:
hook的主要模塊是js編寫的,利用javascript的api與server進行通信
下面結合一個真實例子進行簡單的介紹,首先是測試代碼:
對於上面的js代碼,其實就是調用app中的某個函數,比如sign值生成函數,加密解密函數,不需要自己單獨的去分析算法流程,分析key值在哪,直接調用app的相應函數,讓app幫我們完成這些工作。
這裡我們分析的app是友寶,這是一款飲料售貨機,當時抓包看到提貨的時候是只有個訂單id的,猜想是不是遍歷訂單的id,支付成功但是沒有取貨的訂單會不會響應請求,自己掉貨出來。
下面對友寶的訂單進行分析過程
1.抓取支付訂單成功鏈接
分析:
sign是校驗值,主要是防止訂單偽造的,orderid是產生的支付訂單id,這個主要是防止偽造用
2.反編譯友寶app
找到morder/shipping所在的包為:com/ub/main/d/e.class
其中localStringBuffer存儲的就是url中的參數信息,該請求查找到的代碼在a()
生成簽名的函數在com/ub/main/d/e.class中的b函數
最後加上sign值,發送請求
3.可以反編譯出他的sign計算方法,也可以直接調用b函數來產生sign值,後來發現app會自動取時間戳,我們就不需要給他array型的參數
直接調用a函數,把orderId給他,讓他直接return一個值出來就好了,就有了上面的js代碼
4. 自動化的批量處理
看代碼
構造了一個類,後面直接fuzz uid就可以了,提取裡面的sign值拼接到post數據中去。
可以產生的post請求和抓到的數據包的請求是完全一樣的,但是並沒有測試成功,分析原因有可能是訂單id和用戶的id有所綁定。
不過學習到了怎樣通過frida對app進行分析。
如果遇到函數的參數類型是數組、map、ArrayList類型的,首先目標MyClass類的fun1函數,聲明如下:
解決方法:
用Xposed自身提供的XposedHelpers的findClass方法加載每一個類,然後再將得到的類傳遞給hook函數作參數!
具體實現可參考鏈接,大牛講的很清楚。
https://xianzhi.aliyun.com/forum/read/611.html
http://www.freebuf.com/articles/terminal/56453.html
http://bbs.pediy.com/showthread.php?t=202147&page=2
在日常的開發中,尤其是app開發,因為不像web端那樣 出錯以後可以熱更新,所以app開發 一般對軟件質量有更高的要求(你可以想一下 一個發出去的版本如果有重大缺
我們先假設一個場景需求:剛有孩子的爸爸媽媽對用照片、視頻記錄寶寶成長有強烈的意願,但苦於目前沒有一款專門的手機APP做這件事。A公司洞察到市場需求,要求開發團隊盡
Android Transition框架允許我們對應用程序用戶界面當中的各類外觀變化加以配置。大家可以在應用程序屏幕內實現動畫式過渡、將每個階段定義為一種場景並控
AutoCompleteTextView的功能類似於百度或者Google在搜索欄輸入信息的時候,彈出的與輸入信息接近的提示信息。當然這裡要要用到一些適配器 在An