【PE前准备】

1. 文件重复包含问题

  • 什么是重复包含问题:
    x.h    
    #include z.h        
    y.h    
    #include z.h      
    z.h
    struct Student        
    {        
        int level;    
    };
    
  • 如果此时有个文件同时包含了x.h和y.h会出问题
    解决方案
    #if !defined(ZZZ)    	//这句话的意思可以这样去理解,如果ZZZ已经存在了,就不在声明
    #define ZZZ            //ZZZ相当于一个编号,越复杂越好,唯一的.        
    
    struct Student        
    {
        int level;    
    };        	            
    #endif
    

2. malloc 函数

  • 使用流程
    //声明指针
    int* ptr;                 
                    
    //在堆中申请内存,分配128个int                
    ptr = (int *)malloc(sizeof(int)*128);                
                    
    //无论申请的空间大小,一定要进行校验判断是否申请成功                
    if(ptr == NULL)                
    {                
        return 0;            
    }
                    
    //初始化分配的内存空间                
    memset(ptr,0,sizeof(int)*128);                
                    
    //开始使用        
    *(ptr) = 1;                
                    
    //使用完毕 释放申请的堆空间                
    free(ptr);                
                    
    //将指针设置为NULL                
    ptr = NULL;
    

3. 文件读写相关函数

(1) fopen函数 打开文件函数        (打开一个文件并返回文件指针)
(2) fseek函数 查找文件头或者尾函数  (移动文件的读写指针到指定的位置)
(3) ftell函数 定位指针函数         (获取文件读写指针的当前位置)
(4) fclose函数 关闭文件函数        (关闭文件流)
(5) fread函数 读取文件内容函数     (从文件流中读取数据)

相关问题

  1. 将记事本的.exe文件读取到内存,并返回读取后在内存中的地址
    大概思路:
    (1)打开文件
    (2)得到文件的大小 --> 读取文件到内存,然后跳转到文件末尾,查看跳转的长度
    (3)根据大小申请内存
    (4)把文件中内容读取到内存里
    (5)返回内存编号
  2. 将内存中的数据存储到一个文件中,(.exe格式),然后双击打开,看是否能够使用
    详解1
    详解2
    
    记事本路径:C:\cntflx
    #define F_PATH "C:\\cntflx\\notepad.exe"
    
    question 1#include "stdafx.h"
    #include <malloc.h>
    #include <string.h>
    #include <stdlib.h>
    #include <memory.h>
    
    #define F_PATH "C:\\cntflx\\notepad.exe"
    
    int Pe_Getfile_Size()
    {
        FILE* fp=fopen(F_PATH,"r");
        if (!fp)
        {
            return -1;
        }
        fseek(fp,0L,SEEK_END);
        int size = ftell(fp);
        fseek(fp,0,SEEK_SET);
        fclose(fp);
        return size;
    }
    
    int FileSizes = Pe_Getfile_Size();
    
    int Pe_ReadMemtory_addrs1()
    {
        //定义一个文件的指针,并初始化其为NULL
        FILE* fstream = NULL;
    
        //初始化exe文件长度
        int FstreamSizes = 0;
    
        //准备打开文件notepad.exe ,读写,且是读二进制文件
        fstream = fopen(F_PATH,"ab+");
    
        //获取打开文件的exe大小
        FstreamSizes = FileSizes;
    //    printf("%d \n",FstreamSizes);
    
        //申请动态内存指向FileBuffer
        int* FileBuffer = (int*)malloc(FstreamSizes);
    
        //判断申请的内存是否成功,不成功就返回0,成功就开始读exe内容写入申请的内存中
        if (FileBuffer == NULL)
        {
            return 0;
        }
        else
        {
            fread(FileBuffer,FstreamSizes,1,fstream);
        }
        memset(FileBuffer,0,Pe_Getfile_Size());
    
        //返回内存编号
        int addr = (int)FileBuffer;
        printf("%x \n",addr);
        //释放申请的内存空间
        free(FileBuffer);
        FileBuffer = NULL;
        fclose(fstream);
        return 0;
    }
    
    int main(int argc, char* argv[])
    {
        Pe_ReadMemtory_addrs1();
        return 0;
    }
    
    question 2#include "stdafx.h"
    #include <malloc.h>
    #include <string.h>
    #include <stdlib.h>
    #include <memory.h>
    
    #define F_PATH "C:\\cntflx\\notepad.exe"
    #define W_PATH "C:\\cntflx\\newnotepad.exe"
    
    int Pe_Getfile_Size()
    {
        FILE* fp=fopen(F_PATH,"r");
        if (!fp)
        {
            return -1;
        }
        fseek(fp,0L,SEEK_END);
        int size = ftell(fp);
        fseek(fp,0,SEEK_SET);
        fclose(fp);
        
        return size;
    }
    
    int FileSizes = Pe_Getfile_Size();
    
    int Pe_ReadMemtory_addrs1()
    {
        //定义两个文件的指针,并初始化为NULL
        FILE* fstream1 = NULL;
        FILE* fstream2 = NULL;
        
        //初始化exe文件长度
        int FstreamSizes = 0;
        
        //准备打开文件notepad.exe ,读写,且是读二进制文件
        fstream1 = fopen(F_PATH,"ab+");
        
        //写入一个新的不存在的exe文件
        fstream2 = fopen(W_PATH,"ab+");
    
        //获取打开文件的exe大小
        FstreamSizes = FileSizes;
        //    printf("%d \n",FstreamSizes);
        
        //申请动态内存指向FileBuffer
        int* FileBuffer = (int*)malloc(FstreamSizes);
        
        //判断申请的内存是否成功,不成功就返回0
        //成功的话就开始读exe文件内容,写入到另一个exe文件中
    
        if (FileBuffer == NULL)
        {
            return 0;
        }
        else
        {
            fread(FileBuffer,FstreamSizes+1,1,fstream1);
            fwrite(FileBuffer,FstreamSizes,1,fstream2);
        }
        memset(FileBuffer,0,Pe_Getfile_Size());
        //释放堆中申请的内存,并关闭打开的文件流
    
        free(FileBuffer);
        FileBuffer = NULL;
        fclose(fstream1);
        fclose(fstream2);
        
        return 0;
    }
    
    int main(int argc, char* argv[])
    {
        Pe_ReadMemtory_addrs1();
        return 0;
    }
    
    PE文件解析参考1
    PE文件解析参考2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值