首页
社区
课程
招聘
[原创]逆向分析技术总结
发表于: 2009-3-5 10:29 13308

[原创]逆向分析技术总结

2009-3-5 10:29
13308

好久没写过文档了,今天把之前的关于逆向分析的一些心得总结一下,反正闲着也是闲着(本文不包含什么新的技术,只是将来源于各方的知识加上自己的心得进行总结而已,高手就不用看了)。
        我认为软件安全攻防其本质是分析与抗分析之间的斗争。因为无论安全技术做的多么先进,一旦其代码意图被分析者掌握,就不在有安全性可言。想要更快速的分析程序不但要了解各种各样的软件保护措施,还需要更加清晰的认识逆向分析技术。下面简单的谈谈我对逆向工程的一些心得。
        我认为逆向分析从总体上主要可以分为代码结构、数据结构、运算三点,以下进行详细说明(限于篇幅,下面只是大纲模式,具体内容相信网上都可以查到)。
        注:对于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版的类的还原心得给我,呵呵。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (17)
雪    币: 161
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
请问楼主知道watcom的全局变量的符号表是怎么建立的吗,或者告诉我分析方法也行
2009-3-5 10:43
0
雪    币: 104
活跃值: (72)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
3
非常不错支持一个~
2009-3-5 10:54
0
雪    币: 362
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=;]...[/QUOTE]
符号表建立应该是编译连接时的操作吧,我没研究过,我只关心生成的可执行文件。很抱歉。
2009-3-5 11:00
0
雪    币: 263
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
向雷锋同志学习
2009-3-5 11:05
0
雪    币: 161
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
那你知道怎么是数据段的全局变量全对上吗
2009-3-5 11:47
0
雪    币: 362
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
你的话我不知道什么意思。
2009-3-5 11:49
0
雪    币: 161
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
就是数据局段的全局变量相对位置也和可执行文件反编译后的全局变量相对位置一样
2009-3-5 11:57
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
标记
谢谢总结
2009-3-5 12:09
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
10
这个应该出现在wiki里
2009-3-5 12:45
0
雪    币: 362
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
你的意思是不是说源代码中的全局变量的排列顺序和编译后的全局变量排列顺序一样?这个你随便编译一个程序调试一下不就知道了
2009-3-5 13:13
0
雪    币: 161
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
老大,上百个变量怎么调试,而且已经写过测试程序,很难法相规律,编译原理上说是用了平衡二叉树或者哈希表,你遇到这种情况要怎么办
2009-3-5 13:39
0
雪    币: 362
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
13
我逆向程序时不关心全局变量排列顺序,商业程序太过庞大。我只管我需要的部分。即使告诉你某块内存是100个全局变量,你又如何区分是字节、字、双字还是其他结构呢?还需要一点一点分析,难道你想一个口吃下整个程序?
2009-3-5 14:20
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
感谢share,收下了!
2009-3-5 17:22
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
15
总结的很好。
2009-3-6 09:33
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
这个总结确实好,希望能看到更多的这种文章。
2009-3-7 21:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
直接看Reversing:逆向工程解密的附录就好……
貌似LZ的总结跟这个附录的大纲一样哈哈~~

难道LZ是这书的作者?
2009-3-8 01:13
0
雪    币: 362
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
18
大部分应该一样,本来就不是新技术。我都说过是收集的资料,既然是收集的资料,肯定大多数重复。你也可以说和加密解密第三版一样。
2009-3-9 09:05
0
游客
登录 | 注册 方可回帖
返回
//