VC往PE文件末尾读写数据

来源:互联网 发布:编程思路怎么写 编辑:程序博客网 时间:2024/05/20 16:10


//往文件末尾写数据

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);
}

原创粉丝点击