小甲鱼PE详解之基址重定位详解(PE详解10)

SAP OBYC自动过账全解析:从BSX到WRX的会计科目配置指南 本文深入解析SAP OBYC自动过账功能,从BSX到WRX的会计科目配置全流程,涵盖评估分组代码、事务码和评估类等核心概念。通过实战案例展示如何实现库存变动到财务过账的自动化流转,提升企业财务数据的准确性和效率。 阅读详情
今天有一个朋友发短消息问我说“老师,为什么PE的格式要讲的这么这么细,这可不是一般的系哦”。其实之所以将PE结构放在解密系列继基础篇之后讲并且尽可能细致的讲,不是因为小甲鱼没事找事做,主要原因是因为PE结构非常重要,再说做这个课件的确是很费神的事哈。在这里再次强调一下,只要是windows操作程序,其就要遵循PE格式,再说人家看雪的网址就是www.pediy.com。

简单的讲是可以,但是怕就怕有些朋友知识点遗漏了或者错误理解意思、不能深刻体会等,这样的效果是不好的~所以,小甲鱼尽管这系列视频可能出得比较慢,但质量一定保证大家都能够接受。建议:如果认为PE不重要,没关系,可以先学其他。小甲鱼的文章永远放在这里,等你需要的时候再回过头来看就行。



小甲鱼PE详解之基址重定位详解(PE详解10)

这一节对于讲来研究病毒原理的研究影响比较大,大家务必要深入理解~ 
但是吧,咱的权威教材看雪的《加密与解密》在这一节的讲解上实在不给力,很多初学者看得云里雾里的。大家意见一致啵 ?! 
为了让大家能够更容易的接受,小甲鱼决定通过自问 - 自答循环渐进的模式给大家讲解基址重定位的原理和应用。


问题一:什么是基址重定位?

答:
重定位就是你本来这个程序理论上要占据这个地址,但是由于某种原因,这个地址现在不能让你霸占,你必须转移到别的地址,这就需要基址重定位。打个比方:例如你现在计划在某某地方建一栋楼,但是有一天你收到上边的通知,这个地方政府临时要征用建公厕,所以这时候你就没辙,得去别的地方建啦~


问题二:为什么需要基址重定位?


答:其实这个问题看起来跟前边的有点重复不是? 但是有些朋友可能会这么说,小甲鱼老湿你的言论是可以,但是放在程序中,小甲鱼你上节课不是还说每个程序都让Windows 欺骗了吗 —— 每个程序觉得自己都完全占有 4GB的内存空间,何来地址被别的程序占据了呢?! 
首先,能够提出问题的朋友都是
值得表扬和鼓励的

但是,上节课我们谈了什么内容呢 ? 谈了导出表,为什么会出现导出表呢 ? 正是因为有DLL 这类破坏别人家庭幸福的“小三”的存在~ 
我们之前谈过,动态链接库它自己是没有占据任何似有空间的,都是寄生在应用程序的私有空间里边。那寄生在别人家里,睡在哪里就肯定不是
小三说了算啦,肯定要由主人决定不是? 所以,在小三的眼里,不用说,肯定永远都睡在大房,但客观事实告诉我们,经常只能住卧室~(有点扯远了,其实小甲鱼想说的是,基址重定位就是这么被需求的^_^)


问题三:我们需要对程序中的哪些语句(指令)进行基址重定位呢?

答:请先看下图


这是上节课我们用到的动态链接库 Counter.dll 文件,对其用W32Dasm 进行反汇编的截图。我们分析下,有哪些语句是需要我们来进行基址重定位的呢 ?(温馨提示:以下内容涉及一些汇编基础和windows基础,不懂的朋友可以参照视频教程。因为一般说话比打字容易,信息量也比较大~)

答案是——但凡涉及到直接寻址的指令都需要进行重定位处理!(那什么是直接寻址? 咱在零基础入门学习汇编里边讲得很清楚啦,只要在机器码中看到有地址的,那就叫直接寻址……那有没有间接的? 肯定哈,间接的就是地址被间接的保存起来,例如存放在寄存器eax, 然后通过访问寄存器来获取地址,那就叫间接~)

那么我们再过头来看下图片,一眼就能扫出以下指令需要对其进行重定位:
:10001026 FF0500300010            inc dword ptr [10003000]
:1000102C FF3500300010            push dword ptr [10003000]
:1000103D A100300010              mov eax, dword ptr [10003000]
:10001049 FF0D00300010            dec dword ptr [10003000]
:1000104F FF3500300010            push dword ptr [10003000]
:10001060 A100300010              mov eax, dword ptr [10003000]
:1000106A FF2500200010            Jmp dword ptr [10002000]


那有些朋友可能会问了,类似于“:10001038 E8CFFFFFFF        call 1000100C”的指令,为什么后边显示的是call + 地址,而机器码却不包含地址信息呢? CPU神了? 莫非地址信息被加密了? 其实不是的,学过汇编的朋友不知道还记不记得,小甲鱼在讲call 原理的时候用了大部分时间在谈几种跳转,其中经常遇到的就是“地址+偏移”的形式。那这就能有个说得通的解释了:CFFFFFFFh 事实上就是一个偏移地址,记得咱这是little-edition,转换过来就是FFFF FFCFh,也就是等于-31h。那么1000103Dh - 31h == 1000100Ch,Perfect! ^_^


问题四:系统对一条指令进行重定位需要哪些信息?

答:
我们还是拿上边那张图片来说事儿,我们说了上边的那些指令需要重定位,现在就假设重定位后的基地址由原来的10000000h 变为 20000000h了,那么类似这样的语句:
inc dword ptr [10003000] 应该改成 inc dword ptr [20003000] 。
注意,重定位的算法我们可以总结为:将直接寻址指令中的双字地址加上模块的实际装入地址与模块建议装入地址之差。

从上边的信息中我们看到,需要进行重定位需要三个因素:

1. 需要修正的地址(10003000h)
2. 建议装入的地址(10003000h)
3. 实际装入的地址(20003000h)


问题五:这些信息哪些应该被保存在重定位表中?

聪明的我们可以发现:
1. 建议装入的地址在PE 文件头中已经定义了
2. 实际装入的地址在没有被装载器装入我们根本无从得知,也就是说这事天不知地不知我们不知只有装载器知道……

因此,我们可以得到的结论是:PE 文件的重定位表(Base Relocation Table)中保存的就是文件中所有需要进行重定位修正的代码的地址。


基址重定位结构表

IMAGE_BASE_RELOCATION STRUC

 VirtualAddress        DWORD        ?  ; 重定位数据开始的RVA 地址
 SizeOfBlock           DWORD        ?  ; 重定位块得长度
 TypeOffset            WORD          ?  ;  重定项位数组

IMAGE_BASE_RELOCATION  ENDS

VirtualAddress 是 Base Relocation Table 的位置它是一个 RVA 值;
SizeOfBlock 是 Base Relocation Table 的大小
;
TypeOffset 是一个数组,数组每项大小为两个字节(16位),它由高 4位和低 12位组成,高 4位代表重定位类型,低 12位是重定位地址,它与 VirtualAddress 相加即是指向PE 映像中需要修改的那个代码的地址。

IMAGE_REL_BASED_ABSOLUTE           (0) 使块按照32位对齐,位置为0。
IMAGE_REL_BASED_HIGH                    (1) 高16位必须应用于偏移量所指高字16位。
IMAGE_REL_BASED_LOW                    (2) 低16位必须应用于偏移量所指低字16位。
IMAGE_REL_BASED_HIGHLOW            (3) 全部32位应用于所有32位。
IMAGE_REL_BASED_HIGHADJ              (4) 需要32位,高16位位于偏移量,低16位位于下一个偏移量数组元素,组合为一个带符号数,加上32位的一个数,然后加上8000然后把高16位保存在偏移量的16位域内。
IMAGE_REL_BASED_MIPS_JMPADDR   (5)  Unknown
IMAGE_REL_BASED_SECTION              (6)  Unknown
IMAGE_REL_BASED_REL32                  (7)  Unknown


输出表结构实例分析(具体过程将在视频中演示,这里不啰嗦啦~)

工具:PEinfo.exe, UltraEdit, W32DasmV10.0
解剖对象:Counter.dll
以宠辱之戒写 SAP Fiori Elements,把标准能力当成身体,把扩展冲动当成大患 SAP Fiori Elements开发中常面临业务方追求"独特页面"的压力,但过度自定义会破坏框架价值。老子"宠辱若惊"的智慧提醒开发者:不应因用户称赞或批评而动摇架构原则。标准模板的价值在于确保业务语义、交互规范和后端服务的一致性。扩展应遵循官方API,将业务逻辑放在ABAP/CDS层而非前端控制器。成熟项目会平衡标准与定制,使用annotation表达UI行为,仅在必要时通过受支持的extension points进行增强,保持系统的长期可维护性。 阅读详情

相关推荐

强化学习Q值迭代的几何视角:从策略区域到快速收敛

在强化学习中,Q值迭代是求解最优策略的核心算法,其理论基础建立在贝尔曼不动点定理之上。该算法通过迭代更新Q函数,使其逐步逼近最优值函数。从几何视角看,整个Q函数空间可被视为一个高维流形,每个Q函数对应流形上的一个点,而贝尔曼最优算子则定义了流形上的变换轨迹。理解这一几何结构,特别是由策略超平面划分出的凸多面体区域,对于分析算法的收敛行为至关重要。在实际工程中,传统Q值迭代可能在高维或稀疏奖励环境下收敛缓慢,甚至陷入策略高原。通过引入策略区域缓存与自适应学习率等几何启发方法,可以更高效地导航策略空间,加速策略

weixin_30444111的博客 319

190514-读取基址与偏移的几种方式

基址分为固定基址,与随机基址 一般的EXE里 数据段和代码段 相关的地址是固定的 通常DLL里找到的基址都是动态的 常见的基址 形式 一、固定基址 标题先说固定的基址 举个例子 某个游戏的角色相关的几个地址: 0x400056 //int 血量 0x40006c //float x坐标 0x400070 //float y坐标 或者 [0x458800AC]+0x180 ...

5769

jenkins连接外部k8s集群

k8s连接集群外Jenkins

liuchao666888的博客 1527

动态基址的定位获取

自win7之后,基址已成动态 然而当时我查找资料的时候 却发觉相关资料非常的少 或者说我不是很懂那些大牛的意思吧 今天看了有关教程有所明悟 自己大概构想出了实现获取的方案 下面来讲讲方法与思路 方法:   特征码锁定获取 思路: 程序添加初始化按钮,当目标程序载入完成之后点击按钮,读取出此次的常量动态基址。 基址+偏移,就能实现以往设想的功能了。 这个方

Flasco的个人博客 6905

别再折腾虚拟机了!手把手教你用WSL2在Windows 11上安装Kali Linux(含汉化与图形界面)

本文详细介绍了如何在Windows 11上通过WSL2安装和配置Kali Linux,包括汉化与图形界面设置。通过WSL2,用户可以享受接近原生性能的Linux体验,同时保持与Windows系统的无缝集成,特别适合网络安全爱好者和开发者。文章还提供了常见问题解决和性能优化建议,帮助用户高效使用Kali工具集。

weixin_42525369的博客 324

PCL1.12.1+VTK9.1+Qt5.14.2实战:解决QVTKOpenGLNativeWidget点云渲染窗口初始化报错问题

本文针对PCL1.12.1、VTK9.1与Qt5.14.2集成开发中,QVTKOpenGLNativeWidget点云渲染窗口初始化时出现的报错与黑屏问题,提供了深度分析与两种实战解决方案。核心在于理解VTK版本升级导致的渲染窗口类型不匹配,并指导开发者通过显式创建vtkGenericOpenGLRenderWindow或利用窗口ID嵌入,正确初始化并绑定可视化组件,从而稳定实现点云渲染。

weixin_29284657的博客 223

动态基址定位的改进方法

在一段时间的学习之后,笔者对于定位基址的方法有了更近一步的了解。其实根据模块定位是可以做到的。因为程序的整体是固定的,只有模块基址每次打开都在改变,但是程序内的相对位置是不会改变的。所以获取程序的模块基址之后加上偏移就可以定位到所需要的地址了。 关于获取模块基址,gethandlemoudle("目标程序")就可以获得了。点到此处为止。

Flasco的个人博客 2186

Ventoy引导自定义菜单配置详解:手把手教你用ventoy_grub.cfg启动硬盘里的Manjaro

本文详细解析了Ventoy引导自定义菜单配置方法,重点介绍如何通过ventoy_grub.cfg文件启动硬盘中的Manjaro系统。从Ventoy与GRUB2的协作原理到具体配置步骤,包括分区布局设计、关键参数解析及常见问题解决方案,帮助用户实现多系统引导的灵活管理。

weixin_28738165的博客 301

定位动态地址的3种方法

现在的游戏全是双地址效验内存,内存地址不断变化,现在E里面有很多模块,读写内存,取颜色,模拟键盘,模拟鼠标,如果内存是静态的,我相信各位全用不上API,就光用模块就能写出简单的内挂了,当然内挂的准确度还要看各位用什么样的方式来解决各种问题了,可是内存是动态的,每次启动游戏内存就全会变,我们不能每次让玩家来用金山游侠查找血地址输入到你外挂里然后再启动外挂啊,呵呵,所以下面我说说我是如何解决动态内存的

l198738655的博客 7534

【ESP32接入国产大模型之豆包】

🥳🥳🥳现在,我们在本教程中,您学习了如何使用ESP32接入语言大模型之豆包。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,后期会持续分享esp32跑freertos实用案列🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣如果你有任何问题,可以通过q group(945348278)加入鹏鹏小分队,期待与你思维的碰撞😘😘😘。

vor234的博客 1万+

极智AI | 详解 ViT 算法实现

大家好,我是极智视界,本文详细介绍一下 ViT 算法的设计与实现,包括代码。

极智视界 5607

exe重定位清除,主要让WIN7的动态基址不起作用

若EXE有重定位表,在属性里将重定位已分离勾上,同时将重定位表的数值清零,OK,WIN7再也不用将EXE动态基址了。爽.原文在看雪: 标 题: 【原创】【脱壳修复】win7下简单处理重定位表 作 者: xhbuming 时 间: 2015-04-23,15:14:40 链 接: http://bbs.pediy.com/showthread.php?t=199895 操作

pklong008的博客 5867

业态即战场:零售平台的生意模型与系统设计解构

在这篇文章中,我们从“控货、自营、联营”三种典型零售业态出发,拆解了亚马逊、阿里、京东和本地闪购平台在商品模型设计上的差异与博弈。看似简单的卖货方式背后,其实是平台在“控货权”“商品归属权”上的深层策略博弈:谁掌控商品,谁就掌控数据、流量与利润分配权。本文尝试用一套通俗但不失专业的方式,帮助产品经理和技术伙伴读懂零售平台商品模型的底层逻辑与系统设计演化路径。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

PE详解之 基址重定位

让编程改变世界 Change the world by program  转自:http://blog.fishc.com/1629.html/2#codesyntax_1 今天有一个朋友发短消息问我说“老师,为什么PE的格式要讲的这么这么细,这可不是一般的细哦”。 其实之所以将PE结构放在解密系列继基础篇之后讲并且尽可能细致的讲,不是因为小甲鱼没事找事做。 主要原因是因为PE结构非

miao6664659的专栏 1339

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 小甲鱼PE详解之输入表(导出表)详解(PE详解09)
下一篇: 小甲鱼PE详解之区块描述、对齐值以及RVA详解(PE详解06)
M-先生
博客等级 码龄17年 60粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值