【Android 逆向】Android 逆向通用工具开发 ( Android 端远程命令工具 | Android 端可执行程序的 main 函数操作 | TCP 协议服务器建立 | 接收客户端数据 )
文章目錄
- 前言
- 一、Android 端可執行程序的 main 函數操作
- 二、Android 端 TCP 協議服務器建立
- 三、Android 端接收 PC 端傳來的數據
- 四、博客資源
前言
本篇博客重點分析 Android 端 運行的遠程命令工具 remote 模塊 ;
該 Android 遠程端模塊 是 Android 平臺的可執行程序 , 使用 NDK 進行編譯的可執行程序 , 配合 PC 端的工具進行內存修改 ;
一、Android 端可執行程序的 main 函數操作
Android 端可執行程序主函數的主體就是一個死循環 , 在該循環中 , 通過 TCP 協議 , 接收來自 PC 端的指令 , 根據不同的指令 , 執行不同的操作 ;
開始執行后 , 阻塞等待 PC 端連接 , 連接成功后 , 繼續向后執行 ;
/* 等待 PC 端連接 , PC 端與 Android 端連接成功后 , 繼續向后執行 */client.WaitForServer();之后 , 還是阻塞等待 , 這次是等待 PC 端發送來的命令 ;
/* 等待 PC 端命令 */ client.WaitForCommand(root)最后 , 根據獲取的不同的命令 , 執行不同操作 , 這些操作 , 需要開發者自己進行開發 , 不同的應用 , 對應的操作也是不同的 ;
main 函數代碼 :
int main() {/* Android 端可執行程序主函數的主體就是一個死循環 , * 在該循環中 , 通過 TCP 協議 , 接收來自 PC 端的指令 , * 根據不同的指令 , 執行不同的操作*/do {Client client;char data[] = HELLO_INFO;const char* pinfo = "client prepare done! wait for pc! \n";DECRYPT(data, pinfo);printf("%s\n", data);printf("%s", pinfo);/* 等待 PC 端連接 , PC 端與 Android 端連接成功后 , 繼續向后執行 */client.WaitForServer();/* 連接成功提示 */printf("get a connection!\n");Json::Value root;do {/* 等待 PC 端命令 */if (client.WaitForCommand(root) == 0) {switch (root["cmd"].asInt()) {case CMD_READ_DATA:root.clear();client.ReadData(root);break;case CMD_WRITE_GOLD:client.WriteGold(root);break;case CMD_WRITE_EXP:client.WriteExp(root);break;default:break;}}/* 如果連接斷開 , 那么重置連接 , 繼續等待用戶連接 */else if (!client.isConnected()) {client.Reset();printf("connection is lost!\nretry!\n");break;}} while (client.isValid());} while (1);return 0; }Android 端可執行程序的 mian.c 代碼位置 :
二、Android 端 TCP 協議服務器建立
從 TCP 網絡協議角度看 , 在 Android 端運行的是 服務器端 , 在 PC 端運行的是 客戶端 ;
Android 端的服務器建立 :
- ① 先綁定服務器 IP 地址 : 端口號
- ② 監聽端口號
- ③ 阻塞等待客戶端連接
PC 端的客戶端 : 客戶端只需要連接 綁定的服務器 IP 地址 + 端口號即可 ;
服務器建立代碼 :
/* 建立服務器 * ① 先綁定服務器 IP 地址 : 端口號 * ② 監聽端口號* ③ 阻塞等待客戶端連接 * 客戶端只需要連接 綁定的服務器 IP 地址 + 端口號即可*/bool WaitForServer() {int ret = 0;struct sockaddr_in addr, client;addr.sin_family = AF_INET;addr.sin_port = 0x3725;//0x2537=9527/* 如果是 模擬器可以設置 127.0.0.1 , 如果是真機 , 需要填寫局域網內真實 IP 地址 */addr.sin_addr.s_addr = inet_addr("127.0.0.1");/* 綁定 IP 地址 和 端口號 */ret = bind(m_socket, (sockaddr*)&addr, sizeof(sockaddr_in));if (ret < 0) {printf("error info:%d %s\n", errno, strerror(errno));return false;}/* 監聽端口號 */ret = listen(m_socket, SOMAXCONN);if (ret < 0) {printf("error info:%d %s\n", errno, strerror(errno));return false;}char buffer[4096] = "";int size = sizeof(client);/* 阻塞等待客戶端連接 */int c = accept(m_socket, (sockaddr*)&client, &size);if (c == INVALID_SOCKET) {return false;}m_client = c;return ret >= 0;}三、Android 端接收 PC 端傳來的數據
調用 recv 方法 , 阻塞接收 PC 端傳輸來的數據 , 然后解析 json 字符串 , 將解析結果保存到 command 中 ;
代碼如下 :
/* 接收 PC 端傳輸來的數據 * 然后解析 json 字符串 * 將解析結果保存到 command 中*/int WaitForCommand(Json::Value& command) {char buffer[4096] = "";int ret = recv(m_client, (void*)buffer, sizeof(buffer), 0);if (ret > 0) {ret = 0;Json::Reader reader;if (reader.parse(buffer, buffer + strlen(buffer), command)) {ret = 0;}else {ret = -1;}}else {close(m_client);m_client = INVALID_SOCKET;}return ret;}四、博客資源
下載地址 : https://download.csdn.net/download/han1202012/38499199
總結
以上是生活随笔為你收集整理的【Android 逆向】Android 逆向通用工具开发 ( Android 端远程命令工具 | Android 端可执行程序的 main 函数操作 | TCP 协议服务器建立 | 接收客户端数据 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】Android
- 下一篇: 【Android 逆向】函数拦截原理 (