【理解】如何在内存中篡改数据
来源:互联网 发布: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
- 【理解】如何在内存中篡改数据
- gzip压缩的数据如何在内存中解压
- 如何在内存中申请大量内存
- 对象如何在内存中分配
- 如何在内存中创建Solid
- 如何在内存中画出一张图片
- 如何在内存中自定义表用于添加和删除数据
- 程序中的变量是如何在内存中分布
- 进程是如何在内存中分布的
- [OpenCV Qt教程] 如何在内存中压缩图像
- Swift服务器入门+ReactJS代码示范:如何在内存中建立高性能索引
- 站长如何在世界杯中变成黑马?
- 关于浮点数的小数部分的二进制表示、精度以及浮点数如何在内存中存放问题
- 如何在内存分配序号处设置断点?
- 如何在内存中区别类和对象
- 如何在前台脚本中调用服务器提供的webservice
- 如何在后台代码中执行原生sql?
- 如何在前台给asp.net中label赋值
- 《STL源码剖析》空间配置器
- 2015071804 - 经历多了是否可以淡然面对呢?
- RTMP流媒体入门
- [BZOJ1187][HNOI2007]神奇游乐园
- 小球落下问题
- 【理解】如何在内存中篡改数据
- HDU 5280 Senior's Array
- 配置DTcms伪静态功能图文教程
- fork()+printf(/n)或printf()的区别?
- PHP中如何通过Web执行C/C++应用程序?
- [BZOJ2152]聪聪可可
- 2015071805 - 所有的都是体验
- Amr and The Large Array
- C++ Primer快速入门之五:实用的模板库