android動態逆向
① Android逆向之手機環境配置
該篇文章主要介紹在Android逆向開始之前的 手機環境配置 。其中包括對手機進行 刷機 (根據所需的Android手機型號、Android系統版本進行刷機。這里我以nexus 5 android 6.0.1為例,其他Google系手機型號及刷其他Android版本系統都是類似的);第二個則是安裝Android逆向分析 hook框架山啟卜 (Xposed、frida)及一些常用的基礎插件等。
一、刷機前准備
二、開始對nexus 5刷機(Android 6.0.1)
需要使用低版本的platform-tools進行替代,具體的操作步驟,可以參考以下文章
https://www.jianshu.com/p/d40db7e08e3e
三、刷入第三方recovery(TWRP)到新系統中
四、對剛刷完的Android系統進行root
五、安裝Xposed框架、frida-server 及Android逆向分析中常見的插件
綜上所述,該篇文章主要是使用Android官方的系統鏡像進行刷機,然後安裝旁如配置Android逆向所需的框架及插件。在刷機的時候,我逗穗們也可以選擇自己修改編譯Android系統源碼,再進行刷機,定製我們自己所需的分析環境。
更多精彩內容,請掃碼關注以下公眾號
② Android逆向工程師是做什麼的
必須掌握的技能
1、負責安卓程序的加解密和數據傳輸分析、拆解、逆向等工作;
2 、逆向APK,了解運行過程;
3 、Andorid本地提權獲得root許可權;
4 、熟練掌握軟體逆向靜態分析、動態調試、代碼跟蹤等;
5 、熟悉Android開發,了解打包、反編譯、破解流程;
6 、so破解。
目前了解的如下:
1,加解密:這就很多了,一般都是遇到後再折騰解密,而且解密代碼和秘鑰一般都在代碼裡面。
2,Andorid本地提權獲得root許可權,一般真機是用recovery刷機包,但是病毒提權是怎麼樣的
目前掌握的一種提權的是像輸入命令行一樣輸入su並且用pm提權
還有一種是修改init.rc文件
3,ida動態調式和代碼跟蹤
4,打包,編譯和破解的流程是什麼樣的?
5,so破解:一般就是破殼。各種殼(360,娜迦等等)
加殼的另一種常用的方式是在二進制的程序中植入一段代碼,在運行的時候優先取得程序的控制權,做一些額外的工作。大多數病毒就是基於此原理。加殼的程序經常想盡辦法阻止外部程序或軟體對加殼程序的反匯編分析或者動態分析,以達到它不可告人的目的。這種技術也常用來保護軟體版權,防止被軟體破解。
6,了解反破解的技術
目前掌握的技術有:
1,反模擬器
2,反靜態代碼分析器如:反jeb
應該也是有很多反ida的,也就是加殼。
任職要求
1、具有豐富的Android開發分析經驗,熟悉android系統架構,熟悉android安全機制;
2、精通匯編語言、java、C/C++語言,熟悉Smali語言,對逆向工程有濃厚興趣;
3、熟練掌握ida、gdb逆向分析工具;
4、熟練掌握軟體逆向靜態分析、動態調試、代碼跟蹤等;
5、熟悉so和Java層hook;
6、熟悉Android開發,了解打包、反編譯、破解流程;
7、深入理解arm Linux和Android底層運行機制;
8、熟練掌握各種調試工具:Smali、Dedexer、Dexmp、Apktool、Dex2jar、jd-gui。
③ 什麼叫android 逆向開發
就是ANDROID程序的目標代碼反向到JAVA源程序,不是反匯編,是返JAVA。
一般WINDOWS下.exe只能反匯編。但JAVA是解釋執行,偽編譯生成的是中間
機器碼,可以逆向到源程序,但沒有了注釋。
④ 瀹夊崜閫嗗悜鏄浠涔
瀹夊崜鏄涓縐嶅熀浜嶭inux鐨勮嚜鐢卞強寮鏀炬簮浠g爜鐨勬搷浣滅郴緇燂紝涓昏佷嬌鐢ㄤ簬縐誨姩璁懼囷紝濡傛櫤鑳芥墜鏈哄拰騫蟲澘鐢佃剳錛岀敱Google鍏鍙稿拰寮鏀炬墜鏈鴻仈鐩熼嗗煎強寮鍙戙傚畨鍗撻嗗悜灝辨槸灝嗗畨瑁呭寘apk鏂囦歡榪樺師鎴愭墦鍖呭墠鐨勬牱瀛愩傞嗗悜鍒嗘瀽鏄涓闂ㄦ妧鏈錛屼篃鏄涓闂ㄨ壓鏈銆
鍒嗙被錛
1銆佸簲鐢ㄥ眰APK閫嗗悜銆
2銆佸畨鍗撹懼囨嗘灦閫嗗悜銆
3銆佸唴鏍擱┍鍔ㄩ嗗悜銆
4銆佸熀浜庡畨鍗撶殑紜浠朵駭鍝侀嗗悜銆
⑤ Android軟體安全與逆向分析的Android術語
逆向分析是一種逆向工程技術,是一種產品設計技術再現過程,即對一項目標產品進行逆向分析及研究,從而演繹並得出該產品的處理流程、組織結構、功能特性及技術規格等設計要素,以製作出功能相近,但又不完全一樣的產品。逆向工程源於商業及軍事領域中的硬體分析。其主要目的是在不能輕易獲得必要的生產信息的情況下,直接從成品分析,推導出產品的設計原理 。Android 軟體安全與逆向分析是針對Android 軟體的逆向分析,對原有APK文件進行反向研究,包括對語法,代碼等進行分析,破解原有APK的源代碼,資源文件比如圖片,音頻等等行為。
1.APK一旦被破解,反編譯之後的源碼就被破解者獲取,開發者的勞動成果就被竊取,危害了開發者的利益。
2.反編譯的APK如果被進行二次打包,那麼APP就成為盜版產品,盜版產品侵害開發者的版權
3.反編譯的產品有可能被破解者進行二次打包,注入惡意代碼,竊取用戶隱私,惡意扣除用戶手機流量和資費,獲取用戶數據等等,這些行為嚴重傷害用戶的利益。
4.盜版產品不受保護,用戶得不到合理的售後支持和服務。
在這種情況下就需要加強對安卓APK DEX文件進行保護的技術,防止反編譯。dex文件其實就是Android系統中可以在Dalvik虛擬機上直接運行的文件格式。Java源碼通過ADT編譯成Smali語言這是一個優化的過程,相對於.class文件它體積小、運行效率高、被編譯後可讀性低;Smali再到class. DEX本身就是一個加殼保護的過程。 DEX文件如果未做好保護,黑客通過反編譯可讓源碼完全暴露,可利用閱讀源碼來找到App的設計流程,通過對程序流程的了解將很容易對程序進行盜版、惡意篡改、惡意代碼注入等危險行為 。
1.隔離Jave程序。這種是最根本的保護,將一些關鍵的Class文件進行加密,例如對注冊碼、序列號管理相關的類進行加密,開發人員可以將關鍵的JavaClass放在伺服器端,用戶通過伺服器介面獲取服務而不是直接通過java文件。破解者就無法獲取class文件了。目前有很多通過介面提供服務的標准和協議,比如HTTP,webservice,RPC等等。但是呢,這種方式並不是適合所有的APP,比如單機運行的程序的無法隔離Java程序。
2.對class文件進行加密保護。開發者可以將一些關鍵的class文件進行加密,比如對注冊碼,序列號管理相關的類進行加密來防止反編譯。在使用這些被加密的類之前,程序需要首先對這些類進行解密,然後才能將這些類載入在JVM中。要解密這些類,必須要通過一些硬體或是軟體才能完成。
3.轉換成本地代碼
這是一種防止反編譯的比較有效的方法。因為本地代碼往往難以被反編譯。開發人員可以選擇將整個應用程序轉換成本地代碼,或者可以選擇關鍵模塊轉換。如果僅僅轉換關鍵部分模塊,Java程序在使用這些模塊時,需要使用JNI技術進行調用。當然,在使用這種技術保護Java程序的同時,也犧牲了Java的跨平台特性。對於不同的平台,我們需要維護不同版本的本地代碼,這將加重軟體支持和維護的工作。不過對於一些關鍵的模塊,有時這種方案往往是必要的。為了保證這些本地代碼不被修改和替代,通常需要對這些代碼進行數字簽名。在使用這些本地代碼之前,往往需要對這些本地代碼進行認證,確保這些代碼沒有被黑客更改。如果簽名檢查通過,則調用相關JNI方法.
4.代碼混淆
代碼混淆是對Class文件進行重新組織和處理,使得處理後的代碼與處理前代碼完成相同的功能(語義)。但是混淆後的代碼很難被反編譯,即反編譯後得出的代碼是非常難懂、晦澀的,因此反編譯人員很難得出程序的真正語義。從理論上來說,黑客如果有足夠的時間,被混淆的代碼仍然可能被破解,甚至目前有些人正在研製反混淆的工具。但是從實際情況來看,由於混淆技術的多元化發展,混淆理論的成熟,經過混淆的Java代碼還是能夠很好地防止反編譯。下面我們會詳細介紹混淆技術,因為混淆是一種保護Java程序的重要技術 。
5.第三方工具加密
上面四種方式可能要耗費開發者很大一部分精力和時間,如果想要方便的話,可以尋求第三方的加密工具。目前市場上有一些工具是可以幫助APK加密的,比較知名的是愛加密的加密平台。相對於上面四種方式,這種第三方的加密工具要更全面和專業,可以有效的保護dex文件,so庫文件,xml主配文件以及其他資源文件不被反編譯和惡意篡改。
愛加密專家提醒,這些方式並不是獨立運用的,有時候可以混合使用,根據自己的情況來定,比如說高級混淆之後還是可以使用第三方的愛加密工具進行高級保護,多一重安全。
⑥ Android逆向 ida動態調試問題
先輸入」adb shell」,然後輸入」su root」獲取root許可權。
接著輸入」 chmod 777 /data/local/tmp/android_server」 給android_server加上相應的許可權。
接著輸入」 /data/local/tmp/android_server」啟動android_server。
如下圖所示:
輸入」adb forward tcp:23946 tcp:23946」進行tcp埠轉發
命令,啟動所要調試的Activity。
app會彈出」Waitting for debugger」對話框,如下圖所示:
點擊」Debug options」按鈕,在」Suspend on process entry point」, 」Suspend on thread start/exit」, 」Suspend on library load/unload」 等選項的前面打上勾,如下圖所示:
點擊」ok」後會在以下對話框的hostname中填上」localhost」
在彈出和物的」Choose process to attach to」窗口中找到」com.example.testjniso」進程,選中該進程,然後點擊」ok」按鈕。
其中可以看到com.example.testjniso進程的埠為8700。
如下圖所示:
在ida彈出的」Add map」窗口中,一律點擊」Cancle」按鈕。
點擊ida中的暫停調試按鈕,暫停當前的調試,如下圖所示:
右擊libTestJniSo.so文件,在彈出的隱告框中點擊」Jump to mole base」,跳轉到libTestJniSo.so文件的起始地址。
按下Alt+T,彈出查找對話框中輸入」 Java_com_example_testjniso_MainActivity_helloFromJni」 如下圖所示:
點擊」ok」按鈕後,即可跳轉到 Java_com_example_testjniso_MainActivity_helloFromJni 函數所在的起始地址。
然後在地址處下斷點喚攜液:
再按F9重新開始調試,點擊app中的」點擊載入so文件」按鈕重新載入libTestJniSo.so,即可看到程序成功地停在了斷點處:
到此處就可以正常地調試so文件了。
Linker是什麼?
Linker就是/system/lib/linker,它是進程啟動時第一個載入的模塊,它負責管理elf可執行文件以及各個so文件的載入執行,還參與了調試的一些東西。通俗地說,它是一個elf文件的解釋器。它可以載入elf可執行文件及so動態庫。
在android 5.0下,不能執行android_server是因為android5.0自帶的linker不支持載入非pie的elf文件,但如果自己實現一個可以載入pie的linker,不就可以解決這個問題了嗎?對的,就是醬紫,補上自己的自定義linker在附件.
https://bbs.pediy.com/thread-206084.htm