逆向分析技术总结(转)

好久没写过文档了,今天把之前的关于逆向分析的一些心得总结一下,反正闲着也是闲着(本文不包含什么新的技术,只是将来源于各方的知识加上自己的心得进行总结而已,高手就不用看了)。
我认为软件安全攻防其本质是分析与抗分析之间的斗争。因为无论安全技术做的多么先进,一旦其代码意图被分析者掌握,就不在有安全性可言。想要更快速的分析程序不但要了解各种各样的软件保护措施,还需要更加清晰的认识逆向分析技术。下面简单的谈谈我对逆向工程的一些心得。
我认为逆向分析从总体上主要可以分为代码结构、数据结构、运算三点,以下进行详细说明(限于篇幅,下面只是大纲模式,具体内容相信网上都可以查到)。
注:对于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版的类的还原心得给我,呵呵。
Introduction This book is designed to help all programmers who have ever written their own software to better protect their software from illegal copying. It will also be useful to programmers creating freeware who wish to protect their source code. The idea to write a book like this came to me some time ago when I realized how poorly the topic is covered and how difficult it is to acquire the information necessary to adequately protect software. When I was involved with game production in the Czech and Slovak Republics, I was astonished at how simple their protection was, and that very often they had no protection at all — yet it is so easy to protect software, at least at a basic level. The problem lies in the lack of information and experience in this field. That's why I wrote this book, which will present many previously unaddressed topics concerning software protection. Protection as a Deterrent My experience tells me that there is no protection that cannot be easily removed and, as such, much of the work you will put into protecting your software is simply a deterrent, delaying the inevitable. It's only a matter of time, possibilities, and patience before a cracker cracks your software. Of course, the better your deterrent, the more time you'll have to sell your software before you find it available (or crackable) for free, online. What creators of a program or game would want to find their product, whether shareware or commercial software, pirated on the Internet the very day of the release? That would definitely result in reduced sales. Good software protection prevents the cracker from removing the protection correctly. With such protection, the program won't work, or won't work correctly, and more people will buy an original copy. Of course, a successful crack will appear in the course of time, but the time you buy is money earned. Really good protection will buy a considerable amount of time and will engender several versions of the crack, some of which w
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值