近來反編譯看一些Android應用,特別是涉及到底層的功能性的應用,比如游戲加速,修改內存,掛機腳本神馬的,發現裡面的通信機制無一例外的都是使用的socket,基本上已經成為這類應用的一種標配了。
Android 使用Socket完成進程間通信例子見下面的下載:
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2013年資料/11月/5日/Android 使用Socket完成進程間通信
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm
--------------------------------------分割線--------------------------------------
因為這類應用有以下的幾個共同點:
1 需要android 手機的root權限,畢竟要修改一些比較底層的東西,沒有root權限有時候木有辦法修改啊
2 有自己的so,同時比較重要的或者比較吃力的活都編譯成一個可執行的elf文件,然後讓apk應用給這個elf文件給啟動起來。關於這個elf文件放置的位置也有幾種選擇。
情況1:直接放在應用包下面的lib目錄下,然後給這個可執行文件賦予一個可執行的權限。
情況2:放在assets文件夾下面,在程序啟動的時候拷貝到files文件夾下面,賦予可執行的權限後,然後執行
情況3:也是放在assets文件夾下面,只不過安全性高一點,一般會做一個簡單的異或或者移位加密,然後修改以下擴展名,拷貝過去的時候減密一下。再執行,有時候執行了以後會把真正的elf文件再給刪除了。
3 可執行的so文件和java應用程序之間的通信使用socket,因為畢竟可執行的so才是真正干活的主力,而java應用程序要給so發送指令,而so也要給java應用程序反饋一些有用的數據供上層顯示給用戶。關於socket通信的方式也有下面的幾種情況
情況1: 可執行的so作為server端,java應用程序給其發送指令的時候主動去鏈接可執行so,發送數據,有時候so也會返回一些數據,一般這種情況so就直接把活給干了,比如游戲加減速。
情況2:可執行的so文件作為客戶端,同時使用長鏈接的方式,這種情況就需要java應用程序作為server端了,這裡的稍微巧妙一點的是不采用固定的socket的端口號,而是java應用程序在創建socket的時候使用系統自動分配的端口號。不過需要通過java應用程序在啟動可執行so的時候將端口號傳遞給so文件。
原理基本上就這麼多了,下面的是一個例子,這個例子涉及到的編程技術主要是java應用程序自己創建socket的客戶端和服務器端,然後進行通信,同時也啟動了一個so的可執行文件,通過進程之間的數據流,向可執行的so發送數據,可執行的so將接收到的數據通過log給打印出來。
進入demo例子,
點擊啟動 socket server
這個時候log會打印出來
11-04 15:56:28.341:V/cheatecore-server(5774): server port = 44034
這樣的數據,
由於serverSocket = new ServerSocket(m_port);
其中 m_port 為0,所以端口號是系統臨時分配的。
然後socketserver 就開始等待有客戶端的socket 來鏈接
m_socket = serverSocket.accept();
其中 accept 是阻塞函數,會將這個線程阻塞掉的。這個時候
通過 adb shell 進入android手機,使用 netstat –an | busybox grep 44034 查看,發現是這樣的現象
顯然這個端口是 listen 狀態
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2013-11/92347p2.htm