查看: 2827|回复: 2
收起左侧

[讨论] 为初学者提供的恶意软件逆向分析教程(一)——从0x0开始

[复制链接]
Mod123xsd
发表于 2022-2-4 23:03:53 | 显示全部楼层 |阅读模式
本帖最后由 Mod123xsd 于 2022-2-5 17:16 编辑

前言
       研究恶意软件的人员需要学会一组多样化的分析技能,通常是通过经验和自我培训逐渐获得。逆向工程是恶意软件分析和研究的一个组成部分,但它也是研究人员可能拥有的最先进的技能之一。这也是组织缺乏逆向工程人才的原因之一。许多缺乏经验的研究人员在逆向工程中很难进步。提升相关的知识和术语在逆向工程中可以获得一个更高的起点,这是恶意软件逆向研究人员的一个差异化因素。      
       本系列将为没有逆向工程经验但希望学习逆向工程的人员提供逆向工程的基础知识。在第一部分中,您将了解基本的计算术语和汇编语言。


恶意软件逆向工程介绍
什么是逆向工程?
       在软件中,逆向工程是指了解一个程序的功能和能力。
       逆向工程有不同的目的,从漏洞和编译器研究,到重建丢失的源代码和提高性能。恶意软件逆向工程特别注重了解恶意软件的能力和功能,以补救已经产生的威胁和研究不同的恶意软件家族。

你什么时候会对恶意软件进行逆向工程?
       逆向工程可能是非常耗时的。在研究一个恶意软件时,你通常不会马上开始逆向分析它。相反,你应该通过在沙盒中运行恶意软件、提取字符串等方式进行简单的恶意软件分析。如果需要,这个最初的恶意软件分析阶段可以为之后的逆向工程提供进一步的帮助。例如,您可以在反汇编程序中搜索特定的字符串,或借助沙盒能看到恶意软件进行的某些操作。
       如果你的目标是分析一个恶意软件的意图,那么通过沙盒动态分析是不够的。可能恶意软件的命令和远程控制会瘫痪,可能恶意软件会依赖另一个文件进行配置,而这个文件在机器上并不存在。不仅恶意软件有逃避沙盒的能力,而且有时恶意软件只会在某个特殊环境下运行。作为高级恶意软件分析的一部分,逆向工程对于实现这一目标更为有效。
       现在,让我们一起jmp吧!


关于可执行文件的那点事
       一般来说,软件是高智商人类用编程语言开发的,如C、C++、Delphi、Golang等。为了让机器能够理解它,程序需要被编译成机器代码。编译过程将人类可读的代码翻译成可由CPU执行的语言。一旦一个程序被编译,人类可读的源代码就不再可用了(好吧,并不总是如此。.NET就是一个例子,但我们暂且忽略这个问题)。反汇编器是一种可以将机器代码转换为汇编语言的工具,让人类能够读懂机器的指令。
       下面的图片描述了这个流程:




不知道为什么这一段放不出来,提示有违禁词,找了半天也没发现,只能发图片了

有关CPU的那些事
       CPU是一种硬件,是一个用基本逻辑处理比特的电子电路。它持有临时存储器并与随机存取存储器(RAM)进行通信。RAM用于存储数据,而CPU则用于控制这些数据。CPU有三个主要组成部分。控制单元,寄存器,以及算术和逻辑单元(ALU)。


控制单元(CU)
CU负责整合CPU的所有操作,包括ALU、CPU内部的数据移动和外部CPU接口的数据交换。它从内存中提取数据和指令,并将其解码为命令。
算术和逻辑单元(ALU)
ALU是一种数字电路,可执行算术和逻辑运算,如加、减、与、或、非、异或等。
寄存器
寄存器是内置变量,用于在CPU中存储临时数据。下表列出了x86架构的通用寄存器。

注意:在64位CPU中,寄存器的名称将以 "R "开头,而不是 "E"(EAX → RAX),寄存器的大小为64位。
      虽然这些寄存器的大小为32位,但你也可以通过更小的寄存器来使用EAX、ECX、EDX和EBX寄存器的子部分。例如,EAX中最小有效的2个字节可以作为一个16位的寄存器使用,称为AX。AX的最小有效字节可以作为AL使用,AX的最大有效字节可以作为AH使用。

      大多数的寄存器在现代指令集中不一定会用到。ESP(堆栈指针)和EBP(堆栈基础指针)是两个保留了用途的寄存器。我们将在下面看到它们的使用。

有关堆栈的那些事
       堆栈是一种数据结构,用于存储与程序相关的本地函数变量,位于RAM内部的一个临时存储区域。堆栈是作为LIFO(后进先出)队列建立的,它的内存地址层次结构是从较高地址流向较低地址。这意味着,堆栈是向下增长的。
       如上所述,ESP将始终指向堆栈的顶部。如果一个值被添加(推入)到堆栈中,ESP将被递减。如果一个值被从堆栈中读出(弹出),那么ESP将被增加。内存单元的大小是4字节,所以内存位置的减少和增加将以4的跳转方式进行。
       一般来说,程序中的每个函数都会有自己的堆栈框架。所有函数都有一个序言和一个尾声。序言负责创建堆栈框架。

例如:
push ebp - 将原来的EBP值添加到堆栈中,以便在函数结束时可以恢复它。
mov ebp, esp - 将堆栈指针的顶部移动到EBP,这样EBP,也就是堆栈指针的基点,将指向栈顶。
该函数的尾声负责清空堆栈和反转序言,并返回到调用函数。
mov esp, ebp - 将EBP中的值分配给ESP,这样ESP将指向函数的基址。
pop ebp - 将原来的堆栈底层指针弹回EBP,这样堆栈底层就恢复到序言之前的值(调用函数的EBP)。
ret - 跳转到调用函数的下一条指令。

下面的动画说明了堆栈的情况:


关于指令的那些事
       在刚才,我们讲述了一些汇编语言的知识。现在,让我们开始了解汇编代码的结构吧。


(前者是loop.c的源代码,后者是编译后的loop.exe的汇编代码)

       代码中的每一行都有一条指令和操作数。一般来说,任何指令都可以有零个操作数和更多操作数。操作数可以是寄存器、指向内存位置的指针或常数(数值)。
       指令可分为三种类型:数据传输指令;算术和逻辑指令;控制流指令。


例如:
push - 将其操作数放到堆栈的顶部(数据传输指令)。
mov - 将第二个操作数的数据复制到第一个操作数(数据传输指令)。
call - 调用子程序(控制流指令)。
add - 将两个操作数相加,并将结果存入第一个操作数中(算术和逻辑指令)。
jmp - 将程序流转移到操作数的内存位置(控制流指令)。
jge - 达到条件后进行跳转。大于或等于时跳转。通常会在cmp(控制流指令)之后出现。
cmp - 比较第一个操作数和第二个操作数(控制流程指令)。
xor - 在操作数之间进行xor,并将结果放在第一个操作数处(算术和逻辑指令)。
pop - 将堆栈顶部的元素移入其操作数(数据传输指令)。
retn - 子程序的返回机制。这条指令将在堆栈内存中某个位置的pop指令之后出现,然后执行无条件跳转到该位置(控制流指令)。


关于反编汇器的那点事
       反汇编程序将机器语言翻译成汇编。逆向工程师常用的反汇编程序有IDA、Ghidra和Radare2。其中,Ghidra和Radare2是开源的,而IDA有一个免费版本。Ghidra和IDA都有一个图形界面,而Radare2的界面是通过命令行。在本文中,我们将使用IDA,然而,你可以自行使用你觉得适合自己的反汇编程序。

       让我们在IDA中打开loop.exe(你可以使用拖放)。在左边你会看到该程序使用的所有函数(子程序)。其中大部分属于与源代码一起编译的库(我们已经知道该程序的逻辑是由一个函数组成的)。IDA会自动打开入口函数。你也可以输入ctrl+e来回到入口函数。IDA以图形的形式展示代码,其中有代码块和连接代码块的图形边。图形边有三种不同的颜色。

蓝色--一切正常
绿色 - 如果跳转被采取(其条件被满足)。
红色--如果没有进行跳跃


       入口(启动函数)基本上是程序的主函数,负责初始化程序。主逻辑(循环函数本身)将是由start 函数调用的子程序之一。正如你所看到的,有许多子程序被调用,使人很难理解哪个子程序持有主逻辑。
       在这种情况下,找到我们的函数的一个诀窍是搜索函数中使用的字符串:
1. 输入SHIFT+F12,一个包含二进制中所有硬编码的字符串的标签将被创建。
2. 搜索 "循环 "字符串(CTRL+F)。


3. 双击字符串,这将带你到二进制中的字符串的位置。

4. 在字符串上键入CTRL+X,进入字符串所指的位置,然后点击确定。

5. 看起来很熟悉吗?

        如果你在函数名称(sub_401000)上点击CTRL+X,你会看到它在启动函数中被调用的位置。

继续练习逆向工程!
       现在你知道了汇编语言的基本知识和如何使用反汇编程序,你可以自己试试。在这个本文的附件中,你会发现两个可执行文件和它们的源代码。
      用反汇编程序打开这些可执行文件,并尝试理解它们的作用。源代码的存在是为了帮助你学习。试着在不看源代码的情况下理解程序的作用吧!



原文地址:https://www.intezer.com/blog/malware-analysis/malware-reverse-engineering-beginners/
该文由本人自行翻译,如有侵权请联删,若有翻译的不到位的地方还请多多包涵,转载请标明出处。
















本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?快速注册

x

评分

参与人数 8分享 +3 人气 +17 收起 理由
kuroandsan + 1
bbs2811125 + 2 版区有你更精彩: )
屁颠屁颠 + 3 + 2 版区有你更精彩: )
swizzer + 3 版区有你更精彩: )
hipoxiaxxx + 2

查看全部评分

maybug
发表于 2022-2-7 10:57:46 | 显示全部楼层
我还以为来到看雪论坛了
bbs2811125
发表于 2022-2-7 14:41:03 | 显示全部楼层
难得看到一篇技术文,支持一下
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-1-11 05:28 , Processed in 0.130903 second(s), 19 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表