当前位置: 首页 > news >正文

从HelloWorld到GoodNight:手把手教你用OllyDBG修改PE文件字符串(附FOA/VA/RVA换算)

从HelloWorld到GoodNight:手把手教你用OllyDBG修改PE文件字符串(附FOA/VA/RVA换算)

逆向工程就像一场数字考古,而修改PE文件中的字符串则是新手最好的"洛阳铲"。今天我们将用OllyDBG这把瑞士军刀,完成从定位到修改字符串的全过程实战,顺便揭开PE文件中那些令人头疼的地址换算之谜。

1. 实验环境搭建与目标确认

工欲善其事,必先利其器。我们需要准备以下工具包:

  • OllyDBG 1.10:经典的反汇编调试工具
  • PEView:轻量级PE结构查看器
  • HxD:十六进制编辑器中的"记事本"
  • HelloWorld.exe:特别编译的测试程序(源码如下)
; HelloWorld.asm .386 .model flat, stdcall option casemap:none include windows.inc include user32.inc include kernel32.inc includelib user32.lib includelib kernel32.lib .data szText db 'HelloWorld',0 .code start: invoke MessageBox, NULL, offset szText, NULL, MB_OK invoke ExitProcess, 0 end start

提示:建议使用MASM32编译时关闭ASLR(/DYNAMICBASE:NO),这样ImageBase固定为00400000h,方便初学者理解。

我们的终极目标是将程序运行时显示的"HelloWorld"修改为"GoodNight",这需要完成三个关键步骤:

  1. 定位字符串在内存中的虚拟地址(VA)
  2. 计算对应的文件偏移地址(FOA)
  3. 使用十六进制编辑器修改磁盘文件

2. 字符串地址定位实战

2.1 静态分析定位法

用PEView打开HelloWorld.exe,按照以下路径追踪:

  1. 查看.data节的VirtualAddress(假设为3000h)
  2. 检查字符串"HelloWorld"在节内的偏移(假设为0h)
  3. 计算VA = ImageBase + VirtualAddress + Offset = 00400000h + 3000h + 0h = 00403000h
地址类型计算公式示例值
RVAVirtualAddress + Offset3000h
VAImageBase + RVA00403000h

2.2 动态调试验证法

启动OllyDBG加载HelloWorld.exe,在反汇编窗口可以看到:

00401000 >/$ 6A 00 PUSH 0 00401002 |. 68 00304000 PUSH OFFSET szText ; ASCII "HelloWorld" 00401007 |. 6A 00 PUSH 0 00401009 |. 6A 00 PUSH 0 0040100B |. E8 00000000 CALL <JMP.&user32.MessageBoxA>

这里PUSH OFFSET szText的地址00403000h与我们静态分析的结果一致。右键选择"Follow in dump"即可在数据窗口看到字符串的十六进制表示:

00403000 48 65 6C 6C 6F 57 6F 72 6C 64 00 HelloWorld.

3. 关键地址换算原理

PE文件在磁盘和内存中的布局差异是逆向工程的第一道门槛。我们需要理解三种地址的转换关系:

3.1 地址类型定义

  • FOA(File Offset Address):字符串在磁盘文件中的物理偏移
  • RVA(Relative Virtual Address):相对于ImageBase的偏移量
  • VA(Virtual Address):内存中的绝对地址

3.2 转换实战步骤

以我们的HelloWorld字符串为例:

  1. 通过PEView查看节表,找到包含00403000h的节(通常是.data)
  2. 记录该节的VirtualAddress(3000h)和PointerToRawData(800h)
  3. 计算节内偏移 = VA - ImageBase - VirtualAddress = 00403000h - 00400000h - 3000h = 0h
  4. FOA = PointerToRawData + 节内偏移 = 800h + 0h = 800h
# Python版地址转换函数 def va_to_foa(va, image_base, section_va, section_raw): rva = va - image_base offset_in_section = rva - section_va return section_raw + offset_in_section # 示例调用 print(hex(va_to_foa(0x00403000, 0x00400000, 0x3000, 0x800))) # 输出0x800

4. 字符串修改的三种姿势

4.1 内存热修改(OllyDBG)

  1. 在数据窗口Ctrl+G跳转到00403000h
  2. 双击十六进制区域直接修改ASCII码:
    • 原值:48 65 6C 6C 6F 57 6F 72 6C 64 00 (HelloWorld)
    • 新值:47 6F 6F 64 4E 69 67 68 74 00 (GoodNight)
  3. 注意字符串长度变化可能引发的内存问题

4.2 磁盘冷修改(HxD)

  1. 用HxD打开HelloWorld.exe
  2. Ctrl+G跳转到800h文件偏移
  3. 修改对应字节并保持长度一致(注意PE文件校验)

4.3 自动化脚本修改

import pefile pe = pefile.PE('HelloWorld.exe') for section in pe.sections: if b'.data' in section.Name: data_section = section break new_str = b'GoodNight\x00' pe.set_bytes_at_rva(0x3000, new_str) pe.write('HelloWorld_modified.exe')

警告:直接修改PE文件可能破坏数字签名,建议在测试环境操作

5. 进阶:导入表与字符串关系

理解导入表能帮助我们定位更多隐藏字符串。用PEView查看导入表结构:

  1. 定位数据目录表的第二个条目(导入表)
  2. 找到OriginalFirstThunk指向的INT(导入名称表)
  3. 跟踪到函数名指针数组

典型导入表结构层次:

  • IMAGE_IMPORT_DESCRIPTOR数组
    • OriginalFirstThunk → INT
    • Name → DLL文件名字符串RVA
    • FirstThunk → IAT

当我们需要修改DLL名称等系统字符串时,同样的地址换算原理依然适用。例如修改MessageBoxA的调用目标:

; 修改前 0040100B |. E8 00000000 CALL <JMP.&user32.MessageBoxA> ; 修改后可以跳转到自定义函数 0040100B |. E8 00104000 CALL 00402000

逆向工程就像与程序对话,而地址换算就是最基本的语法规则。当你在OllyDBG中成功看到"GoodNight"弹窗时,那种突破数字屏障的成就感,正是驱动我们继续探索的动力。下次可以尝试修改更复杂的资源字符串,或者hook导入函数实现更有趣的功能扩展。

http://www.jsqmd.com/news/775979/

相关文章:

  • 挤馅机源头厂家:产品竞争力提升与市场拓展策略深度解析
  • 2026四川粘钢加固服务商优选:5 家正规靠谱企业,专业做房屋结构加固 - 深度智识库
  • Hunyuan-MT-7B内容出海应用:自媒体一键生成英/日/韩/法/西多语版本
  • Windows鼠标指针方案一键切换:原理、工具与自定义指南
  • 拨开“分子递送迷雾”——百代生物以底层创新重塑核酸与蛋白质转染试剂版图 - 资讯焦点
  • 告别Adobe Acrobat!用Aspose.PDF for .NET 23.1.0实现PDF文档的自动化处理(附代码示例)
  • TranslucentTB终极指南:3步解决任务栏透明美化启动失败问题
  • 2026年陕西画册印刷厂、图文快印代工与不干胶标签印刷全景指南 - 精选优质企业推荐官
  • CTF密码学实战:当RSA公钥e过大时,如何用Boneh-Durfee攻击还原DASCTF的so-large-e题目
  • 大人吃的鱼油什么牌子好?2026知名鱼油品牌推荐:心脑养护效果科学温和超明显 - 资讯焦点
  • 户外工地长效防晒霜,4款超绝的全波段防护不惧晒黑的高口碑防晒 - 全网最美
  • 2026 南京大克重黄金上门回收:福正美双人作业,全程录像备查 - 福正美黄金回收
  • 深沟球轴承选型与应用技术全解析 附厂家实测案例 - 资讯焦点
  • Spring Boot 3.2升级踩坑记:MyBatis-Plus依赖不兼容导致项目启动报错,我是这样解决的
  • 保姆级教程:用FreeSWITCH图形化界面,把办公室的讯时FXO网关注册到公网IPPBX
  • NCMDump终极指南:三步实现网易云音乐NCM转MP3免费转换
  • 开题一次过的秘密:虎贲等考 AI 开题报告功能,让导师零驳回
  • 2026年一次性内裤选购指南:纯棉材质与无菌生产如何重新定义出行干净标准 - 资讯焦点
  • 开源智能仪表盘OpenJarvisDashboard:从模块化设计到实战部署全解析
  • 保姆级教程:用TensorRT C++ API将ONNX模型转成Engine文件(附完整代码)
  • 为开源Agent框架OpenClaw配置Taotoken作为自定义模型提供商
  • 2026年论文90%AIGC率怎么破?实测10款降ai率工具(含免费),降低ai率实用指南 - 降AI实验室
  • 2026年沙场筛沙机式厂家推荐:邢台润然机械制造厂,自动/水洗/手推多种型号可选,适配不同场景 - 品牌推荐官
  • 2026年西安画册印刷厂与活页环装定制完全指南|西安松林森彩印官方对接 - 精选优质企业推荐官
  • CLIP-GmP-ViT-L-14图文检索实战:单图多文批量匹配详细步骤
  • 实证论文卡壳在数据分析?虎贲等考 AI:一键跑出规范结果,第四章直接复制用
  • 2026年西安印刷厂选型指南:从活页环装到不干胶标签的一站式解决方案 - 精选优质企业推荐官
  • TargetMol疾病造模——PMA(Cat。 No。 TQ0198, Cas。 16561-29-8),经典PKC激活剂 - 陶术生物
  • 告别默认蓝:手把手教你为WPF项目定制一套专属的HandyControl主题色(附完整配色方案)
  • Vivado ILA的隐藏玩法:用Advanced Trigger和TSM编写,像写程序一样精准触发