Fork me on GitHub

64位恶意代码


知识点

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

x64架构与x86的区别:

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

x64调用约定和栈使用上的差别:64位系统使用的调用约定与32位中的fastcall调用约定最为相似,调用的前4个参数使用RCX、RDX、R8以及R9寄存器传递,额外的数据保存在栈上。在32位代码中,栈空间可以在函数中使用push和pop指令分配和释放,然而在64位代码中,函数不能在函数体的中间分配任何空间。由于这个特性,函数中间不会有push或者pop指令,这使分析人员更难判断一个函数有多少个参数,因为没有一个简明的方法说明一个内存地址是被作为栈变量使用还是一个函数的参数,同样也无法说明一个寄存器是否正在作为一个参数被使用。

64位异常处理:不像32位系统中的异常处理,x64的结构化异常处理不再使用栈,在32位系统中fs:[0]被当作一个到当前异常处理器帧的指针使用,它被保存在栈上,以便每一个函数能够定义自己的异常处理器,但是这样可能会带来一些安全问题。因此在64位中结构化异常处理使用一个存储在PE文件中的静态异常信息表,并且不在栈上存储任何数据。同样.pdata节有一个_IMAGE_RUNTIME_FUNCTION_ENTRY结构是位可执行体中每一个函数准备的,它保存了这个函数的开始和末尾地址,以及指向那个函数异常处理的指针。

在64位系统上的Windows32位:微软开发了一个子系统叫做WOW64(Windows32 On Windows64)用来保证32应用程序能在64位系统上运行。WOW64使用x64处理器的32位模式来执行指令,但是对于注册表和文件系统来说仍然需要解决方案,32位和53位进程必须有分开的DLL来避免冲突,因此system32中是64系统的DLL,WOW64中是32位的DLL。

课后练习

Lab 21-1

问题

1.当你不带任何参数运行程序会发生什么?

2.根据你是用的IDA版本,main函数可能没有被自动识别,你如何对main函数的调用?

3.从0x0000000140001151地址到0x0000000140001161地址的指令在栈上存储了什么?

4.在不改变二进制程序文件名的前提下,如何让这个程序运行它真正的负载?

5.0x0000000140001205位置的strcmp函数调用比较了哪两个字符串?

6.0x00000001400013C8位置的函数接收哪些参数?

7.有多少个参数被传递给0x0000000140001093位置对CreatProcess函数的调用?你是如何知道的?

Lab21-2

分别在32位和64位系统中分析此文件。

问题

1.这个代码的资源节有什么有趣的东西?

2.这个恶意代码是为64位编译的还是32位?

3.恶意代码是如何识别处它处于的系统环境类型的?

4.与在32位系统中相比,恶意代码会在64位环境中做哪些不同的事情?

5.恶意代码会在x86环境下释放出哪些文件?你可以在哪里找到这些文件?

6.当运行在x64上时,恶意代码丢弃了哪些文件?你能在哪里找到这个或这些文件?

7.当运行在x64上时,恶意代码启动了什么类型的进程?

8.这个恶意代码的目的是什么?


本章结束🎊

您的支持是我最大的动力🍉