PE手动重定位

26 篇文章 2 订阅


本文已在看雪论坛发布。

工具: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位,所以重定位项的最高位Type为3(IMAGE_REL_BASED_HIGHLOW),64位的PE通常为A(IMAGE_REL_BASED_DIR64)。

根据第一张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都有了下划线,说明有重定位,运行也没有问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值