dll文件和exe文件的段分区,使用resource hacker替换dll文件的string

张开发
2026/4/13 20:01:28 15 分钟阅读

分享文章

dll文件和exe文件的段分区,使用resource hacker替换dll文件的string
一、dll文件和exe文件的段分区DLL 文件和 EXE 文件在底层结构上几乎完全一样都使用 Windows 的 PEPortable Executable文件格式。它们不是严格分成“代码区、字符串区、二进制区”这三个区而是分成多个Section段/区每个段有自己的名字、用途和权限。DLL 和 EXE 的段结构完全相同唯一的区别只在 PE 头里的一个标志位DLL 会多一个IMAGE_FILE_DLL标志编译器和加载器就是靠这个标志来区分“这是可执行程序”还是“这是动态链接库”。常见的段Section及其对应你说的“区”段名称通常对应你说的“区”实际存放的内容权限特点备注.text代码区可执行的机器码CPU 指令只读 可执行这是真正的“代码区”EXE 和 DLL 都有.rdata字符串区部分只读常量、硬编码的字符串、调试信息只读大部分程序里的“字符串”在这里不是资源字符串.data二进制区部分已初始化的全局变量、可读写数据可读写程序运行时会修改的数据.rsrc二进制区 / 资源区资源图标、菜单、对话框、STRINGTABLE字符串表、图片等只读你之前修改的 STRINGTABLE 就在这里.reloc-重定位表DLL 加载时地址修正用只读DLL 特别重要EXE 也有.bss二进制区未初始化未初始化的全局变量编译器优化后可能为空可读写运行时分配内存.idata-导入表调用其他 DLL 的函数只读告诉你需要哪些 DLL“字符串区”其实分成两部分硬编码在代码里的字符串 → 通常在.rdata段只读。通过LoadString()加载的界面文字 → 在.rsrc段的STRINGTABLE资源里这就是你用 Resource Hacker 修改的那部分。“二进制区”不是一个正式的段它是你对.data、.rsrc、.rdata等存放数据的段的统称。真正的二进制数据图片、声音等大多在.rsrc里。为什么 DLL 和 EXE 结构几乎一模一样因为 DLL 本质上就是一个“可以被其他程序加载的 PE 文件”。Windows 加载器loader看到 PE 文件后如果是 EXE → 直接创建进程从.text段的入口点开始执行。如果是 DLL → 被其他程序LoadLibrary()加载执行DllMain()然后提供函数给调用者。实际例子用 Resource Hacker、PEiD、CFF Explorer 或 010 Editor 打开任何一个 DLL 和 EXE你会看到完全一样的 PE 头、段表只是入口点和标志位不同。小结跟你之前修改字符串直接相关你修改的STRINGTABLE位于.rsrc段资源段不是代码段也不是普通的 .rdata 字符串区。所以 Resource Hacker 的modify只针对资源段不会破坏 .text代码和 .data变量。DLL 和 EXE 的“区”划分是一样的你完全可以把 DLL 当成“没有 main() 函数的 EXE”来看待。可以用工具直观看到某个具体 DLL 的段分布和PE 结构二、使用resource hacker替换dll文件的stringResourceHacker.exe-opentest.dll-savetarget_modified.dll-actionmodify-resourcetemp.res-maskSTRINGTABLE,*,128这条命令的完整含义用Resource Hacker把test.dll文件里的字符串表STRINGTABLE资源替换成你事先准备好的temp.res文件里的内容最后保存成一个新的文件target_modified.dll。它不会破坏 DLL 的其他部分只针对字符串表做修改。逐个参数拆解参数含义具体解释ResourceHacker.exe程序本身你要运行的 Resource Hacker 可执行文件必须在当前目录或 PATH 里-open test.dll打开要修改的文件告诉工具我要修改的文件是test.dll可以是 exe、dll、ocx 等任意 PE 文件-save target_modified.dll保存修改后的结果修改完成后把新文件保存为target_modified.dll原文件不会被改动-action modify执行的操作类型modify 修改替换已存在的资源其他常见动作还有extract提取、add新增、delete删除、compile编译 rc-resource temp.res要塞进去的新资源最关键的一点这里必须是已经编译好的二进制资源文件.res不能是 .rc 文本文件。你之前失败就是因为传了 .rc导致报“资源名称和类型缺失”。-mask STRINGTABLE,*,128要修改哪一个资源精确指定要替换的资源类型、名称、语言。格式固定为类型,名称,语言ID-mask STRINGTABLE,*,128意思STRINGTABLE资源类型就是字符串表DLL 里存放所有界面文字的地方,*资源名称Name。*表示“所有”或“任意”Resource Hacker 在 modify 时常用*来匹配,128语言IDLanguage ID或字符串表块号128 是常见的字符串表块 IDString Table 的 ID 通常是 1、2、3…但很多程序会用 128 开头的数字如果想更保险可以改成下面几种写法根据实际情况选STRINGTABLE,,0→ 修改所有语言的中性字符串表最常用STRINGTABLE,,1033→ 只修改美式英语1033 是英文的语言IDSTRINGTABLE,128,0→ 只修改第 128 号字符串表块完整正确的使用流程已经有修改好的temp.rc纯文本只有 STRINGTABLE 那一段先编译成 .res别漏掉了ResourceHacker.exe -open temp.rc -save temp.res -action compile再执行这条命令ResourceHacker.exe -open test.dll -save target_modified.dll -action modify -resource temp.res -mask STRINGTABLE,*,128执行完后就会得到target_modified.dll里面的字符串已经被替换成temp.res里的新内容了。小建议少踩坑命令最好在命令提示符CMD或PowerShell里运行建议加上-log CON能实时看到输出ResourceHacker.exe -open test.dll -save target_modified.dll -action modify -resource temp.res -mask STRINGTABLE,*,128 -log CON如果还是报错把temp.rc的前几行内容贴出来检查语法。这条命令其实就一句话把 test.dll 打开用 temp.res 里的字符串表去替换它原来的字符串表然后存成新文件。三、dll和exe文件异同DLL 文件和 EXE 文件在底层结构上几乎完全一样都使用 Windows 的 PEPortable Executable文件格式。它们不是严格分成“代码区、字符串区、二进制区”这三个区而是分成多个Section段/区每个段有自己的名字、用途和权限。DLL 和 EXE 的段结构完全相同唯一的区别只在 PE 头里的一个标志位DLL 会多一个IMAGE_FILE_DLL标志编译器和加载器就是靠这个标志来区分“这是可执行程序”还是“这是动态链接库”。常见的段Section及其对应所说的“区”段名称通常对应你说的“区”实际存放的内容权限特点备注.text代码区可执行的机器码CPU 指令只读 可执行这是真正的“代码区”EXE 和 DLL 都有.rdata字符串区部分只读常量、硬编码的字符串、调试信息只读大部分程序里的“字符串”在这里不是资源字符串.data二进制区部分已初始化的全局变量、可读写数据可读写程序运行时会修改的数据.rsrc二进制区 / 资源区资源图标、菜单、对话框、STRINGTABLE字符串表、图片等只读你之前修改的 STRINGTABLE 就在这里.reloc-重定位表DLL 加载时地址修正用只读DLL 特别重要EXE 也有.bss二进制区未初始化未初始化的全局变量编译器优化后可能为空可读写运行时分配内存.idata-导入表调用其他 DLL 的函数只读告诉你需要哪些 DLL“字符串区”其实分成两部分硬编码在代码里的字符串 → 通常在.rdata段只读。通过LoadString()加载的界面文字 → 在.rsrc段的STRINGTABLE资源里这就是第二点里面的用 Resource Hacker 修改的那部分。“二进制区”不是一个正式的段它是对.data、.rsrc、.rdata等存放数据的段的统称。真正的二进制数据图片、声音等大多在.rsrc里。为什么 DLL 和 EXE 结构几乎一模一样因为 DLL 本质上就是一个“可以被其他程序加载的 PE 文件”。Windows 加载器loader看到 PE 文件后如果是 EXE → 直接创建进程从.text段的入口点开始执行。如果是 DLL → 被其他程序LoadLibrary()加载执行DllMain()然后提供函数给调用者。实际例子用 Resource Hacker、PEiD、CFF Explorer 或 010 Editor 打开任何一个 DLL 和 EXE会看到完全一样的 PE 头、段表只是入口点和标志位不同。小结跟你之前修改字符串直接相关第二点里面修改的STRINGTABLE位于.rsrc段资源段不是代码段也不是普通的 .rdata 字符串区。所以 Resource Hacker 的modify只针对资源段不会破坏 .text代码和 .data变量。DLL 和 EXE 的“区”划分是一样的完全可以把 DLL 当成“没有 main() 函数的 EXE”来看待。如果想直观看到某个具体 DLL 的段分布可以用工具快速查看 PE 结构

更多文章