【理解】如何在内存中篡改数据

来源:互联网 发布:java面试速成 编辑:程序博客网 时间:2024/05/16 04:38

今天继续看《Linux程序设计第四版》,发现了一个很好玩的东西。数据如果读入内存了,怎么去修改...另外各类基本的C语言函数用法也过了一遍。

#include<unistd.h>#include<stdio.h>#include<sys/mman.h>#include<fcntl.h>#include<stdlib.h>typedef struct{int integer;char string[24];} RECORD;#define NRECORDS (100)int main(){RECORD record, *mapped;int i, f;FILE *fp;    fp = fopen("records.dat","w+");        for (i=0; i < NRECORDS;i++){        record.integer = i;        sprintf(record.string,"RECORD-%d",i);        fwrite(&record,sizeof(record),1,fp);    }    fclose(fp);    //下面被注释掉的这段是我们平时最常用的,更改某个文本文件内容的方式。一般都是定义个指针然后干活。    /*fp = fopen("records.dat","r+");    fseek(fp,43*sizeof(record),SEEK_SET);    fread(&record,sizeof(record),1,fp);        record.integer = 143;    sprintf(record.string,"RECORD-%d",record.integer);    fseek(fp,43*sizeof(record),SEEK_SET);    fwrite(&record,sizeof(record),1,fp);    fclose(fp); */    //让我开眼的内存修改法    f = open("records.dat",O_RDWR); //打开文件,这个函数在fcntl.h里面    mapped = (RECORD *)mmap(0,NRECORDS*sizeof(record),PROT_READ|PROT_WRITE,MAP_SHARED,f,0);/*records.dat被映射到了本机的某个地址空间里面,    可读可写被共享,f是文件描述符号(文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。    第一个打开的文件是0,第二个是1,依此类推。Unix 操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix 通常有一个系统级的限制。),    简单说,我理解文件描述符为系统需要执行对应命令的跟踪符号,最后的0指的是内存起始点*/    mapped[43].integer = 243; //居然自己一个个变成了数组!!这里的第四十三号位内存单元住的record被改啦    sprintf(mapped[43].string,"RECORD-%d",mapped[43].integer);    msync((void * )mapped, NRECORDS*sizeof(record),MS_ASYNC); //刷新了下内存    munmap((void * )mapped,NRECORDS*sizeof(record));//结束了这个映射,它从内存里面撤走了。    close(f);     exit(0);}
亮点自寻...


0 0