VC往PE文件末尾读写数据


//往文件末尾写数据

void CwritePEFileDlg::OnBnClickedButton2()
{
    TCHAR strPath[MAX_PATH];
    wcscpy(strPath, L"d:\\1.exe");
    HANDLE handle = CreateFile(strPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
    if(handle == INVALID_HANDLE_VALUE)
    {
        MessageBox(L"打开exe资源文件出错");
        return;
    }
    LARGE_INTEGER li;
    li.QuadPart = 0;
    SetFilePointerEx(handle, li,NULL, FILE_END);
    TCHAR string[8];
    wcscpy(string, L"TTTTTTT");
    DWORD dwnumToWrite = 0;
    WriteFile(handle, string, 16, &dwnumToWrite, NULL);
    CloseHandle(handle);
    
}


//找到PE文件末尾

UINT CwritePEFileDlg::FindEndOfPE()
{
    IMAGE_DOS_HEADER st_dos_header;
    memset(&st_dos_header,0,sizeof(IMAGE_DOS_HEADER));
    int i_count = sizeof(IMAGE_DOS_HEADER);
    //返回的是相应可执行文件或dll文件加载到进程地址空间的句柄(基地址);
    //传入NULL返回进程地址空间中可执行文件的基地址。
    HMODULE hMod = GetModuleHandle(NULL);

    PIMAGE_DOS_HEADER lpImageDosHeader = NULL;
    //SECTION TABLE
    PIMAGE_SECTION_HEADER lpImageSectionHeader = NULL;
    PIMAGE_FILE_HEADER   lpImageFileHeader = NULL;
    //==Dos header 文件指针
    lpImageDosHeader = (PIMAGE_DOS_HEADER)hMod;
    //==新exe头部的文件地址,一个4字节的文件偏移量;==
    lpImageFileHeader = (PIMAGE_FILE_HEADER)((BYTE *)hMod + lpImageDosHeader->e_lfanew + 4);

    int SectionNums =  lpImageFileHeader->NumberOfSections;
    lpImageSectionHeader = (PIMAGE_SECTION_HEADER)((BYTE *)hMod + lpImageDosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER)* (SectionNums-1));

    DWORD rawData = lpImageSectionHeader->PointerToRawData;
    DWORD sizeifrawdata = lpImageSectionHeader->SizeOfRawData;

    //PE文件结尾
    return rawData + sizeifrawdata;
}


//从PE文件末尾读取数据

void CwritePEFileDlg::OnBnClickedButton1()
{
    TCHAR strPath[MAX_PATH];
    wcscpy(strPath, L"d:\\1.exe");
    HANDLE handle = CreateFile(strPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
    if (handle == INVALID_HANDLE_VALUE)
    {
        MessageBox(L"资源文件不存在,打开错误");
        return ;
    }
    LARGE_INTEGER li;
    li.QuadPart = FindEndOfPE();

    SetFilePointerEx(handle, li, NULL, FILE_BEGIN);
    TCHAR string[8];
    DWORD m_dwNumToRead = 0;

    ReadFile(handle, string, 16, &m_dwNumToRead, NULL) ;
    MessageBox(string);

    CloseHandle(handle);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值