歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 使用Socket完成進程間通信

Android 使用Socket完成進程間通信

日期:2017/3/1 9:51:38   编辑:Linux編程

近來反編譯看一些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

Copyright © Linux教程網 All Rights Reserved