无需重编 修改程序的静态变量初始值
来源:互联网 发布:微信刷票软件免费版 编辑:程序博客网 时间:2024/06/06 03:01
目前的具体应用环境就是要给发布版本的程序标记发布状态,程序经过发布工具 标记出当前的状态为 测试组版本 体验版 正式运营版 和 海外版 。
程序从研发部门出去以后理论上会通过不同部门之间的配合最后跑到正式运营的环境中,能可控的限制版本的使用对发布过程很有利。 一般发布以后想要在程序内部添加或修改一个签名都需要有源码重编,但除了研发部门外其他部门显然缺乏这种环境。
接下来就介绍一下如何利用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进制数据中写入文件
- 无需重编 修改程序的静态变量初始值
- static变量的初始值
- Java 变量 的 初始值
- asp.net修改配置文件无需重启IIS的原因
- 修改servlet可以无需重启tomcat的实现方法
- PHP关于变量$的初始值
- Oracle修改sequence的初始值
- 修改servlet无需重启tomcat
- 修改servlet无需重启tomcat
- 修改servlet无需重启tomcat
- 修改servlet后无需重启tomcat
- 修改servlet无需重启tomcat
- 修改java源码无需重启tomcat
- 计算流逝的时间--无需编代码
- 静态数据成员的初始值的指定
- 定义时指定初始值、静态初始化块为类变量指定初始值
- [java]4、静态变量的控制修改
- 修改java的静态final变量
- 序列化
- iOS7 AVAudioRecorder不能录音
- Dynamic Performance Tables not accessible
- linux c编程system与exec等区别简介
- C/C++ 语言中的表达式求值
- 无需重编 修改程序的静态变量初始值
- 72 Android WebView AlertDialog
- 基于visual Studio2013解决算法导论之020单链表
- EDA技术课后题答案
- [Leetcode] Binary Tree Inorder Traversal (Java)
- oracle教程之oracle10g 手动创建数据详解(linux)
- PHP上台阶问题(斐波纳契数列应用)
- gtest and make file reference
- netbeans 查找替换整个项目