VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1140|回复: 2

有谁写过【模拟PE加载器】??

[复制链接]
35_avatar_middle
最佳答案
0 
online_vip 发表于 2015-12-30 13:56:07 | 显示全部楼层 |阅读模式
3驿站币
本人在写PE加载到内存。
有一个问题:
就是重定位这一块。

void RelocModule(
        PVOID pNewImage,
        PVOID pOrigImage)
{
        ULONG                                        u_index;
        ULONG                                        u_reloctable_size;
        USHORT                                        type_value;
        USHORT                                        *poffset_array;
        ULONG                                        u_offset_array_size;

        ULONG                                        u_reloc_offset;

        ULONG                                        u_reloc_address;

        PIMAGE_DOS_HEADER                pimage_dos_header;
        PIMAGE_NT_HEADERS                pimage_nt_header;
        IMAGE_DATA_DIRECTORY        image_data_directory;
        MYIMAGE_BASE_RELOCATION        *pimage_base_relocation;

        pimage_dos_header = (PIMAGE_DOS_HEADER)pNewImage;
        pimage_nt_header = (PIMAGE_NT_HEADERS)((ULONG)pNewImage + pimage_dos_header->e_lfanew);

        u_reloc_offset = (ULONG)pNewImage - pimage_nt_header->OptionalHeader.ImageBase;//这里不行,如果是这样子的话,不成功
        u_reloc_offset = (ULONG)pOrigImage - pimage_nt_header->OptionalHeader.ImageBase;//用原来的旧地址的话就可以

        image_data_directory = pimage_nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];

        pimage_base_relocation = (MYPIMAGE_BASE_RELOCATION)(image_data_directory.VirtualAddress + (ULONG)pNewImage);
        u_reloctable_size = image_data_directory.Size;

        while(u_reloctable_size)
        {
                u_offset_array_size = (pimage_base_relocation->SizeOfBlock - sizeof(ULONG)*2) / sizeof(USHORT);

                poffset_array = pimage_base_relocation->TypeOffset;
                for (u_index = 0;u_index<u_offset_array_size;u_index++)
                {
                        type_value = poffset_array[u_index];
                        if (type_value>>12==IMAGE_REL_BASED_HIGHLOW)
                        {
                                u_reloc_address = (type_value&0xfff)+pimage_base_relocation->VirtualAddress + (ULONG)pNewImage;
                                //DebugOutString("u_reloc_address:[%p][%p][%p]\n",*(ULONG*)u_reloc_address,*(ULONG*)u_reloc_address + u_reloc_offset,u_reloc_offset);
                                *(ULONG*)u_reloc_address += u_reloc_offset;
                                //DebugOutString("u_reloc_address:[%p][%p]\n",*(ULONG*)u_reloc_address,*(ULONG*)u_reloc_address + u_reloc_offset);
                        }
                }

                u_reloctable_size -= pimage_base_relocation->SizeOfBlock;
                pimage_base_relocation = (MYIMAGE_BASE_RELOCATION *)(\
                        (ULONG)pimage_base_relocation + pimage_base_relocation->SizeOfBlock);
        }
}

如果用新地址减的话不成功,但是用旧地址的话就成功了。
但是windows PE加载器,他在怎么个重定位的?
他不需要用旧地址减去ImageBase才能重定位吧。
哪位大神能讲解一下吗?
或者有源码更好。
网上的源码不全,所以来问了

评分

参与人数 1热心值 +1 收起 理由
70_avatar_small hahala + 1 &lt;WindowsPE权威指南&gt;你值得拥有

查看全部评分





上一篇:VC picture conctrol如何响应onsize函数,调整大小?
下一篇:为什么CDC只能用指针调用成员涵数,不能用对象调用成员涵数;CClientDC却可以用对象?
01_avatar_middle
最佳答案
0 
在线会员 发表于 2015-12-30 14:28:18 | 显示全部楼层
sysnap的PELoader, http://bbs.pediy.com/showthread.php?t=141891
另外记得看雪的玩命和V校(kanxue ID: cvcvxk)也写过,V校那个貌似是可以直接加载驱动的

还在pudn上找到一份,没看过,不知道如何http://www.pudn.com/downloads435 ... /detail1840092.html[/url]
50_avatar_middle
最佳答案
0 
在线会员 发表于 2015-12-31 23:57:55 | 显示全部楼层
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-11-24 06:32

Powered by CcTry.CoM

© 2009-2020 cctry.com

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