修改程序功能的方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Vo ] . 1 2 , No . 3 பைடு நூலகம் ,No v e mb e r 2 0 1 6
Te l : + 8 6 — 5 5 1 — 6 5 6 9 0 9 6 3 6 5 6 9 0 9 6 4
修 改程序功能的方法
史 永 林, 倪安 胜, 王宁 燕
( 西安通信学院 , 陕西 西安 7 1 0 1 0 6 )
在工作 中我们 经常会遇 到一些需要修改 现有 程序 的情况 , 如修 改程序界 面 , 对程 序输入输 出数 据进行加解 密 , 修改程 序 的某些功能等 。对于游戏爱好 者来 说 , 能 自己做一个游戏外 挂 将是很有效增 加积分 的方法 。对于研究病毒 的人 来说 , 修 改程 序是 一种病毒感染 的常用方 法。
执 行文件 进行修 改或进 行运行 控制 , 改变 其运行行 为 , 以达 到 我们 的 目的。这 可以通过两种方式 进行 , 一种是静态修改二进 制文 件 , 另外一种是 动态捕获软件对系统功能 的调用 。
2静 态 方法
这种 方式主要是对 二进制 的程序进 行直接修改 , 从而改变
其行 为。从原理上讲 , 这种方 法可 以实现 和修 改源代码一样 的 功能 , 但在现今 的技术条 件下 , 我们 只能实现有限的修改功能 。 如 果是 用解 释型语 言 编写 的程序 , 如f o x p r o 、 i a v a 等, 可 以 使用 逆 向工程工具 进行反 编译 , 可 以较大 程度上恢 复源代码 , 这样对程序 的修改就 比较方便 了, 如f o x p r o 程序 , 可 以基本上恢 复 为源代 码 。但 有些 解释 性语 言如 c # , i a v a 等, 只能恢 复一部 分代码 。对这种形式程 序的修改可参 阅一些逆 向工程 的书籍 , 如文献[ 1 ] , 本文不作讨论 。 如果 只是 修改软 件 的资源 , 如进行 汉化等 , 可 以使用 一些 汉化工具直接对 资源进 行修改 。 静态修改 基本上遵循 如下步骤 , 首先对二进制程 序进行反 汇编 , 使用高级 反汇编工具 , 如I D A P r o 可 以较大程 度上获得各 个模块 的调 用关 系和程序 的基 本框架 , 以及对 w i n d o w s A P I 的 调用情况 等。然后对反 汇编的汇编代码进行 分析 , 找出要 修改 部分 的代码所 在 的位置及 调用关 系等 。最 后使用 二进制 编辑 器, 如H e x Wo r k s h o p 等或者编写程序对二进 制文件进行修改。 其实采用 静态方法修改 程序功能受到很 多方 面的 限制 , 一 般只 能做简单 的修 改 , 如c r a c k 密码 , 跳过某 些执行 代码等 , 要 进行功能很 复杂的修改则需要 克服很多 的困难 , 有 时甚 至是不 可能完成 的。 比如上面所说 步骤 中的第二步 , 找 到待修 改的位 置, 这 其实 是一 个非 常 困难 的工作 , 也 是修 改 的关键 性步 骤 。 二进 制文件 的反汇 编代码 非常大 , 即使使用 I D A P r o 这样 的工 具也 只能获得 一个很复杂 的调用关系图 , 而且和源代码 的调用
摘要 : 文章从静态 和动态两个方面介绍 了修改程序功能 的几种方法 , 并 总结 了各种方法的优缺点。
关键词 : 修改 ; 程序功能 ; 截获 系统调用
中图分类号 : T P 3 1 1 文献标识码 : A 文章 编号 : 1 0 0 9 . 3 0 4 4 ( 2 0 1 6 ) 3 1 - 0 0 5 9 — 0 2
I S S N 1 0 0 9 -3 0 4 4
E — ma i l : x s j l @d n z s . n e t . c a
h t t p : H w w w. d n z s . n e t . a n
C o m p u t e r K n o w l e d g e a n dT e c h n o l o g y电脑 知 识 与技术
A P I 函数 , 因为软件不 管其 功能如何 复杂 , 其都是在调用系统 函 数 的基础上完成 的 , 例如N o t e P a d 程序就是 调用 T e x t O u t 或T e x . t 0 u t w 函数将 文本显 示在 窗 口中的 , 如果 我们截 获此调 用 , 则 可以截获显 示在 窗 口中 的数 据 , 可以进行及 时翻译 、 数据解 密 等 工作 。对于对输入输 出数据 ( 如硬盘数据 , 网络数据等 ) 的加
关系 图有很 大的差距 。我们知道汇编代码 的可读性是很差 的 ,
这种反 汇编 的代 码 的可 读性更差 。一般通 过动态调试 和静态 分析相 结合 的方 法来分 析程序 的结构 。第 三步文件修 改也涉 及很多工作 , 如代码放置位置 、 文件头修改 、 输 入输 出函数表修 改、 函数重 定位等 , 但好在 这部分有较成熟 的技术 , 也有一些工 具可以做这部分工作 , 有兴趣 的可参 阅文献[ 2 】 。
1 概 述
如果我们 能获得 程序 的源代 码 , 一切 都迎刃 而解 了 , 直 接 修 改程序代码 , 可 以做任 何我们想做 的修 改。但大多数情况下
我们并不能获得 程序的源代码 , 这 时我们 就需要对二进制 的可
3动态 方 法
动态方 法 的核 心思 想就 是截获 系统 调用 , 也就 是系统 的
解 密工作 , 可 以通过各 自专有 的机制进行 , 如对 硬盘数据 可 以 采用 I F S ( I n s t a l l a b l e F i l e S y s t e m) 的过滤驱动来实现 , 详见 [ 3 】 , 对 网络数据可 以采用 N D I S ( N e t w o r k D r i v e r I n t e r f a c e S p e c i f i c a t i o n ) 来实现 , 详见[ 4 ] , 但这种方式是 针对 整个系统进行的 , 对 系统 的 性能有较 大影响 , 而且实现很复杂 , 需要 较强的技术基础 , 我们 修 改的是某 个程序 的功能 , 不需要 在整个 系统 级别上进行 , 我 们 只要捕 获 此程序 的相 应 的输入输 出函数 即可 , 如对 网络 的 WS AS e n d和 WS A R e c v等 函 数 , 硬盘的R e a d F i l e和 Wr i t e F i l e 等 。游戏外 挂制作可能根据需要使用多 种技术 , 如模拟 鼠标 和 键盘消息来 自动操作游戏 , 自动发送和捕获 网络数据包进行游 戏操作模拟 等 , 这里对数 据包 的捕获即可 以通过截获系统调用 来实现 。 截获系统调用有 多种方法 , 总体上可以分为 内核层捕获 和 用户层捕 获两种 。内核层 捕获工作在 内核层 , 也 就是 r i n g 0 级, 主要是通过对 w i n d o w s 并 未正式公布的一些 内部数据结构 的修 改和操 作来达 到捕获 函数 的 目的 , 这种 方法捕获 的层次低 , 可 以更接 近原始 的数据 , 可 以对所 有 的用户 层进程进行 捕获 , 受 用户层程序 的影 响小 , 缺点是在 内核层 编程 , 程序调试 、 安装和 与用户层程序通信都较复杂, 另外因为使用的都是 w i n d o w s 并 未正式公 布 的一 些 内部数 据结构 , 程序 的可移植性较 差 , 可能 只能在 特定 w i n d o w s 版本上运行 。用户层 捕获工作在 用户层 , 也就是 r i n g 3 级, 主要 是通过 对进程 的输入 函数表进 行替 换或 修改被捕获 函数来实 现的 , 这种方式 的优 点是只影响相应的进 程, 对整个 系统性能影 响小 , 编程方便 , 容易实现 , 可移植 性较 好, 缺 点是 很难实现对所有进程 的捕获 , 因为工作在用户层 , 所
相关文档
最新文档