whypro 发表于 2010-5-26 21:43:04

浅谈脱壳中的Dump技术9

本帖最后由 whypro 于 2010-5-27 17:36 编辑

//下面移动到节表前面
        IMAGE_DOS_HEADER myDosHeader;
        DWORD NumberOfBytesRead;   
        ReadFile(hFile,(LPVOID)&myDosHeader,sizeof(IMAGE_DOS_HEADER),&NumberOfBytesRead,NULL);
        SetFilePointer(hFile,myDosHeader.e_lfanew+sizeof(DWORD),NULL,FILE_BEGIN);
    IMAGE_FILE_HEADER myNtHeader;
        ReadFile(hFile,(LPVOID)&myNtHeader,sizeof(IMAGE_FILE_HEADER),&NumberOfBytesRead,NULL);
        int nSectionCount;
        nSectionCount = myNtHeader.NumberOfSections;             // 保存Section个数
        // 过了IMAGE_NT_HEADERS结构就是IMAGE_SECTION_HEADER结构数组了,注意是结构数组,有几个Section该结构就有几个元素
        // 这里动态开辟NumberOfSections个内存来存储不同的Section信息
        IMAGE_SECTION_HEADER *pmySectionHeader = (IMAGE_SECTION_HEADER *)calloc(nSectionCount, sizeof(IMAGE_SECTION_HEADER));
        SetFilePointer(hFile,myDosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS),NULL,FILE_BEGIN);
    ReadFile(hFile,(LPVOID)pmySectionHeader,sizeof(IMAGE_SECTION_HEADER)*nSectionCount,
                     &NumberOfBytesRead,NULL);
        //移动回到节表的开始,准备写入
        SetFilePointer(hFile,myDosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS),NULL,FILE_BEGIN);
        for (int i = 0; i < nSectionCount; i++, pmySectionHeader++)
        {
                //将RA=RVA ,RS=RVS
                pmySectionHeader->SizeOfRawData=pmySectionHeader->Misc.VirtualSize;
                pmySectionHeader->PointerToRawData=pmySectionHeader->VirtualAddress;
                //将修改好的数值写回
                WriteFile(hFile,(LPVOID)pmySectionHeader,sizeof(IMAGE_SECTION_HEADER),&NumberOfBytesRead,NULL);
        }
        // 恢复指针
        pmySectionHeader -=nSectionCount;

        if (pmySectionHeader != NULL)          // 释放内存
        {
页: [1]
查看完整版本: 浅谈脱壳中的Dump技术9