首页
社区
课程
招聘
[分享]PE手动重定位
2019-11-15 15:44 6500

[分享]PE手动重定位

2019-11-15 15:44
6500

目录

 

工具:RadAsm,010 Editor,LordPE。

源码

    .386
    .model flat,stdcall
    option casemap:none

include        msvcrt.inc
includelib    msvcrt.lib

.data
szText    db    'welcome', 0ah, 00h
szPause db    'pause', 00h
.code

main:

    push offset szText
    call crt_printf
    add esp, 4

    push offset szPause
    call crt_system
    add esp, 4

    ret
end main

end

输出一句“welcome”,然后执行system(pause)

运行

在这里插入图片描述

 

然后。用010Editor打开,开启重定位。

 

在这里插入图片描述


 

在这里插入图片描述

 

关于这两个属性,文件头中的IMAGE_FILE_RELOCS_STRIPPED是去除重定位信息的意思,可选头中的IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE是动态基址的意思,前者置0,不去除信息;后者置1,开启动态基址。

 

再次用OD加载。

 

在这里插入图片描述

 

可以看到,加载基址变了,但是两个字符串还有两个函数的地址还是没有变,导致程序不能运行。下面就要添加重定位信息,让它们一块改变。

添加重定位信息

要分清楚区段和数据目录表的关系。添加重定位信息要修改的是数据目录表下标为5那一项,不是添加.reloc区段(而且添加了也没法加载)。区段是规定了属性,真正用来找到重定位信息的是数据目录表。

 

在PE中找个位置,我选择了700H,然后计算它的RVA。

 

在这里插入图片描述
根据LordPE,700H位于rdata段,RVA==700h-600h+2000h==2100h

 

我们有两个字符串和两个函数需要重定位,也就是4个WORD,加上两个DWORD,大小SizeOfBlock == 10H。数据目录表中的size还要算上结尾两个0,所以是12h.

 

在这里插入图片描述

//
// Based relocation format.
//
typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress;        //RVA
    DWORD   SizeOfBlock;
//  WORD    TypeOffset[1];    //end with [00 00]
} IMAGE_BASE_RELOCATION;

struct {
    WORD Offset:12;     //lower 12 bit relocation offset
    WORD Type:4;    //higher 4 bit relocation type value : Based relocation types above
}TypeOffset;

因为我们的程序是32位,所以重定位项的最高位TypeIMAGE_REL_BASED_HIGHLOW==3,64位的PE通常为IMAGE_REL_BASED_DIR64==A

 

根据第一张OD加载截图,VirualAddress==1000H,4个偏移分别为001h, 007h, 00fh, 015h

 

这样,重定位信息就完成了。

 

00000700: 00 10 00 00 10 00 00 00 01 30 07 30 0F 30 15 30

 

再次用OD加载看一下。

 

在这里插入图片描述

 

4个位置的opcode都有了下划线,说明有重定位,运行也没有问题。


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

收藏
点赞4
打赏
分享
最新回复 (6)
雪    币: 405
活跃值: (920)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
练习生 2 2019-11-15 19:10
2
0
,非常适合学习重定位表的实验
雪    币: 2
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
asaqlp 2020-1-22 17:44
3
0
这是把4个偏移001h, 007h, 00fh, 015h 写到了700的位置,话说如果程序很多都写到这里有什么用处,毕竟好像不是重新定位到新的api
最后于 2020-1-22 17:55 被asaqlp编辑 ,原因:
雪    币: 17790
活跃值: (59953)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
Editor 2020-2-12 21:39
4
0
感谢分享!
雪    币: 281
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
画骨 2020-2-14 15:23
5
0
楼主,4个偏移001h, 007h, 00fh, 015h  能详细讲下么?谢谢
雪    币: 6701
活跃值: (3668)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
starrQWQ 1 2020-2-16 14:39
6
0
asaqlp 这是把4个偏移001h, 007h, 00fh, 015h 写到了700的位置,话说如果程序很多都写到这里有什么用处,毕竟好像不是重新定位到新的a ...
程序本来没有重定位,700是我随便找的,然后手动加上,对于正常开启重定位的程序,这属于编译器的工作。还有并不只是api需要重定位,全局变量也需要。
雪    币: 6701
活跃值: (3668)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
starrQWQ 1 2020-2-16 14:42
7
0
画骨 楼主,4个偏移001h, 007h, 00fh, 015h 能详细讲下么?谢谢
看第一个OD截图,这4个偏移相对于401000,opcode分别是“welcome”,printf(),“pause”,system()。
游客
登录 | 注册 方可回帖
返回