日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 逆向】代码调试器开发 ( ptrace 函数 | 读取进程内存数据 )

發布時間:2025/6/17 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 逆向】代码调试器开发 ( ptrace 函数 | 读取进程内存数据 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、讀取進程內存數據
  • 二、讀取流程
  • 三、完整代碼





一、讀取進程內存數據



使用 ptrace 函數讀取內存數據 :

ptrace(PTRACE_PEEKTEXT, m_nPid, (void*)pRemoteAddr, 0);

傳入的第一個參數可以是 PTRACE_PEEKTEXT / PTRACE_PEEKDATA / PTRACE_PEEKUSER , 這三個參數效果相同 ;

傳入的第二個參數是 進程號 PID , ptrace 函數可以同時調試多個進程 ;

傳入的第三個參數是內存地址 , void* 指針類型的 ;

傳入的第四個參數默認為 0 ;

上述讀取進程內存數據的 ptrace 方法的返回值是一個 4 字節數據 , 32 位的設備上 , 最長只能讀取 4 字節 ; 可以在 for 循環中讀取內存中的數據 ;





二、讀取流程



讀取進程內存數據時 , 每次最多只能讀取 4 字節數據 , 先根據讀取的大小 , 計算出讀取次數 ,

// 每次讀取 4 字節 , 讀取次數為 nSize / 4j = nSize / 4;

然后再計算出最后不足 4 字節的部分 ,

// 讀取最后不滿 4 個字節的數據 remain = nSize % 4;

讀取數據時 , 先循環 j 次 , 讀取 j x 4 字節數據 ,

for (i = 0; i < j; i++) {// 32 位的設備上 , 最長只能讀取 4 字節 d.val = ptrace(PTRACE_PEEKTEXT, m_nPid, (void*)pRemoteAddr, 0);// 將讀取的數據拷貝到 laddr 地址中 memcpy(laddr, d.chars, 4);pRemoteAddr += 4;laddr += 4;}

最后再讀取一次末尾不足 4 字節的數據 ;

// 讀取最后不足 4 字節的數據 if (remain > 0) {d.val = ptrace(PTRACE_PEEKTEXT, m_nPid, (void*)pRemoteAddr, 0);memcpy(laddr, d.chars, remain);}



三、完整代碼



使用 ptrace 函數讀取內存完整代碼示例 :

int CPtrace::read(char* pRemoteAddr, char* pBuf, size_t nSize) {uint32_t i = 0, j = 0, remain = 0;// 拷貝數據的目的地址 , 該指針需要不斷累加計算 , 記錄已經讀取的數據char *laddr;// 聯合體 , 在同一個內存地址上 , 既可以以 long 類型解析這塊數據 , 也可以以 char 數組類型解析這塊數據union u {long val;char chars[sizeof(long)];} d;// 每次讀取 4 字節 , 讀取次數為 nSize / 4j = nSize / 4;// 讀取最后不滿 4 個字節的數據 remain = nSize % 4;// 設置讀取數據的最終存放地址 laddr = pBuf;for (i = 0; i < j; i++) {// 32 位的設備上 , 最長只能讀取 4 字節 d.val = ptrace(PTRACE_PEEKTEXT, m_nPid, (void*)pRemoteAddr, 0);// 將讀取的數據拷貝到 laddr 地址中 memcpy(laddr, d.chars, 4);pRemoteAddr += 4;laddr += 4;}// 讀取最后不足 4 字節的數據 if (remain > 0) {d.val = ptrace(PTRACE_PEEKTEXT, m_nPid, (void*)pRemoteAddr, 0);memcpy(laddr, d.chars, remain);}return PTERR_SUCCESS; }

總結

以上是生活随笔為你收集整理的【Android 逆向】代码调试器开发 ( ptrace 函数 | 读取进程内存数据 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。