目录
在当今数字化的时代,逆向工程成为了计算机领域中一项极具挑战性和实用性的技术。本文将带您深入了解逆向工程的世界,从基础概念到实际应用,再到分析方法和流程,为您揭开逆向工程的神秘面纱。
一、逆向工程培训课介绍
(一)课程信息
本次逆向工程培训课时间是从 02:30 到 05:30,总共分为三节课,每节课上课 50 分钟,然后休息 10 分钟。在上课过程中,如果您有任何疑问,可以在聊天区提出。老师会在下一节课上课之前以及三节课结束后,集中抽出 10 - 15 分钟的时间来回答大家的问题。
(二)课程目录
- 概念讲解:首先会带大家认识逆向工程相关概念,这是理解后续内容的基础。
- 编译原理介绍:了解从 C 语言代码到可执行程序的过程,这有助于理解程序的生成机制。
- 汇编语言学习:汇编语言是逆向工程的核心,不懂汇编语言就很难进行逆向工作,所以这部分内容至关重要。
- 逆向工具介绍:熟悉常用的逆向工具,它们是我们进行逆向分析的得力助手。
- 实战练习:通过实际操作,带领大家体验整个逆向过程,比如破解软件,让大家学以致用。
- 建议与推荐:给出逆向建议和相关书籍推荐,帮助大家进一步深入学习。
- 作业布置:通过作业巩固所学知识,提升逆向能力。
二、逆向工程的概念
(一)定义
逆向工程,又称软件反向工程(software reverse),是指从可运行的程序系统出发,运用解密、反汇编、系统分析程序、算法理解等多种计算机技术,对软件的结构、流程、代码等进行逆向拆解和分析,从而推导出产品的源代码、设计原理、结构算法或者一些特征。简单来说,就是反着来,从可执行程序拆解出源代码,并分析出系统特征。
例如,我们可以打开一个名为 “crack me” 的可执行程序,当我们点击运行它时,会得到一些执行结果,但我们并不清楚程序在背后进行了什么操作。而逆向工程就是通过反汇编等方法来查看程序运行时到底进行了哪些操作。
(二)平台差异
逆向工程在不同平台上有不同的要求和特点。它涉及 windows、linux、安卓等多种平台,在这些平台上进行逆向分析时,需要利用相应的常用工具对源代码以及二进制文件进行逆向分析。同时,还需要掌握如加解密、内核编程算法、反调试和代码混淆技术等。这是因为不同平台的程序结构和运行机制有所不同,而且为了防止逆向,开发者会在软件中加入各种防护技术,如反调试和代码混淆,增加逆向的难度。
三、逆向工程的用途
(一)用高级语言重现高级元
逆向工程可以通过分析已经编译好的软件,来用高级语言重现高级元。例如,在虚拟机中,我们有一个简单的 C 语言文件 “hello.c”,内容是 “printf ("hello world");”,它编译好之后成为二进制文件 “hello.out”。很多时候我们只有二进制文件,但需要由这个可执行文件反推出它的高级源代码,这就是逆向工程的一个重要作用。
(二)分析病毒
当我们执行一个程序时,可能并不知道它在背后真正进行了什么操作,它有可能嵌入了木马等恶意程序,但普通用户很难察觉。逆向工程可以分析病毒,从中提取出特征码,然后开发杀毒程序。这就是为什么像 360 等杀毒软件能够检测出恶意文件,因为它们存储了病毒的特征码,而这些特征码就是通过逆向工程分析得到的。
(三)高级代码审计
一般的代码审计是针对高级语言的源代码,比如 C、Python 等语言的代码。而逆向工程可以在汇编层面进行代码审计,虽然汇编语言比高级语言更难理解,但这种审计方法能够发现通过高级语言审计看不到的内容,门槛虽高但效果显著。
(四)制作游戏外挂及破解软件
逆向工程可以用于制作游戏外挂,比如在游戏里面附加一段程序或者跳过游戏的参数限制。同时,也可以用来破解软件。例如,软件通常要求输入用户名、口令或激活码,它会对输入的激活码进行计算,然后和软件里面存储的值进行匹配。如果我们会逆向工程,找到匹配的地方进行修改,就可以在没有激活码的情况下使用软件,网上很多破解软件都是通过这种方法制作的。
(五)分析挖掘嵌入式设备中的漏洞
随着物联网的发展,嵌入式设备越来越多。这些设备不像 windows 或 linux 操作系统有用户友好的界面,里面只有一些简单的程序。逆向工程可以分析这些嵌入式设备里面的程序,挖掘其中的漏洞,因为这些嵌入式设备的漏洞在网络安全中越来越重要。
四、逆向工程的分析方法
(一)静态分析技术
静态分析技术是在不执行计算机程序的条件下对代码进行分析,找出代码缺陷。一般是利用静态分析工具,如 IDA Pro 等,将二进制的可执行文件翻译成汇编代码或者 C 语言的伪代码。这里的伪代码有两层含义:一是由汇编代码反推到 C 语言代码时,不是唯一的,因为实现相同功能可以有多种不同的代码写法;二是静态分析工具是按照一定规则进行翻译的,也不是百分之百正确,有时候我们需要自己查看汇编代码来解决问题。
静态分析有以下优点:
- 直接分析源代码:能够直接看到程序的细节,比如我们用 IDA Pro 打开 “correct me” 程序,就能知道它里面执行的操作和流程,都是以汇编语言的命令形式呈现,如 push 等。
- 检测所有代码级别可执行路径的组合,快速准确:程序在运行时会根据输入参数或环境的不同进行不同的跳转,静态分析可以从总体上把握程序的各种可能性。
- 不执行程序,不会被恶意代码攻击:在分析可能带有病毒程序的文件时,这是一个很大的优势。因为如果直接执行病毒程序,计算机可能会受到攻击,而静态分析只是解析程序,让我们看到汇编代码,不会执行程序中的恶意代码。这里建议大家在做网络安全与逆向分析时,最好使用虚拟机,像 VMWare 就可以搭建多台虚拟机,在虚拟机里面进行操作。即使虚拟机受到攻击,还可以通过保存的快照返回到之前未受攻击的状态,避免主机受到影响,因为有些病毒隐藏很深,处理起来非常麻烦。
(二)动态调试技术
动态调试是与静态分析相对的概念,它是执行程序,破解者利用调试器跟踪软件或程序的运行,寻找破解的路径。主要是观察程序在运行过程中的状态,比如寄存器的内容、函数的输入输出、内存的使用情况和内存的值等,通过这些来分析函数的功能,明确代码逻辑。
在动态调试中,重点要关注两个流:
- 代码流:看程序的代码是按照什么样的方式和流向来执行的。例如 “correct me” 程序有很多代码块,会进行跳转,有些代码在动态运行时可能不会被执行,通过动态运行可以判断真正执行的代码顺序。
- 数据流:关注程序输入的数据在程序执行中的流动方式,比如数据先到哪一块代码,进行什么样的运算,然后又到哪个函数,又进行什么样的运算,把运算结果再进行后续的什么操作。把代码流和数据流弄清楚,软件的功能也就基本分析清楚了。
动态调试的优点是可以更好地判定程序执行的流程。比如在破解需要用户名和口令登录的软件时,可以通过动态调试跟踪输入的用户名和口令在程序中的操作,比如经过多次 MD5 计算、AES 计算和编码等一系列操作后得到哈希值,然后和软件中存储的哈希值进行比对来验证登录信息。如果不知道用户名和口令,可以通过逆向分析澄清中间的计算过程,然后进行口令爆破,即使用弱口令和用户名密码字典不断进行计算,直到得到的哈希值和程序中要校验的哈希值相等,从而破解系统。
五、程序壳相关内容
(一)定义
程序壳是一种反调试技术,就像在程序外面包裹一层代码,目的是保护里面的代码不被正确反编译或非法修改,阻挠逆向分析。它加载到内存时一般先于程序运行,拿到控制权后再加载程序。
(二)分类
- 应用压缩壳:这是最常见的一种,它利用特殊的算法对 EXE 或 DLL 等资源进行压缩,执行时在内存中完成解压,对于普通用户来说没有任何感知上的差别。例如,没加壳的 EXE 文件直接在内存里执行,而加壳后的 EXE 文件会在内存中先执行 loader 壳(引导程序),这个壳会在内存里把原来压缩的文件解压缩,得到原来的 EXE 文件后再执行。
- 加密壳:这种壳不是进行压缩,而是对程序进行加密,技术难度更大,防护效果也更好。随着逆向和防护技术的发展,矛和盾不断进化,有加壳工具,也有相应的去壳工具。
六、逆向分析的基本流程
(一)初步了解程序信息
使用 study pe e 等工具初步了解程序的信息,比如把要分析的程序拖入 start DP 软件,它会告诉我们程序是 32 位 PE 文件、MD5 值、文件类型等基本信息,通过这些我们可以初步了解程序的特点。
(二)静态分析
使用 IDA 或者 IDA Pro 等工具进行静态分析。在分析过程中,如果遇到不懂的算法,可以通过谷歌或者 GITHUB 搜索算法特征,找到算法源代码,这对于分析复杂加密算法非常有帮助。因为现代的加密算法都很复杂,如果直接逆向从零分析会非常困难,通过这种方式可以大大提高分析效率。
(三)绕过程序保护机制
程序的保护机制包括代码混淆、保护壳、反调试技术等。代码混淆会加入一些干扰分析的代码;保护壳如前面介绍的有压缩壳和加密壳;反调试技术是指程序在运行时会检测是否被调试,比如正常运行程序时指令之间的时间很短,但调试时会暂停在某一步查看寄存器和内存内容,停留时间长,反调试技术就会发现这种调试行为并进行干扰,如强制关闭程序或加密混淆后面的代码。不过,网络安全就是一个矛和盾的博弈过程,有保护机制就有绕过的办法。
(四)定位关键代码
由于一个程序的代码量可能很大,从几千行到几万行甚至十几万行都有,所以要定位出关键的代码,比如进行关键计算或关键跳转的代码,这样才能更有针对性地进行分析。
(五)动态分析
使用动态调试工具运行目标程序,验证自己之前通过静态分析得出的关于关键代码运行机制等的猜想。这是一个反复的过程,如果在动态运行过程中发现有超出理解或者还没弄懂的地方,可以再次进行静态分析,通过这样的反复来澄清程序的功能。
(六)完成逆向分析目的
根据程序的功能写出对应的脚本或者工作报告。如果是为了破解软件,就要编写一个脚本来实现破解;如果是为了分析病毒的机制,就要写一个报告,说明病毒的特征和攻击方式等。对于警察学院的同学来说,可能会接到分析国外恶意程序攻击方式的工作任务,或者在 CTF 竞赛中,要根据逆向分析程序获取 flag,这些都需要完成相应的报告或脚本。
总之,逆向工程是一个复杂但又充满魅力的领域,它在网络安全、软件破解与分析等多个方面都有着重要的应用。希望通过本文的介绍,能让您对逆向工程有更深入的理解和认识。