Windows 是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application), 所以便称之为 Application Programming Interface,简称 API 函数。
常见Windows API类型
句柄是在操作系统中被打开或被创建的项,比如一个窗口、进程、模块、菜单、文件,等等。
句柄在它们引用一个对象或其他某个内存位置这点上很像指针。然而,和指针不同的是,句柄不能被用来进行数学操作,并且它们不总是表示对象地址。你能对句柄做的唯一的事情,就是保存它,并在后续函数调用中使用它来引用同一个对象。
打开文件 | CreateFile | 文件打开成功后会返回一个用于操作的句柄,通过这个句柄可以对文件进行操作。 |
关闭文件 | CloseHandle | 对文件操作完成后,需要对打开的文件句柄进行关闭以释放资源。 |
删除文件 | DeleteFile | 通过指定文件名字来删除文件。 |
读取文件 | ReadFile | 通过CreateFile返回的句柄去操作文件 |
写入文件 | WriteFile | 通过CreateFile返回的句柄去操作文件 |
即时写入 | FlushFileBuffers | 将指定句柄文件的缓冲区进行清空,使Windows将缓冲区中的文件写入磁盘。 |
指定读写 | SetFilePointer | 通过移动文件指针读取指定位置的内容 |
逻辑驱动器 | GetLogicalDriveStrings | 获取本地所有逻辑驱动器 |
驱动器类型 | GetDriverType | 通过指定驱动器的名字获取指定驱动器类型 |
创建目录 | CreateDirectory | 创建目录的函数 |
移除目录 | RemoveDirectory | 通过指定目录的名字移除目录的函数 |
WIN+R -> regedit
根键 | 注册表被划分为称为根键的5个顶层节。有时,术语HKEY和储巢也被使用。 |
子键 | 一个子键就像是一个文件夹中的子文件夹。 |
键 | 一个键是一个注册表中的文件夹,它可以包含额外的文件夹或键值。根键和子键都是键。 |
值项 | 一个值项是一个配对的名字和值。 |
值或数据 | 值或数据是存储在注册表项中的数据。 |
HKEY_LOCAL MACHINE(HKLM) | 保存对本地机器全局设置。 |
HKEY CURRENT USER(HKCU) | 保存当前用户特定的设置。 |
HKEY_CLASSES_ROOT | 保存定义的类型信息。 |
HKEY CURRENT CONFIG | 保存关于当前硬件配置的设置,特别是与当前和标准配置之间不同的。 |
HKEY_USERS | 定义默认用户、新用户和当前用户的配置。 |
打开注册表 | RegOpenKeyEx | 通过指定根键和子键字符串打开相应子键,返回子键句柄。 |
关闭注册表 | RegCloseKey | 通过关闭以打开的注册表句柄以释放资源。 |
创建子键 | RegCreateKeyEx | 通过指定根键和子键字符串创建相应子键,返回子键句柄。 |
删除子键 | RegDeleteKey | 删除最下一层的子键。 |
查询键值项 | RegQueryValueEx | 通过指定子键和键值项字符串查询相应键值。 |
写入键值项 | RegSetValueEx | 通过指定子键和键值项字符串写入相应键值。 |
删除键值项 | RegDeleteValue | 通过指定子键和键值项字符串删除相应键值。 |
枚举子键 | RegEnumKeyEx | 通过指定根键获取其所有子键。 |
枚举键值 | RegEnumValue | 通过指定子健获取其所有键值。 |
获取值 | RegGetValue | 获取一个键值项的值。 |
恶意代码附加代码的另一种方式就是将它作为服务安装。Windows允许通过使用服务,来使任务作为后台应用程序运行,而不需要它们自己的进程或线程;代码被Windows服务管理器调度和运行,但没有用户输入。
常用服务函数
打开服务管理器 | OpenSCManager | 通过指定主机名和SCM名打开服务管理器 |
关闭服务管理器 | CloseServiceHandle | 可以用来关闭由OpenSCManager和OpenService打开的句柄 |
打开指定服务 | OpenService | 通过OpenSCManager指定的句柄和服务名打开服务 |
启动服务 | StartService | 通过OpenService指定的句柄启动服务 |
停止服务 | ControlService | 通过OpenService指定的句柄停止服务 |
枚举服务 | EnumServicesStatus | 可以通过多种方式枚举服务 |
创建服务 | CreateService | 创建一个新的服务 |
恶意代码也可以通过创建一个新进程,或修改一个已存在的进程,来执行当前程序之外的代码。一个进程是Windows正在执行的程序。每一个进程管理它自己的资源,诸如打开的句柄与内存。一个进程包含一个或多个由CPU执行的线程。传统上,恶意代码包括它自己的独立进程,但更新型的恶意代码则普遍将自身代码作为其他进程的一部分执行。
常用进程函数
创建进程 | CreateProcess |
结束进程 | ExitProcess |
强制结束某个进程 | FindWindow |
GetWindowThreadProcessId | |
OpenProcess | |
TerminateProcess | |
枚举进程 | CreateToolhelp32Snapshot |
Process32First | |
Process32Next |
进程是执行代码的容器,线程才是Windows操作系统真正要执行的内容。线程是被CPU执行的独立指令序列,而不需要等待其他线程。一个进程包含一个或多个线程,它们执行进程中的一部分代码。一个进程中的所有线程共享同样的内存空间,但是每一个有它自己的处理器、寄存器和栈。
线程上下文
当一个线程运行时,它对CPU或CPU核有着完全的控制,并且其他线程不能影响CPU或核的状态,当一个线程改变CPU中某个寄存器的值时,它不会影响任何其他线程,一个操作系统在线程间切换之前,在CPU中的所有值会被保存到一个称为线程上下文的结构体中,然后操作系统加载这个线程上下文到一个新的线程中,并使这个新线程在CPU中执行。
常用线程函数
创建线程 | CreateThread |
打开线程 | OpenThread |
暂停线程 | SuspendThread |
回复线程 | ResumeThread |
枚举线程 | CreateToolhelp32Snapshot |
Thread32First | |
Thread32Next |
客户端:socket,connect,send,recv
服务端:socket,bind,listen,accept
动态链接库(DLL)是使用库在多个应用程序之间共享代码的Windows特有方式。DLL文件是可执行文件,符合PE格式,但不能独自运行,依附于EXE文件执行。
DLL的入口函数是DllMain.
内核模式操作的一种高特权模式,其中的程序代码能直接访问所有内存(包括所有的用户模式进程和应用程序的地址空间)和硬件。也称为“管理员模式”、“保护模式”或“Ring 0”。