您的位置:首页 > 其它

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

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

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

接下来就介绍一下如何利用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进制数据中写入文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: