首页
社区
课程
招聘
未解决 [求助]关于移动重定位表后修复重定位的问题
发表于: 2020-3-16 17:21 2300

未解决 [求助]关于移动重定位表后修复重定位的问题

2020-3-16 17:21
2300

图片描述
这是题目

 

我已经修改了重定位表里指向的地址,为什么还是不能加载?

 

我的代码:

char* move_relocation(char* fbuff,int offset)//移动重定位表到新增节 偏移可以为0
{
    char* pe = (fbuff + (*(int*)(fbuff + 60)));//pe头
    char* data_dir = pe + 120;//数据目录
    if (*(int*)(data_dir + 8 * 5) == 0)
    {
        printf("文件没有重定位表");
        getchar();
        return 0;
    }

    char* relocation = fbuff + rva_to_foa(fbuff, *(int*)(data_dir + 8 * 5));//重定位表头
    char* flag = relocation;
    int s = 0;
    int s1 = 0;
    int rva = 0;//记录偏移
    int b = 0;

    char*  nrelocation = fbuff + rva_to_foa(fbuff, (getlastjb_rva_add(fbuff)));//移动的目的地foa
    *(int*)(data_dir + 8 * 5) = foa_to_rva(fbuff, nrelocation - fbuff);//改变数据目录的偏移;

    while (*(int*)flag != 0 && *(int*)(flag + 4) != 0)
    {
        rva = *(int*)flag;
        *(int*)nrelocation = (*(int*)flag);
        nrelocation += 4;

        *(int*)nrelocation = *(int*)(flag+4);
        nrelocation += 4;
        //这里可以用别的库函数代替
        printf("*************%x\n", rva);

        flag += 8;//    DWORD   SizeOfBlock

        s = 0;
        s1 = (*(int*)(flag - 4) - 8) / 2;
        while (s++ < s1)//当前页有多少个地址
        {
            b = *(short*)flag;


            if (b & 0x3000 == 0x3000)
            *(int*)(fbuff + rva_to_foa(fbuff,rva + (b & 0xfff))) += offset;
        //    else
            *(short*)nrelocation = (*(short*)flag);

            //*(short*)nrelocation = (*(short*)flag);
            nrelocation += 2;
            printf("%x\n", rva + (b & 0xfff));



            flag += 2;
        }
    }

        s = 0;
        while (s++<2)//为了避免意外情况,后面补8个0 表示结束
        {
            *(int*)nrelocation=0;
            nrelocation += 4;
        }

    return fbuff;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1931
活跃值: (442)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
抱歉,不想看代码,我可以给你我的代码看下
void MoveRelocationTable(LPVOID pFileBuffer,DWORD FOA)
{
    //初始化部分
    PIMAGE_DOS_HEADER pDosHeader = NULL;
    PIMAGE_NT_HEADERS pNTHeader = NULL;
    PIMAGE_FILE_HEADER pPEHeader = NULL;
    PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
    PIMAGE_DATA_DIRECTORY pDataDirectory = NULL;
    PIMAGE_BASE_RELOCATION pBaseRelocation = NULL;
    PIMAGE_BASE_RELOCATION pCopyPlace = NULL;
    PIMAGE_BASE_RELOCATION pNewExportDirectory = NULL;
    PIMAGE_SECTION_HEADER pSectionHeader = NULL;
    //初始化地址指针
    pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
    pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer+pDosHeader->e_lfanew);
    pPEHeader = (PIMAGE_FILE_HEADER)(((DWORD)pNTHeader) + 4);
    pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + IMAGE_SIZEOF_FILE_HEADER);
    //获取节表起始地址
    pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader + pPEHeader->SizeOfOptionalHeader);
    //获取节表数量
    DWORD NumberOfSection = pPEHeader->NumberOfSections;
    pSectionHeader = pSectionHeader + (NumberOfSection-1);
    DWORD VirtualAddress = pSectionHeader->VirtualAddress;
    pDataDirectory = pOptionHeader->DataDirectory;
    pDataDirectory += 5;
    printf("Relocation_Table: %x %x\n", pDataDirectory->VirtualAddress, pDataDirectory->Size);
    pBaseRelocation = (PIMAGE_BASE_RELOCATION)((DWORD)pFileBuffer + getFOA(pDataDirectory->VirtualAddress));
    pCopyPlace = (PIMAGE_BASE_RELOCATION)((DWORD)pFileBuffer + FOA);
    DWORD i = 0;
    DWORD length = 0;//记录长度
    do{
        DWORD SizeOfBlock = pBaseRelocation->SizeOfBlock;
        DWORD realAddr = (DWORD)pFileBuffer + getFOA(pBaseRelocation->VirtualAddress);
        memcpy((DWORD)pCopyPlace+length, pBaseRelocation, SizeOfBlock);
        pBaseRelocation = (DWORD)pBaseRelocation + SizeOfBlock;
        length += SizeOfBlock;
    }while(pBaseRelocation->VirtualAddress!=0 && pBaseRelocation->SizeOfBlock!=0);
    //增加结束标志
    memcpy((DWORD)pCopyPlace+length,pBaseRelocation, sizeof(PIMAGE_BASE_RELOCATION));
    //新增节的地址
    pDataDirectory->VirtualAddress = VirtualAddress;
    printf("%x\n", pDataDirectory->VirtualAddress);
    printf("%x\n", getFOA(pDataDirectory->VirtualAddress));
}

2020-3-17 00:06
0
雪    币: 83
活跃值: (1082)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
感谢
2020-3-17 04:03
0
雪    币: 43
活跃值: (1084)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
TopGreen 抱歉,不想看代码,我可以给你我的代码看下void&nbsp;MoveRelocationTable(LPVOID&nbsp;pFileBuffer,DWORD&nbsp;FOA ...
谢谢
2020-3-17 23:58
0
雪    币: 43
活跃值: (1084)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
你修复重定位了吗?
2020-3-18 00:01
0
雪    币: 43
活跃值: (1084)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
TopGreen 抱歉,不想看代码,我可以给你我的代码看下void&nbsp;MoveRelocationTable(LPVOID&nbsp;pFileBuffer,DWORD&nbsp;FOA ...
你修复重定位了吗?
2020-3-18 00:01
0
雪    币: 1931
活跃值: (442)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
AMask 你修复重定位了吗?
修复了,https://noone-hub.gitee.io/posts/6fd44671/ 看下博客吧,密码1234
2020-4-6 21:05
1
游客
登录 | 注册 方可回帖
返回
//