设为主页 | 加入收藏 | 繁體中文

逆向分析技术总结

  好久没写过文档了,本日把之前的关于逆向分析的一些心得总结一下,横竖闲着也是闲着(本文不包罗什么新的技术,只是未泉源于各方的知识加上自己的心得进行总结而已,妙手就不消看了)。
  我以为软件宁静攻防其素质是分析与抗分析之间的妥协。因为无论宁静技术做的何等先进,一旦其代码意图被分析者掌握,就不在有宁静性可言。想要更疾速的分析程序不但要了解各种百般的软件保护措施,还需要更加清晰的了解逆向分析技术。下面简略的谈谈我对逆向工程的一些心得。
  我以为逆向分析从总体上主要可以分为代码结构、数据结构、运算三点,以下进行详细阐明(限于篇幅,下面只是大纲形式,具体内容信赖网上都可以查到)。
  注:对付Debug版本和Release版本程序的处理思路上是一致的,因而下面没有分外区分。但实现方法却有很大区别,许多Release版本代码处理方法我还在探索中,因而就不写了。
  一.  代码结构。
  代码结构决定了程序的执行过程以及数据走向。首先理解程序的代码结构,可以把整个程序的框架给勾勒出来。接下来进行各个部分的粉饰。可以有用提高逆向速率。代码结构分析总的分为以下几点:
  1.  比较操纵。
  A.  有符号数比较。
  B.  无符号数比较。
  C.  条件码(各种条件码的组合果断我记不住,可以列成表格以便盘问。平常用上的不多,除非要准确还原代码)。
  2.  条件分支。
  A.  单分支条件(if)。
  B.  双分支条件(if-else)。
  C.  Switch条件。
  D.  组合条件。
  E.  纯算术实现逻辑分支(运算后条件码的果断,具体可参看加密解密第三版)。
  F.  条件设置指令(SETcc)。
  G.  条件传输指令(CMOVcc)。
  3.  循环。
  A.  先执行循环(do-while)。
  B.  后执行循环(for/while)。
  C.  循环控制及break/continue。
  4.  函数。
  A.  函数调用及功效的疾速辨认。
  B.  调用商定。
  C.  参数传递方法。
  D.  货仓平衡。
  E.  函数导出及导入。
  5.  代码优化。
  A.  代码速率优化。
  B.  代码巨细优化。
  二.  数据结构。
  当辨认了代码结构并勾勒出整个代码框架之后,接着要做的便是辨认程序中的各种数据结构。比如程序是一棵大树,如今曾经有了枝干,我们要做的便是添加树叶。数据结构的分析我主要分为以下几点。
  1.  货仓(Debug版与Release版的货仓使用有很大区别)。
  2.  全局变量。
  3.  局部变量。
  A.  货仓中的局部变量辨认。
  B.  存放器变量。
  4.  变量的导入导出。
  5.  常量。
  6.  数组。
  A.  简略数组。
  B.  多维数组。
  7.  结构体与联合体。
  8.  链表。
  A.  单向链表。
  B.  双向链表。
  C.  循环链表。
  D.  二叉树。
  E.  图等高级链表我没逆向过。写在这里只是阐明一下思路。
  9.  类。
  Release版程序的类的还原我目前还不是很熟悉。对付Release版没被使用过的类成员的分析还在探索中。
  A.  成员变量。
  B.  平凡成员函数(容易与编译器默认的结构函数混淆)。
  C.  虚函数表及继承派生。
  D.  通过结构函数辨认类与类的关系。
  E.  析构函数。
  F.  类的作用域。
  三.  运算。
  当数据结构辨认终了后,程序大树的树枝和树叶都有了,不过这棵树依然不是活的。而运算就像是血一样将数据结构和代码结构牢牢的联合在一起。当运算处理终了后,这个树才是个活生生的树,可以完成各项生命活动。运算分析我主要分为以下几点。
  1.  逻辑运算。
  2.  数据范例转换。
  A.  零扩展。
  B.  符号扩展。
  3.  浮点运算。
  A.  数据款式。
  B.  FPU存放器。
  C.  浮点操纵。
  4.  整数运算。
  A.  加法减法。
  B.  乘法除法。
  C.  模运算。
  D.  16、32位运算。
  E.  大数运算。
  5.  标志位。
  A.  溢出标志位(CF/OF)。
  B.  零标志位(ZF)。
  C.  符号标志位(SF)。
  D.  奇偶标志位(PF)。
  6.  运算的代码优化及辨认。
  固然,真正的代码逆向分析绝对不会是根据以上的次序去世板的进行,而是灵活运用。以上所述纯粹是底子。当这些都掌握了之后,代码的逆向速率会显着的提高。这些知识整理在大脑中就像书的目次一样可以疾速定位到所需要的部分(每个人的思维方法都不一样,他人怎样思维更疾速我不知道)。
  以上的框架也是我自己的一个学习过程。看上去和程序计划差不多,我学习的时间是通过C、C++程序的各种处理方法反过去一点一点的学习。学习一遍之后心里天然有了个简略的框架,我以为逆向分析作为底子,如果能够纯熟掌握可以加速其他方面的学习进度,比如:漏洞分析、外壳分析等。磨刀不误砍柴时嘛。本文旨在抛砖引玉,盼望有妙手能够提供一些关于Release版的类的还原心得给我,呵呵。
 


    文章作者: 福州军威计算机技术有限公司
    军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。

TAG:
评论加载中...
内容:
评论者: 验证码: