在这里再次强调一下,只要是windows操作程序,其就要遵循PE格式,再说人家看雪的网址就是www.pediy.com。
这一节对于讲来研究病毒原理的研究影响比较大,大家务必要深入理解~
但是吧,咱的权威教材看雪的《加密与解密》在这一节的讲解上实在不给力,很多初学者看得云里雾里的。大家意见一致啵 ?!
问题一:什么是基址重定位?
答:
重定位就是你本来这个程序理论上要占据这个地址,但是由于某种原因,这个地址现在不能让你霸占,你必须转移到别的地址,这就需要基址重定位。
打个比方:例如你现在计划在某某地方建一栋楼,但是有一天你收到上边的通知,这个地方政府临时要征用建公厕,所以这时候你就没辙,得去别的地方建啦~
问题二:为什么需要基址重定位?
答:
其实这个问题看起来跟前边的有点重复不是?
但是有些朋友可能会这么说,你的言论是可以,但是放在程序中,你上节课不是还说每个程序都让Windows 欺骗了吗 —— 每个程序觉得自己都完全占有 4GB的内存空间,何来地址被别的程序占据了呢?!
首先,能够提出问题的朋友都是值得表扬和鼓励的
但是,上节课我们谈了什么内容呢 ? 谈了导出表,为什么会出现导出表呢 ? 正是因为有DLL 这类破坏别人家庭幸福的“小三”的存在~
我们之前谈过,动态链接库它自己是没有占据任何私有空间的,都是寄生在应用程序的私有空间里边。那寄生在别人家里,睡在哪里就肯定不是
小三说了算啦,肯定要由主人决定不是?
所以,在小三的眼里,不用说,肯定永远都睡在大房,但客观事实告诉我们,小三只能住卧室~(有点扯远了,基址重定位就是这么被需求的^_^)
问题三:我们需要对程序中的哪些语句(指令)进行基址重定位呢?
答:请先看下图
这是上节课我们用到的动态链接库 Counter.dll 文件,对其用W32Dasm 进行反汇编的截图。
我们分析下,有哪些语句是需要我们来进行基址重定位的呢 ?
(温馨提示:以下内容涉及一些汇编基础和windows基础,不懂的朋友可以参照视频教程。因为一般说话比打字容易,信息量也比较大~)
答案是 —— 但凡涉及到直接寻址的指令都需要进行重定位处理!(那什么是直接寻址? 咱在零基础入门学习汇编里边讲得很清楚啦,只要在机器码中看到有地址的,那就叫直接寻址……那有没有间接的? 肯定哈,间接的就是地址被间接的保存起来,例如存放在寄存器eax, 然后通过访问寄存器来获取地址,那就叫间接~)
那么我们再过头来看下图片,一眼就能扫出以下指令需要对其进行重定位:
:10001026 FF0500300010 inc dword ptr [10003000]