吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 894|回复: 0
收起左侧

[已解决] 修复重定位表后运行不了

[复制链接]
aswcy815174418 发表于 2021-4-27 22:54
本帖最后由 aswcy815174418 于 2021-4-28 13:09 编辑

先修改了ImageBase = 0x500000(原来是0x400000),代码优化了一天,还是不行,来求助各位大佬
测试的程序:点我下载
错误分析:我判断高位时,以为高位为3低12位全为0就没必要修复了,错误在这里
以下是我已经修改好的代码:

#include <iostream>
#include <windows.h>

DWORD RVATranformFOA(IMAGE_NT_HEADERS* nt, IMAGE_SECTION_HEADER** sectionArr, DWORD virAddr) {
    if (virAddr == 0) {
        return 0;
    }
    for (int i = 0; i < nt->FileHeader.NumberOfSections; i++) {
        if (sectionArr[i]->VirtualAddress >= virAddr) {
            //printf("%x %x %x\n", virAddr, sectionArr[i]->VirtualAddress, sectionArr[i]->PointerToRawData);
            if (sectionArr[i]->VirtualAddress == virAddr) {
                return sectionArr[i]->PointerToRawData;
            }
            i == 0 ? i++ : i;
            return  virAddr - sectionArr[i - 1]->VirtualAddress + sectionArr[i - 1]->PointerToRawData;
        }
    }
    return 0;
}

int main() {
    HANDLE handle = CreateFileA("D:\\EverEdit.exe", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
    HANDLE handleMap = CreateFileMappingA(handle, 0, PAGE_READWRITE, 0, 0, 0);
    LPVOID handleView = MapViewOfFile(handleMap, FILE_MAP_WRITE, 0, 0, 0);

    IMAGE_DOS_HEADER* dos = (IMAGE_DOS_HEADER*)handleView;
    IMAGE_NT_HEADERS* nt = (IMAGE_NT_HEADERS*)((UINT)dos + dos->e_lfanew);
    IMAGE_SECTION_HEADER** sectionArr = (IMAGE_SECTION_HEADER**)malloc(nt->FileHeader.NumberOfSections * 4);

    for (int i = 0; i < nt->FileHeader.NumberOfSections; i++) {
        sectionArr[i] = (IMAGE_SECTION_HEADER*)((UINT)nt + sizeof(*nt) + 40 * i);
        //printf("%x\n", sectionArr[i]);
    }

    //保存之前的ImageBase
    DWORD preImageBase = nt->OptionalHeader.ImageBase;
    //修改的ImageBase
    nt->OptionalHeader.ImageBase = 0x700000;
    //获取差值
    DWORD offset = nt->OptionalHeader.ImageBase - preImageBase;

    IMAGE_BASE_RELOCATION* relocSecVirAddr = (IMAGE_BASE_RELOCATION*)(RVATranformFOA(nt, sectionArr, nt->OptionalHeader.DataDirectory[5].VirtualAddress) + (UINT)dos);
    //获取到重定位表相对文件位置FOA
    printf("offsetFOA: %x\n", (UINT)relocSecVirAddr - (UINT)dos);

    if (offset) {

        while (relocSecVirAddr->VirtualAddress && relocSecVirAddr->SizeOfBlock) {
            WORD* offer = (WORD*)((UINT)relocSecVirAddr + 8);
            printf("***************************************************");
            for (size_t i = 0; i < (relocSecVirAddr->SizeOfBlock - 8) / 2; i++) {
                offer = (WORD*)((UINT)relocSecVirAddr + 8 + i * 2);
                if (*offer >= 3000) {
                    DWORD* motifyAddr = (DWORD*)(RVATranformFOA(nt, sectionArr, relocSecVirAddr->VirtualAddress) + *offer - 0x3000 + (UINT)dos);
                    printf("%x\n", *offer - 0x3000 + RVATranformFOA(nt, sectionArr, relocSecVirAddr->VirtualAddress));
                    *motifyAddr += offset;
                }

            }
            printf("***************************************************");
            relocSecVirAddr = (IMAGE_BASE_RELOCATION*)((UINT)relocSecVirAddr + relocSecVirAddr->SizeOfBlock);

        }

        printf("motify is ok\n");
    }

    CloseHandle(handle);
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-17 00:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表