Android安全講座第九層(二) 記憶體dump

來源:互聯網
上載者:User

標籤:android

      近來android上越來越多的應用對自身的保護機制加強了重視,主要表現在幾個方面。


      1 dex加殼

      2 so加殼

      3 dex藏在so中,在適當的時候釋放。


      這是技術上一個進步,並且還有一些專業的公司提供了整個安全的解決方案,比如防ptrace,或者加密dex檔案等。但是不管如何,在技術層面,cpu要啟動並執行指令還必須是cpu能夠支援的,除非不考慮效率利用複雜的動態記憶體機制來保護代碼,一般情況下,載入記憶體的so或者dex等檔案還都是原生態的cpu可以執行的指令集。


      因為有時候駭客要破解你精心涉及的演算法是一件很麻煩的事情,他要求一條一條的看枯燥的彙編代碼,不是達不到,而是效率特別低。所以這個時候記憶體dump卻是駭客們經常採用的一種手段了。

   

      linux下的記憶體dump離不開 ptrace,所以有些安全方案直接防止別的進程對其ptrace,主要手段就是ptrace住自己。即便如此,依然有孜孜不倦的駭客成功繞開了防止ptrace的保護機制,關於這方面的事情,我以後有時間在專門寫一篇文章分享。今天只講如何記憶體dump,記憶體dump需要的ptrace目標進程。


      為了方便我個人的使用,我編寫了一個memdump工具,這是一個elf的可執行檔,在android系統下adb shell進去以後直接可以執行。首先說一下這個工具的用法。


[email protected]:/ # memdumpusage: memdump pid start_addr end_addr filaname255|[email protected]:/ #


用法十分簡單,將memdump通過 adb push拷貝到你的手機裡面,我是放在了/system/bin 下面了,這樣我不用每次找路徑,直接運行命令即可。

然後後面需要有4個參數


pid                     要dump目標進程的進程號start_addr         要dump目標進程資料的虛擬起始地址end_addr           要dump目標進程資料的虛擬結束位址filename            dump出來的資料要儲存的檔案名稱(要求有路徑)


ok 介紹完了命令使用方法,下一步就具體操作一下如何使用的。


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/26/EE/wKiom1NvM3DQMHvpAARWmCgkncg722.jpg" title="Screenshot from 2014-05-11 16:18:52.png" alt="wKiom1NvM3DQMHvpAARWmCgkncg722.jpg" />



中我自己編寫了一個 包名為 com.example.socketcomm 的apk應用,裡面載入了一個 libsocketback.so的庫,開啟以後其進程號為 11164 ,通過查看其maps資訊,發現其可執行檔

程式碼片段在

56d34000-56d37000 r-xp 00000000 103:04 579426   /data/data/com.example.socketcomm/lib/libsocketback.so


這三個物理頁面上


由於物理頁面是以0x1000對其,我不知道這個so具體的大小,但是沒有關係,先將其全部dump出來

再做處理。


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/26/EE/wKiom1NvNXyS4km_AAUhNLE3rzM887.jpg" title="Screenshot from 2014-05-11 16:27:49.png" alt="wKiom1NvNXyS4km_AAUhNLE3rzM887.jpg" />



如,

memdump 11164 0x56d34000 0x56d37000 /sdcard/dump.so

通過這個命令將libsocketback.so  dump到了 /sdcard/dump.so

然後退出adb cmdline 以後,通過 adb pull 將 /sdcard/dump.so 拉到linux host機器上

再使用 readelf -h dump.so 查看 elf檔案頭部,果然是

Type:                              DYN (Shared object file)

這個共用對象。


仔細的同學會看到

readelf: Error: Unable to read in 0x370 bytes of section headers

這條錯誤,產生的原因是 linux在載入so的時候是按照程式視圖的方式載入的,主要關心的是

Start of program headers:          52 (bytes into file)

這個開始的頭部資訊,對於連結方式的視圖的 段名等資料並不敏感,所以直接從記憶體dump出來的資料,是沒有 .symstrtab   .symtab  .strtab 這些段的,所以解析錯誤也很正常。一般常用的修補so的方法是拿到原來的so,這個你只要有這個應用就應該能拿到,然後根據elf檔案頭部,找到


Start of section headers:          12600 (bytes into file)

段表在檔案中的位移地址,拼接一下檔案即可,這個程式的編寫需要對elf檔案有一定的瞭解,回頭我會根據自己的研究和學習補充一些elf格式相關的博文。


從本質來看,基本上這個時候的so中的指令都應該是符合商務邏輯的指令了,dex檔案的提取同理,這個時候大家可以通過ida工具對其進行靜態分析。


附件為:memdump工具,我壓縮了一下,解壓即可,關於原始碼,誰有需要在下面留個郵箱,我發過去即可。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.