1. 程式人生 > >使用/proc/${pid}/mem訪問其他程序的記憶體變數

使用/proc/${pid}/mem訪問其他程序的記憶體變數

在Linux/Unix中記憶體採用保護模式,每個程序都有獨立的記憶體地址。可以訪問/proc/${pid}/maps看到。

一、程序的記憶體結構認識:

[[email protected] 28515]# pwd

/proc/28515

[[email protected] 28515]# cat maps

003ee000-00407000 r-xp 00000000 fd:00 2197065    /lib/ld-2.5.so

00407000-00408000 r--p 00019000 fd:00 2197065    /lib/ld-2.5.so

00408000-00409000 rw-p 0001a000 fd:00 2197065    /lib/ld-2.5.so

00410000-0054d000 r-xp 00000000 fd:00 2197101    /lib/i686/nosegneg/libc-2.5.so

0054d000-0054f000 r--p 0013d000 fd:00 2197101    /lib/i686/nosegneg/libc-2.5.so

0054f000-00550000 rw-p 0013f000 fd:00 2197101    /lib/i686/nosegneg/libc-2.5.so

00550000-00553000 rw-p 00550000 00:00 0 

00b0d000-00b0e000 r-xp 00b0d000 00:00 0          [vdso]

08048000-08049000 r-xp 00000000 fd:00 2621911    /home/louis/elf/proc_mem/main

08049000-0804a000 rw-p 00000000 fd:00 2621911    /home/louis/elf/proc_mem/main

08c6a000-08c8c000 rw-p 08c6a000 00:00 0 

b7fc7000-b7fc8000 rw-p b7fc7000 00:00 0 

b7fde000-b7fdf000 rw-p b7fde000 00:00 0 

b7fdf000-b7fe0000 rw-s 00000000 00:08 58445      /dev/zero (deleted)

b7fe0000-b7fe1000 rw-p b7fe0000 00:00 0 

bff35000-bff4b000 rw-p bff35000 00:00 0          [stack]

其中b7fdf000-b7fe000記憶體段是使用mmap開閉的共享記憶體。貌似對應一個/dev/zero檔案。

每個程序的程式碼段記憶體都在b7fdf000-b7fe000位置。

二、訪問其他程序的結構。

如果想使用其他程序的記憶體結構有幾個問題注意。

  1.使用ptrace開啟程序記憶體跟蹤。


  2.貌似定位的時候不能使用lseek,而是使用lseek64定位函式。由於pread是lseek與read的結合,所以也不能讀取,總報非法引數錯誤。
  3.我在寫程式碼的時候,發現宣告為保護的記憶體區域也可以訪問。
   第一個程式,建立各種記憶體變數。第二個程式直接訪問。
=========================================================
#include<stdio.h>
#include<unistd.h>
#include<sys/mman.h>
#include<stdlib.h>
/*這些變數被access_mem.c程式訪問*/
int var1=10;
static int var2=20;
int main(int argc,char **argv)
{
int var3=30;
static int var4=40;
int *var5=malloc(sizeof(int));
*var5=50;
int *var6=sbrk(0);
brk(var6+1);
*var6=60;
int *var7=mmap(0,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,0,0);
*var7=70;
printf("程序 ID:%d\n",getpid());
printf("var1:%p\n",&var1);
printf("var2:%p\n",&var2);
printf("var3:%p\n",&var3);
printf("var4:%p\n",&var4);
printf("var5:%p\n",var5);
printf("var6:%p\n",var6);
printf("var7:%p\n",var7);
while(1);
return 0;
 }
=========================================================
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/mman.h>
#include<fcntl.h>
#include<string.h>
#include<sys/ptrace.h>
/*該程式直接訪問accessed_mem.c程式的記憶體空間*/
int main(int argc,char **argv)
{
/*
char buf[200];
bzero(buf,200);
sprintf(buf,"/proc/%d/mem",getpid());
int fd=open(buf,O_RDONLY);
ptrace(PTRACE_ATTACH,28515,0,0);/*跟蹤某程序的記憶體*/
int var1=0;
off_t r=lseek64(fd,0x80497e4,SEEK_SET);/*其中的定位使用64位定位方式,才能讀取*/
if(r==-1)printf("lseek error:%m\n");
printf("位置:%x\n",r);
ssize_t size=read(fd, &var1, sizeof(int));
if(size==-1) printf("read error:%m\n");
printf("var1的值:%d\n",var1);
close(fd);
return 0;
 }
=========================================================
在讀取本程序程式碼段資料的時候,使用pread讀取和使用lseek都沒有問題。讀取其他程序就有問題。

相關推薦

使用/proc/${pid}/mem訪問其他程序記憶體變數

在Linux/Unix中記憶體採用保護模式,每個程序都有獨立的記憶體地址。可以訪問/proc/${pid}/maps看到。 一、程序的記憶體結構認識: [[email protected] 28515]# pwd /proc/28515 [[ema

[原始碼和文件分享]根據程序PID讀寫指定程序記憶體資料

背景 如果對外掛有了解的同學,應該知道,修改程序記憶體應該是外掛入門學習的必修技術點。當然,不單單是外掛程式會修改程序記憶體資料,還有很多安全類軟體也都會有修改程序記憶體資料的功能,方便分析人員進行分析。 而且,Windows也提供了相應的程序記憶體讀寫的API函式 ReadProcessM

在shell中獲取其他程序pid

今天接到一個小任務,寫一個指令碼,來檢測linux系統中某個程序的的狀態。那麼,首先要獲取該程序的pid, 折騰了一下,發現可以通過 命令 ps |grep 來獲取 具體程式碼如下: #!/bin/

linux中共享記憶體使用過程中奇怪的問題:shmctl刪除後其他程序不能再連線該共享記憶體

我初始化完共享記憶體後,馬上使用 shmctl(shm_id, IPC_RMID, NULL)刪除共享,這樣其他程序都使用shmdt系統就自動刪除該共享記憶體了。誰知道這樣以來其他的程序怎麼也連線不上該共享記憶體。只好把shmctl去掉,其他程序馬上就可以連線上了。 =

php異步執行其他程序

user ajax linux pen ignore curl 設置 缺失 開啟 這裏的“其他程序”,可能是linux命令,可能是其他的php文件。 網上說法有四種。分別為: 1、通過加載頁面的時候通過ajax技術異步請求服務器 2、通過popen()函數 3、通過curl

訪問其他電腦的所有文件

人的 使用 host文件 bio dia 分享 pes 內部 查看 作者:韓夢飛沙 Author:han_meng_fei_sha 郵箱:[email protected]/* */ E-mail: 313134555 @qq.com 遠程訪問其他

Linux應用程序調用其他程序執行

pan 保存 執行 log spa blog 作用 csharp span 一、system 1、作用 在Linux應用程序中調用另一個程序; 2、用法 system("/sbin/ifconfig"); 二、popen 1、作用 調用另一個程序執行,同時保存執行的結果

域名直接訪問應用程序-不加端口號&不加路徑名

默認 inux tcp 映射 root 端口號 重新啟動 端口 路徑 當訪問域名的時候,端口默認指定的是80; 而80端口在Linux系統下,1024之前的端口是只有root用戶才能使用的, 因此將,系統層面將端口80 映射到8080, iptables -t nat

Linux 根據PID找到相應應用程序的運行目錄

12px pid tro 應用程序 exe ont span server 運行程序 1.找到運行程序的PID # ps aux | grep redis root 1210 0.0 0.0 103336 900 pts/0 S+ 09:32

(4.18)SQL server 2008一些常見配置之二(鏈接服務器配置,訪問其他數據庫)

修改 beta pro ntp 查看版本 collation chang 手工 lin SQL server 2008一些常見配置之二(鏈接服務器配置,訪問其他數據庫) 一、訪問Oracle數據庫 Oracle是目前排名第一的數據庫,一般對數據安全和

vue訪問介面定義全域性變數

1.在config裡面找到dev.env.js以及prod.env.js兩個檔案,分別寫上定義的常量以及埠號,注意單引號雙引號 2. 在ajax的時候直接寫     `${process.env.URL_PATH}/app/appLogin`&

控制其他程序上的控制元件

C#呼叫其他程式,比如控制別的程式上的按鈕 //步驟1: {------------------------------------------------------------------------------- 過程名: EnumChildWndProc 過程描述: 通

ABAP 如何暫停其他程序的處理 加速當前程式的處理速度

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux程序地址空間 程序記憶體佈局

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux程序地址空間 && 程序記憶體佈局

轉載自:https://blog.csdn.net/yusiguyuan/article/details/45155035   一 程序空間分佈概述       對於一個程序,其空間分佈如下圖所示:      

Linux效能優化 第五章 效能工具:特定程序記憶體

5.1 Linux記憶體子系統        在診斷記憶體效能問題的時候,也許有必要觀察應用程式在記憶體子系統的不同層次上是怎樣執行的。在頂層,作業系統決定如何利用交換記憶體和實體記憶體。它決定應用程式的哪一塊地址空間將被放到實體記憶體中

當頁面關閉或者訪問其他路徑的時候執行ajax操作

說明:window.onbeforeunload = function(event) { };是主要函式,所有要關閉後執行的方法需要放在裡面操作。 例子解釋:用getElementById方法去取得需要傳遞的引數,放到url中請求後臺Java的介面,執行相關的操作,我的例子的操作是當頁

Spring(21) 獲取其他類成員變數的值

可以在配置檔案中通過將class指定為PropertyPathFactory,然後就可以通過指定targetClass配合targetField來將別人的成員變數拿過來用啦~~ <?xml version="1.0" encoding="GBK"?> <beans xmlns

Linux中程序記憶體結構

組成(由上至下,由高地址到低地址) 對映到虛擬記憶體的Kcrnel核心:無法被程式訪問 命令列引數和環境變數 棧(使用者棧):由上至下伸長,棧幀包括函式實參和區域性變數(自動變數)和函式的呼叫連結資訊

在windows下python指令碼訪問Oracle資料庫環境變數配置常見報錯與解決方法集合

4. ImportError: No module named luhn:下載地址 https://pypi.org/project/luhn/#files,下載後的包直接解壓到 ~:\Python27\Lib\site-packages下。或者直接cmd命令列直