X86架构中其他压入和弹出的指令,最常用的是pusha和pushad,将所有寄存器压栈
Pusha以下面顺序将所有16位寄存器以下面顺序压入栈中:AX,CX,DX,BX,SP,BP,SI,DI
Pushad 32 EAX。。。
在shellcode中,如果要将寄存器的当前状态全部保存在栈上,以便稍后回复,常使用这些指令,编译器很少使用。
重复指令是一种操作数据缓冲区的指令。数据缓冲区是一个字节数组的形式,也可以是单字或双字。
最常见的数据缓冲区操作指令是movsx,cmpsx,stosx,scasx,其中x可以是b,w或者d,分别表示字节、字、双字,在这些操作中,使用ESI和EDI寄存器,ESI是源索引寄存器,EDI是目的索引寄存器,还有ECX用作寄存器的变量。这些指令还需要一个前缀。用于对长度超过1的数据做操作。
在x86下。使用重复前缀来做多字节操作
一个标准C程序的函数有两个参数,形式如下:
Int main(int argc,char * argv)
参数argc,argv是在运行时决定的。Argc是一个整数,说明了命令行中参数的个数,包括程序名字本身;参数argv是一个字符串数据指针,指向了所有的命令行参数
全局变量是通过内存地址引用,而局部变量是通过栈地址引用
Windows API是一个广泛的功能集合,管理着恶意代码与微软程序库之间的交互方式
Windows API常见类型:
WORD(w) 一个16位的无符号数值
DWORD(dw) 一个双字节、32位的无符号数值
Handles(H) 一个对象索引,句柄中存储的信息并没有文档化,而且这一句柄应该只被windows API操作。例子如hmodule,hinstance,hkey
LONG Pointer(L)一个指向另一类型的指针,如有CPByte是指向字节的指针,LPCSTR是一个指向字符串的指针,字符串通常是由LP作为前缀的,因为他们实际上是指针
Callback 表示一个符号会被windows API调用的函数,例如InternetSetStatus CallBack函数传递一个函数指针,当系统有Internet连接状态的更新时将会调用这个函数
句柄是在操作系统中被打开或被创建的项,如一个窗口、进程、模块、菜单、文件等等。句柄在他们引用一个对象或其他内存位置这点上很像指针,但是句柄并不总是表示对象地址。能对句柄做的唯一的事就是保存它,并在后续函数调用中使用它来引用同一个对象
文件映射经常被恶意代码作者使用,因为他们允许将一个文件加载到内存中,以便更加容易地进行操作CreateFileMapping函数将负责从磁盘上加载一个文件到内存中,mapviewoffile函数则返回一个指向映射的基地址指针,它可以被用来访问内存中的文件。程序调用两个函数,能够使用从mapviewoffile函数返回的指针,在文件中的任意位置进行读取和写入。这个特性在解析一个文件特性时极其顺手,因为你可以简单地跳转到不同的内存地址。
在获得一个文件的映射以后,恶意代码可以解析PE头,并对内存中的文件进行所有需要的修改,因此使pe文件就像被操作系统加载一样执行起来。
共享文件是以\\servername\share或\\?\servername\share开头命令的特殊文件,他们用来访问保存在共享目录中的目录或文件。\\?\前缀告诉操作系统禁用所有的字符串解析,并允许访问长文件名。
在操作系统中,也有一些文件可以通过名字空间进行访问。名字空间可以被认为是固定数目的文件夹,每一个文件夹中保存不同类型的对象。底层的名字空间是NT名字空间,以前缀\开始。NT名字空间可以访问所有设备。
以前缀.\\开始的win32设备名字空间,经常恶意代码用来直接访问物理设备,并且将一个文件一样进行读写操作。通过某些方式可以允许程序通过普通API不可能做到的方式来修改磁盘。使用这种方法,恶意代码可以读写数据到一个未分配的扇区,而无须创建或访问文件,使得能够避开防病毒和安全软件的检测
注册表术语:
注册表被划分为下面5个根键:
HKEY_LOCAL_MACHINE(hklm): 保存本地机器全局设置
HKEY_CURRENT_USER(HKCU):保存当前用户特定的设置
HKEY_CLASSES_ROOT 保存定义的类型信息
HKEY_CURRENT_CONFIG 保存当前关于硬件配置的设置,特别是当前和标准配置之间不同的部分
HEKY_USERS 定义默认用户、新用户、当前用户的配置
一些键实际上虚拟键值,提供一种引用底层注册表信息的方式。如HEKY_CURRENT_USER键实际上存储在HEKY_USERS\SID中,这里SID是当前登陆用户的安全描述符
向run子健中写入项,是设置程序自启动的方法
用.reg作为扩展的文件包含人类的:注册表数据、点击.reg文件时,它会自动合并文件包含的信息到注册表中,未修改注册表
恶意代码经常在一个程序的资源节存储另一个程序,并创建一个新进程。当一个程序运行时,他会从PE头中提取附加的可执行文件,将它写到磁盘上,然后调用create process来运行这个程序
一个操作系统在线程间切换之前,在CPU中的所有值会被保存到一个称为线程上下文的结构体中,然后操作系统加载这个上下文到一个新的线程中,并使这个新线程在CPU中执行
除了线程之外,微软系统还使用纤程。纤程和线程类似,但是被一个线程管理,而不是操作系统。纤程共享一个单一的线程上下文