64位恶意代码


知识点

x64架构被设计成x86的升级,而指令集没有什么显著的区别,这本书年代久远,当时64位系统并没有普及,因此可能本章的内容并不是特别有价值。

x64架构与x86的区别:

  • 所有的地址和指针都是64位的
  • 所有通用寄存器大小变大
  • 通用寄存器的数目增长,新的寄存器位R8-R15
  • x64支持相对指令指针的数据寻址
  • 。。。

C++代码分析


知识点

面向对象的编程语言:和C语言不同C++是一种面向对象的编程语言,采用使用对象的编程模型,将数据与操作数据的函数都封装到对象中,在面向对象中,代码以叫做类Class的用户自定义的数据类型进行组织,类与结构体比较类似,差别在于他们另外保存函数信息而不仅仅是数据,类是创建一个对象的模板,它指定内存中的一个对象的函数与数据布局。

ShellCode分析


知识点

位置无关代码:PIC指不用硬编码地址来寻址指令或数据得代码,shellcode编写者应该使用位置无关代码来提高代码的兼容性。

识别执行位置:Shellcode再以位置无关方式访问数据时需要引用一个基质指针,用这个基址指针加上或减去偏移值,将使它安全访问shellcode中包含的数据,因此一个通用寄存器应该首先载入当前EIP值,作为基址指针来使用,但是指令指针不能之别被软件访问,无法汇编mov eax, eip指令,但是可以使用call/pop指令和fnstenv指令。

使用call/pop指令:当一个call指令被执行使,处理器将call后面的指令地址压倒栈上,然后请求转到被请求的位置执行,这个函数执行完成后会执行一个ret指令,将返回地址弹出到栈的顶部,并将它载入EIP寄存器中,这样的结果使执行刚好返回到call后面的指令。因此shellcode可以通过call后面紧跟一个pop的方法来得到call后指令指针的方法。

加壳与脱壳


知识点

加壳原理:加壳器是将一个可执行文件作为输入,输出一个全新的可执行文件,被加壳的可执行文件经过压缩,加密或者其他转换。多数假客气采用压缩算法压缩原始文件,加壳器通过加密原始可执行文件并且实施一些反逆向技术的实现如防反汇编,反调试以及虚拟化等,加壳器既可以打包整个可执行文件,包括所有的数据与资源节,也可以仅打包代码和资源节。

脱壳存根:可执行程序的入口点直线脱壳存根而不是原始代码,原始程序通常存储在杰克程序的一个或者多个附加的节中,脱壳存根负责脱壳源程序:

  • 将原始程序脱壳到内存中
  • 解析原始可执行文件的所有导入函数
  • 将可执行程序转移到原始的程序入口点

反虚拟机技术


知识点

恶意代码编写者经常使用反虚拟机技术逃避分析,恶意代码可以使用这种技术探测自己是否运行在虚拟机中。

VMware痕迹:VM虚拟环境在系统中遗留了很对痕迹,特别是在安装Vmtools之后,恶意代码可以通过存在于操作系统文件系统、注册表和进程列表中标记痕迹,探测VM虚拟环境的存在。

安装VMtools的主机上通常会运行三个相关进程:VMwareService.exeVMwareTray.exeVmwareUser.exe。恶意代码在进程列表中中搜索带有VMware字符串的进程,就能找到这些进程。

恶意代码的网络特征


知识点

OPSEC-操作安全性:攻击者可以通过多种方法来探测到是否有研究人员对恶意代码进行的测试:

  • 发送带有某个特定连接的针对性访问的网络钓鱼邮件,观察是否有从期望区域之外的IP地址的访问请求
  • 设计一种利用方式,在博客篇评论中创建一个经过编码的链接,从而创建一个私人但是可以公开的感染审计记录
  • 在恶意代码中嵌入一个未使用的域名,观察这个域名的解析记录

Snort检测:https://www.snort.org/

数据加密


知识点

分析加密算法的目的:恶意代码使用加密来达到各种各样的目的,最常见的是加密网络通信,同时,唯一代码也会用加密来隐藏它的内部工作:

  • 隐藏配置信息
  • 窃取信息之前将它保存到一个临时文件
  • 存储需要的字符串
  • 将恶意代码伪装成一个合法的工具

反调试技术


知识点

反调试技术,恶意代码用它来识别自身是否被调试,或者让调试器失效,或者通过反调试技术盐城分析人员对代码的分析时间,为了组织调试器的分析,当恶意代码意识到自己被调试时,他们可能改变正常的执行路径或者修改自身程序让自己崩溃,从而增加调试时间和复杂度。

探测Windows调试器:恶意代码会使用多种技术探测调试器调试它的痕迹,其中包括使用Windows API、手动检测调试器人工痕迹的内存结构,查询调试器遗留在系统中的痕迹等。调试器探测时恶意代码常用的反调试技术。

使用Windows API函数:使用Windows API函数探测调试器是否存在时最简单的反调试技术,Windows提供了一些函数可以让应用程序调用这些API来探测自己是否被调试。这些API中有些时专门来探测调试器存在的,而另一些API时处于其他目的而设计的。通常方式恶意代码使用API函数进行反调试的最简单方法是在恶意代码运行期间修改恶意代码,使其不能调用探测调试器的API函数,或者修改这些函数的返回值,也可以通过挂钩这些函数,如使用rootkit技术,下列时恶意代码常用来探测调试器的API函数:

  • IsDebuggerPresent:这是探测调试器最简单的API函数。它查询进程环境块(PEB)中的IsDebugged标志。如果进程没有运行在调试环境中,则函数返回0,否侧返回一个非0值。
  • CheckRemoteDebuggerPresent:这个函数跟IsDebuggerPresent很类似,它也查询进程环境块(PEB)中的IsDebugged标志。它可以探测自身进程或者系统其它进程是被调试,这个函数将一个句柄作为参数,检查这个句柄对应的进程是否被其他调试器附加。
  • NtQueryInformationProcess:这个函数时Ntdll.dll中的一个原生态API,它用来提取一个进程的信息,他的第一个参数是进程句柄,第二个参数告诉我们它需要提取进程信息的类型,例如将该参数设置为哦ProcessDebugPort,将会告诉你这个句柄标识的进程是否被调试。如果进程正在被调试,则返回被调试的端口,否则返回0.
  • OutputDebugString:这个函数的作用是在调试器中显示一个字符串,先通过SetLastError函数为当前的错误码设置一个随机的值,然后调用OutputDebugString,如果当前进程没有被调试则OutputDebugString的调用不会影响错误码的值。

防反汇编技术


知识点

所谓对抗反汇编技术,就是在程序中使用一些特殊构造的代码或数据,让反汇编分析工具产生不正确的程序代码列表。这种技术由恶意代码编写者手工构造,在恶意代码编译和部署阶段使用一个单独的混淆工具,或是直接在源码中插入混淆代码。除了延缓或者防止人工分析以外,防反汇编技术也能在一定程度上阻碍特定的自动化分析技术。

线性反汇编:线性反汇编策略是遍历一个代码段,一次一条指令地线性反汇编,线性反汇编用已经反汇编地指令大小来决定下一个要反汇编的字节,而不考虑代码流的控制指令。

面向代码流的反汇编:面向代码流的反汇编算法是一种更先进的反汇编宣发,这种算法会根据后续代码的逻辑来选择汇编的字节流,因此结果一般情况下会更加准确。

相同目标的跳转指令:恶意代码中最常见的防反汇编技术是使用指向同一目标地址的两个连续条件跳转指令。例如jz loc_512之后是 jnz loc_512则这个指令就相当于无条件跳转指令jmp,另外程序可能会在代码中插入与指令相同额数据如用E8来冒充call指令,实际上使用的是E8后面的字节,E8并没有发挥作用。遇到这种情况可以使用快捷键D使代码变成数据。

隐蔽的恶意代码启动


知识点

启动器:启动器,也称为加载器,是一种设置自身或者其他恶意代码片段以到达即时或将来秘密运行的恶意代码。启动器经常回在资源节包含要加载的恶意代码。如果资源节被压缩或者加密,则恶意代码必须在加载前对资源节进行提取操作,因此可以在代码中看到FindResourceLoadResource、以及SizeofResource等API函数。恶意代码通常需要管理员权限才能进行下面介绍的操作。

进程注入:隐藏启动行为的最流行的技术是进程注入,这是一种将代码注入到另外一个正在运行的进程中,而被注入的进程会不知不觉地运行注入地代码。执行进程注入通常用到如下API:VirtualAllocEx用来分配一块内存空间、WriteProcessMemory用来想之前分配地地址空间内写入数据。

DLL注入:DLL注入是进程注入地一种形式,它强迫一个远程进程加载DLL程序,同时它也是最常使用地的隐秘加载技术。DLL注入将代码注入到一个远程进程并让远程进程调用LoadLibrary,从而强制远程进程加载一个DLL程序到它的进程上下文,一旦被感染的进程加载了恶意DLL,系统会自动调用DLLMain函数。注入的DLL与被注入DLL的进程拥有相同的权限。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×