无需重编 修改程序的静态变量初始值

本文介绍了如何在不重新编译的情况下,通过修改ELF可执行文件的静态变量初始值来标识程序的发布状态,如测试组版本、体验版、正式运营版和海外版。详细阐述了针对有符号表和无符号表的程序,如何利用Linux下的ELF文件格式进行修改,涉及对段表、符号表、数据段的查找和操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前的具体应用环境就是要给发布版本的程序标记发布状态,程序经过发布工具 标记出当前的状态为  测试组版本 体验版 正式运营版 和 海外版 。

程序从研发部门出去以后理论上会通过不同部门之间的配合最后跑到正式运营的环境中,能可控的限制版本的使用对发布过程很有利。 一般发布以后想要在程序内部添加或修改一个签名都需要有源码重编,但除了研发部门外其他部门显然缺乏这种环境。

接下来就介绍一下如何利用coff文件格式来修改思路和方法流程

介绍的方法基于linux下的elf 可执行文件, 对于window 下的 exe 也是同理( pe文件也属coff同支)

需引入 /usr/include/elf.h 文件

1 对于有符号表的可执行程序 (gcc -g 生成的可供调试的程序)

 1.1 打开文件,从文件首字节开始映射 Elf32_Ehdr 结构, 通过此结构找到段表位置和个数 Elf32_Ehdr :e_shoff  和 Elf32_Ehdr :e_shnum 并加载到 Elf32_Shdr 段表数组里

 1.2 通过 段表字符串表 索引 Elf32_Ehdr :e_shstrndx 找到符号表数据 ,并以此构建出段表字符数组

 1.3 通过匹配段表数组中 Elf32_Shdr :sh_name   在 段表字符数组 中的字符表示 ,找出 符号表 '.symtab' 和 字符串表 '.strtab'

 1.4 通过符号表的 数据偏移Elf32_Shdr :sh_offset  和 数据大小 Elf32_Shdr :sh_size 构造出符号表数组 Elf32_Sym

 1.5 变量符号表数组中数据 的 符号名称 Elf32_Sym :st_name 找到 变量关键字 所对应的符号

 1.6 通过Elf32_Sym :st_shndx 找到符号 所处数据区(.data 或 .rodata数据区都有可能)  

 1.7 符号计算出对应其所处数据区的相对位置 Elf32_Sym : st_value  -  Elf32_Shdr : sh_addr

 1.8 按所知类型修改文件中 变量所处位置的二进制值  Elf32_Shdr : sh_offset + ( Elf32_Sym : st_value  -  Elf32_Shdr : sh_addr )

2 对于没有符号表的可执行文件 只能通过找全局变量的初始值来修改 ( 这里面存在一种未赋初值或初值为0的情况, 由于这种情况下变量会划归与bss段而在实际执行文件中并无分配内存所以无法修改)

 2.1 同 1.1

 2.2 同 1.2

 2.3 通过匹配段表数组中 Elf32_Shdr :sh_name   在 段表字符数组 中的字符表示 ,找出 数据段 '.data' 和 只读数据段 '.rodata'

 2.4 数据偏移Elf32_Shdr :sh_offset 定位到数据段区,优先匹配数据段,然后是只读数据段

 2.5 按给出的数据类型为步长遍历匹配 数据段中数据,找出第一个匹配的位置偏移

 2.6 转换目标值到2进制数据中写入文件


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值