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

今天继续看《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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

取啥都被占用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值