声明:
学习视频来自B站up主【泷羽sec],如涉及侵权行为请马上删除文章,文章所提及内容,均为学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!
本文主要介绍了操作系统和驱动程序相关内容:
一、程序本质
程序是用代码(英文代码或如易语言等中文代码)编写,告知计算机要执行的操作,软件类型多样,包括脚本、二进制、web 程序等,但无论程序名称多高大上,底层都是代码。
二、操作系统
与安全技能的关联 掌握操作系统知识能获得相应安全技能。例如了解 Windows 操作系统,可掌握内网渗透、域渗透,懂得其操作机制就能进行逆向分析,发现潜在问题、漏洞和安全问题。但操作系统知识对 web 渗透(二者不相关)并无帮助。
常规内容 操作系统构成复杂,安全人员只需掌握常规内容即可,特殊情况后续再研究。常规内容包括注册表(Linux 没有,Windows 有),不同操作系统(Linux、Windows、macOS)各有特点,但基本都有类似功能(如自启动)。
防火墙:
Linux 防火墙
Netfilter:是 Linux 2.4 内核引入的包过滤引擎,位于内核中的包过滤功能体系,基于内核控制实现防火墙策略。它设有 5 个控制关卡,对应 5 个规则链,分别是 prerouting、input、forward、output、postrouting。数据包经过本机时,必然经过这 5 个链中的某个或某几个,链中的规则会对数据包进行检查和处理 。
Iptables:是管理防火墙的工具,通过调用 Netfilter 来进行防火墙管理。它有和 Netfilter 中一模一样的 5 种规则链,还多了 4 个规则表,常用的是 filter 表,最常用的链是 input 和 output 链 。基本语法为iptables [-t表名] 选项 链名 条件 [-j控制类型],常见的控制类型有 accept 允许通过、drop 直接丢弃、reject 拒绝通过并给出提示、log 记录日志信息 。
Firewalld:是 Linux 系统中用于管理防火墙规则的守护进程和工具,它提供了一个动态的防火墙管理界面,支持运行时配置和持久化存储防火墙规则。相比 Iptables,Firewalld 更加直观和易于使用,尤其是在处理复杂的网络环境和频繁变化的防火墙规则时。
Windows 防火墙
基本功能:Windows 防火墙是系统自带的软件防火墙,默认情况下,对于系统自带的网络应用程序,如 Internet Explorer、Outlook Express 等的网络连接不干预。它主要阻截所有传入的未经请求的流量,对主动请求传出的流量不作理会,但如果间谍软件偷偷自动开放端口来让外部请求连接,防火墙会立刻阻断连接并弹出安全警告。
设置界面:在 Windows 7 中,可从开始菜单进入控制面板,找到 “系统和安全” 项点击进入找到 “Windows 防火墙” 功能,可进行允许程序或功能通过防火墙、更改通知设置、打开或关闭防火墙、还原默认设置、高级设置等操作。在 Windows 8 及以后系统,可将鼠标移动至屏幕右下角调出 “charm 栏” 选择设置,点击 “控制面板”,再点击 “系统和安全” 找到 “Windows 防火墙”。
高级设置:在 “高级设置” 中,可自定义出入站规则、连接安全规则等。例如,可以针对每一个程序设置允许连接、只允许安全连接、阻止连接三种网络连接方式,还可以对特定的端口、协议等进行详细的规则配置2.
macOS 防火墙
系统自带防火墙:在 “系统偏好设置” 中的 “安全性与隐私” 里可找到 “防火墙” 选项卡,点击左下角的锁图标解锁后,可点击 “打开防火墙” 按钮开启防火墙,并可点击 “防火墙选项” 进行进一步配置,如设置是否允许已签名的软件自动接受传入连接等。
Little Snitch:是一款非常实用的第三方防火墙软件,它可以帮助用户控制应用程序和服务对网络的访问,防止未经授权的网络连接,保护用户的隐私和安全。用户可以根据自己的需求,指定哪些应用程序可以访问网络、访问哪些网络地址以及使用哪些端口等。
Hands Off!:也是一款受 mac 用户欢迎的防火墙工具,可以帮助监视和管理计算机上安装的所有应用程序的 Internet 或磁盘访问,从而保护数据安全,防止未经授权的传输。
自启动:
Linux
添加自启动的位置和方式:
修改 /etc/rc.d/rc.local 文件:将需要自启动的脚本路径添加到该文件中,但需先确认有运行此文件的权限,如chmod +x /etc/rc.d/rc.local。
使用 init.d 脚本:在/etc/init.d/目录创建启动脚本,并使用update-rc.d命令将其添加到启动序列,如sudo cp my_service /etc/init.d/、sudo chmod +x /etc/init.d/my_service、sudo update-rc.d my_service defaults。
使用 systemd 服务:创建一个后缀为.service的文件放置在/etc/systemd/system/目录下,通过systemctl命令管理和配置服务,如sudo cp my_service.service /etc/systemd/system/、sudo systemctl enable my_service.service、sudo systemctl start my_service.service 。
用户级自启动:在用户主目录下创建.config/autostart目录,并将程序的.desktop文件放置其中,此文件需按特定格式编写,如指定程序名称、执行路径等信息。
能否通过计划任务添加自启动及操作方式:可以,使用crontab -e命令编辑计划任务,添加@reboot /path/to/command这样的任务,即可在系统重启后自动运行指定脚本。
Windows
添加自启动的位置和方式:
从设置应用程序:按下Win + I打开 “设置” 应用程序,点击 “应用程序”,在右侧找到 “启动”,可在此处启用或添加要自启动的应用程序。
在启动文件夹中创建快捷方式:打开C:\Users[用户名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup文件夹,在其中为要自启动的程序创建快捷方式;也可先在其他位置创建快捷方式,再将其复制或移动到该文件夹。
使用任务计划程序:按开始,键入taskschd.msc,然后按enter。右键单击左窗格中的Task Scheduler Library,选择Create Basic Task,按向导提示设置任务名称、选择 “当我登录时” 触发、执行操作选择 “启动程序” 并浏览选择要自启动的应用程序的可执行文件等,最后点击 “完成”。
使用注册表编辑器:对于当前用户,可在注册表中HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run位置添加字符串值,名称可自定义,数值数据为要自启动程序的文件路径;若要为所有用户添加,则在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run下操作。
在任务管理器中启用启动应用程序:右键单击任务栏并选择任务管理器,或按下Ctrl + Shift + Esc打开任务管理器,单击左上角的汉堡包图标,选择 “启动应用程序”,在此处可启用或禁用相关应用程序。
能否通过计划任务添加自启动及操作方式:可以,创建一个计划任务,将触发条件设置为用户登录等合适的条件,执行操作设置为启动目标程序,从而实现开机自启动。
macOS
添加自启动的位置和方式:
通过系统偏好设置:打开 “系统偏好设置”,选择 “用户与群组”,点击 “登录项” 标签,点击锁形图标进行解锁后,点击 “+” 号可添加要自启动的应用程序。
使用服务管理框架或共享文件列表:苹果推荐了使用服务管理框架和共享文件列表两种方式来添加登录项。使用服务管理框架添加的登录项在系统的登录项中不可见,只有卸载应用才能移除;而使用共享文件列表添加的登录项在系统登录项中可见,用户可直接控制其启用或禁用,但此 API 在 OS X 10.10 系统上有大量被弃用的情况。
能否通过计划任务添加自启动及操作方式:macOS 中的 “launchd” 可以用于管理自启动任务和计划任务等,但通常不是像 Linux 或 Windows 那样直接通过简单的命令行添加类似@reboot这样明确表示重启后运行的计划任务来实现自启动,而是需要编写配置文件(plist)并放置到特定目录等方式来实现类似功能 。
关于病毒启动及规避事件的问题
病毒启动时间:对于 Windows 系统,如果病毒通过上述自启动方式添加到系统中,那么在系统启动或用户登录时就可能会启动病毒,如通过注册表的Run键值添加自启动项的病毒,会在系统启动过程中,当读取注册表该键值时被触发启动9.
能否规避事件:
用户层面:保持良好的安全意识和使用习惯可在一定程度上规避风险,如不随意下载和安装来源不明的软件、定期更新系统和杀毒软件等。
系统层面:操作系统本身也有一些安全机制来防止未经授权的自启动,如 Windows 的用户账户控制(UAC),当程序试图添加自启动项等需要管理员权限的操作时,会提示用户确认,用户可借此发现可疑程序。同时,杀毒软件和安全防护工具也会监测和拦截可疑的自启动行为和病毒程序。
计划任务:
Linux 计划任务
crontab 命令:是 Linux 系统中用于设置周期性执行任务的工具。用户可以通过crontab -e命令编辑自己的计划任务列表,格式为分 时 日 月 周 命令,每个字段代表不同的时间单位,取值范围和含义如下:
分:0-59,表示分钟。
时:0-23,表示小时。
日:1-31,表示日期。
月:1-12,表示月份。
周:0-6,其中 0 和 7 都表示星期日,表示星期几。
命令:要执行的命令或脚本的路径。
例如,0 0 * * * /usr/local/bin/daily_backup.sh表示每天凌晨 0 点 0 分执行/usr/local/bin/daily_backup.sh脚本。
at 命令:用于在指定的时间执行一次任务。使用at命令后,会进入一个交互界面,输入要执行的命令,最后按Ctrl + D组合键结束输入,任务就会在指定的时间执行。例如,at 10:30 tomorrow表示明天上午 10 点 30 分执行输入的任务。
systemd 定时器:是 systemd 系统和服务管理器的一部分,用于取代传统的 cron 任务。它通过.timer和.service文件组合来定义定时任务和对应的服务。可以实现更精确的时间控制和依赖管理,以及更好的日志记录和错误处理。例如,创建一个名为my_task.timer的定时器文件,配置其定时触发时间,并关联一个对应的my_task.service服务文件来执行具体的任务逻辑。
Windows 计划任务
任务计划程序:通过在开始菜单中搜索 “任务计划程序” 或运行taskschd.msc命令打开。在任务计划程序窗口中,可以创建基本任务或高级任务。创建基本任务时,会有向导引导用户设置任务的名称、描述、触发器(如每天、每周、每月、一次性等时间条件)、操作(启动程序、发送电子邮件等)以及其他条件(如只有在计算机空闲时运行等)。
schtasks 命令:是命令行下用于管理计划任务的工具。例如,schtasks /create /tn "My Task" /tr "C:\Program Files\MyApp\MyApp.exe" /sc daily /st 09:00命令创建了一个名为 “My Task” 的计划任务,每天上午 9 点启动指定路径的程序。
Windows PowerShell:使用New-ScheduledTask等相关命令来创建和管理计划任务。例如,以下 PowerShell 脚本创建一个每天凌晨 2 点执行notepad.exe的计划任务:
macOS 计划任务
launchd:是 macOS 系统中用于管理守护进程、代理程序和定时任务的基础架构。用户可以通过创建.plist配置文件并将其放置在特定的目录下来定义计划任务。配置文件中包含了任务的标识、执行的程序路径、触发条件等信息。例如,创建一个名为com.example.my_task.pli
将该文件放置在~/Library/LaunchAgents/目录下,系统会根据配置文件中的设置在每天上午 9 点 30 分执行/usr/local/bin/my_task.sh脚本。
iCal:可以通过 iCal 应用程序创建提醒事项或事件,并设置其重复周期和提醒时间等,来实现类似于计划任务的功能。不过,iCal 主要侧重于日程安排和提醒,对于执行复杂的脚本或程序相对不太方便,但其界面较为直观,适合一些简单的定时提醒需求。
cron:macOS 系统也支持 cron 命令,其基本用法与 Linux 中的 cron 类似。用户可以通过编辑crontab -e来添加计划任务,格式和规则与 Linux 中的 cron 任务相同。不过,在 macOS 中使用 cron 相对较少,更多的是使用 launchd 来管理定时任务。
事件日志:
Linux 事件日志
常见日志文件及位置:
/var/log/messages:记录系统的常规信息,包括系统启动、服务启动与停止、内核消息等。例如,硬件设备的检测和初始化信息会记录在此文件中,如磁盘设备的识别和挂载情况。
/var/log/syslog:与/var/log/messages类似,不同的 Linux 发行版和系统配置可能会将一些系统事件记录到这个文件中,是系统日志的一个常见存储位置。
/var/log/auth.log 或 /var/log/secure:主要记录系统的认证相关信息,如用户登录、注销,sudo 操作,以及与认证相关的错误信息等。
/var/log/cron:用于记录 cron 任务的执行情况,包括计划任务的启动时间、执行结果等。
/var/log/dmesg:包含内核启动时的打印信息,如内核检测到的硬件信息、内存初始化情况、驱动加载信息等。
/var/log/audit/audit.log:是 Linux 审计系统的日志文件,记录了与系统安全相关的各种事件,如文件访问、进程执行、用户操作等,可用于检测和分析潜在的安全威胁。
日志查看方法:
使用文本查看命令:如cat、less、more等,直接查看日志文件的内容。例如,cat /var/log/messages可以快速查看messages日志文件的全部内容,但对于大型日志文件,使用less或more命令会更方便,可以逐页查看。
使用grep命令过滤查找:结合grep命令可以根据关键词快速查找特定的日志信息。例如,grep "error" /var/log/messages可以查找messages日志中包含 “error” 关键词的所有行,便于快速定位错误信息。
通过系统日志管理工具:一些 Linux 发行版提供了图形化的日志管理工具,如 GNOME Logs 等,方便用户直观地查看和搜索日志。
Windows 事件日志
日志分类及内容:
应用程序日志:记录与应用程序相关的事件,如应用程序的启动、停止、错误、警告等信息。当某个应用程序出现故障或异常时,会在该日志中生成相应的记录,包括应用程序的名称、版本、错误代码等详细信息,有助于开发人员和管理员排查问题。
安全日志:主要记录与系统安全相关的事件,如用户登录、注销、账户锁定、权限更改、资源访问等操作。通过对安全日志的分析,可以检测到是否有未经授权的访问尝试,以及系统的安全策略是否被正确执行。
系统日志:包含系统组件和设备驱动程序等产生的事件,如系统启动和关闭、设备驱动程序的加载和卸载、硬件故障等信息。系统管理员可以通过查看系统日志来了解系统的运行状态,及时发现并解决潜在的系统问题。
安装日志:记录系统和应用程序的安装过程及相关事件,包括安装的时间、安装的软件名称、版本、安装过程中出现的错误等信息,对于排查安装过程中的问题非常有用。
查看方式:
事件查看器:通过在开始菜单中搜索 “事件查看器” 或运行eventvwr.msc命令打开。在事件查看器窗口中,可以浏览不同类型的日志,查看详细的事件信息,还可以根据事件的级别(如信息、警告、错误、严重等)、来源、时间等条件进行筛选和排序,以便快速定位所需的事件记录。
PowerShell 命令:使用Get-EventLog等 PowerShell 命令来获取和查看事件日志。例如,Get-EventLog -LogName Application -Newest 10可以获取应用程序日志中的最新 10 条记录,方便在命令行环境下快速查看关键的应用程序事件。
macOS 事件日志
日志存储与特点:
在 macOS 10.12 之前,系统日志主要存储在/var/log目录下的多个文件中,如system.log、install.log等。从 macOS 10.12 开始,苹果引入了 “unified logging”(统一日志)系统,日志数据存储在/var/db/diagnostics目录下的 tracev3 格式化文件中,不过/var/log/system.log等文件仍然存在,但包含的有用信息相对较少。
查看方法:
控制台应用程序:通过点击 “前往” 菜单,选择 “应用程序”,再进入 “实用工具” 文件夹,双击 “控制台” 应用程序来打开。在控制台中,可以查看所有进程记录的系统诊断日志,还可以根据不同的日志级别(如信息、调试、错误等)进行筛选,以便快速定位和分析问题。
命令行工具:使用log命令来查看和搜索日志。例如,log show命令可以搜索保存的日志文件,通过添加不同的参数,如--predicate用于指定搜索条件,--last用于限制显示最近的指定时间内的日志等,可以灵活地查询所需的日志信息。
sysdiagnose 工具:通过在终端中输入sudo sysdiagnose -f ~/desktop/命令或同时按下Shift + Control + Option + Command + Period组合键,可以生成一个包含系统各种信息的诊断文件,其中也包括系统日志等详细信息,对于深入排查系统问题非常有帮助。
内核驱动:
Linux 内核驱动
基本概念:Linux 内核驱动是内核的一部分,用于控制和管理硬件设备,使硬件设备能够与操作系统进行通信和交互。它充当了硬件与操作系统之间的桥梁,让操作系统能够有效地利用硬件资源。
常见类型:
字符设备驱动:用于处理像字符流一样的数据传输,如串口、终端等设备。用户可以通过读写字符设备文件来与这些设备进行交互.
块设备驱动:主要用于处理以块为单位的数据存储设备,如硬盘、U 盘等。它提供了对设备的高效读写操作,支持文件系统的挂载和访问。
网络设备驱动:负责控制网络接口卡,实现网络协议栈与硬件之间的通信,使计算机能够连接到网络并进行数据传输。
实现框架:通常基于 Linux 内核设备模型和相关的总线架构来实现。例如,使用 platform 平台总线来衔接硬件相关的驱动与上层的字符设备驱动等,在设备树中描述设备的相关信息,如设备的地址、中断号、时钟资源等,驱动程序通过解析设备树来获取这些信息并进行相应的初始化和配置.
开发与加载:开发人员可以使用 C 语言等编写内核驱动代码,遵循 Linux 内核的编程规范和接口定义。编写完成后,将驱动模块编译成内核可加载的模块文件(通常以.ko 为扩展名),然后通过命令如insmod将其加载到内核中,使用rmmod命令可以卸载驱动模块 。
Windows 内核驱动
特点与运行环境:Windows 内核驱动运行在内核模式下,具有较高的权限,可以直接访问系统的硬件资源和内核数据结构。它是操作系统的执行部分,作为支持受保护子系统的基础组件运行,但调试难度相对较大,一旦出现问题可能会对系统造成损害。
分类:
- 文件系统驱动程序:实现标准的文件系统模型,负责管理和控制文件系统的读写操作,如 NTFS、FAT32 等文件系统的驱动。
传统设备驱动程序:用于在没有其他驱动程序帮助的情况下控制硬件设备,如一些旧版本的硬件设备的驱动程序,通常可以在不同版本的 Windows 系统上运行。
- 视频驱动程序:用于控制显卡等视频设备,提供图形显示和视频播放等功能。
流驱动程序:支持多媒体设备,如声卡等,负责音频数据的处理和传输。
- WDM 驱动程序:即 Windows Driver Model,支持 Windows NT 的电源管理和即插即用功能,具有较好的兼容性和可扩展性。
- 开发与管理:Windows 内核驱动的开发需要使用特定的工具和开发环境,如 Windows Driver Kit (WDK)。开发人员需要熟悉 Windows 内核的架构和相关的编程接口,遵循微软的驱动开发规范。驱动程序通常以.sys 为扩展名,通过设备管理器等工具进行安装、更新和卸载等管理操作。
macOS 内核驱动
相关技术与框架:macOS 的内核驱动开发主要基于 I/O Kit 框架。I/O Kit 提供了一套面向对象的编程接口,用于创建和管理内核扩展(Kernel Extensions,通常以.kext 为扩展名),这些内核扩展可以实现对硬件设备的驱动和系统功能的扩展。
开发文档与资源:苹果提供了丰富的官方文档来支持内核驱动开发,如《I/O Kit Fundamentals》《Threading Programming Guide》等,详细介绍了 I/O Kit 的使用方法、内核编程的基本概念和技巧等。此外,还可以参考苹果开源的内核相关项目的源码,如 AppleUSBCDCDriver、IOUSBFamily 等,从中学习和了解内核驱动的实现细节。
调试与分析:当内核驱动出现问题时,可以使用 Kernel Debug Kit 等工具进行调试。通过分析内核崩溃日志(Kernel Panic Log)来查找问题所在,确定是哪个内核扩展或驱动程序导致了系统错误,并进一步定位到具体的代码行。
系统服务:
Linux 系统服务
概念与作用:Linux 系统服务是指在操作系统启动时自动运行的后台程序或进程,它们为系统提供各种功能和服务,如网络连接、文件共享、打印服务、系统监控等,以确保系统的正常运行和用户的各种需求能够得到满足。
常见服务类型:
- 网络服务:如 SSH 服务(sshd)用于远程登录和管理系统,HTTP 服务(如 Apache、Nginx)用于提供网页浏览服务,DNS 服务(如 BIND)用于域名解析等。- 文件服务:例如 NFS 服务用于网络文件共享,Samba 服务可实现 Linux 与 Windows 系统之间的文件和打印机共享。- 打印服务:如 CUPS 服务,用于管理和控制打印机,实现打印任务的排队和处理。- 系统监控与管理服务:像 rsyslog 服务用于系统日志的记录和管理,cron 服务用于定时执行任务,systemd-journald 服务用于收集和存储系统日志等。
管理方式:
- 使用 systemctl 命令:这是 systemd 系统和服务管理器的主要命令。例如,systemctl start service_name用于启动服务,systemctl stop service_name用于停止服务,systemctl restart service_name用于重启服务,systemctl status service_name用于查看服务的状态,systemctl enable service_name用于设置服务开机自启,systemctl disable service_name则用于取消开机自启。- 使用 service 命令:在一些较老的 Linux 系统或基于 SysVinit 的系统中,使用service命令来管理服务。如service httpd start、service httpd stop等,但在现代的 Linux 发行版中,systemctl 命令更为常用。
Windows 系统服务
功能与重要性:Windows 系统服务为操作系统和各种应用程序提供了基础的支持和功能,涵盖了网络连接、安全管理、打印、多媒体等多个方面。许多系统关键功能和应用程序的正常运行都依赖于相应的系统服务,例如 Windows Update 服务用于系统更新,Windows Firewall 服务用于网络安全防护等。
常见服务列举:
- DHCP Client 服务:自动获取网络配置信息,如 IP 地址、子网掩码、网关等,使计算机能够快速接入网络。- Windows Time 服务:用于同步计算机的时间与网络时间服务器,确保系统时间的准确性。- Print Spooler 服务:管理打印队列,将打印任务发送到打印机进行打印,支持本地和网络打印机的共享打印。- Task Scheduler 服务:负责执行计划任务,按照用户设定的时间和条件自动运行指定的程序或脚本。
管理工具与方法:
- 服务管理控制台:通过在开始菜单中搜索 “服务” 或运行services.msc命令打开服务管理控制台。在该控制台中,可以查看所有已安装的服务,手动启动、停止、暂停、恢复服务,还可以设置服务的启动类型,如自动、手动、禁用等。- PowerShell 命令:使用 PowerShell 中的相关命令来管理服务,如Start-Service、Stop-Service、Get-Service等。例如,Get-Service -Name "Spooler"可以获取打印服务的详细信息,Start-Service -Name "Spooler"可以启动打印服务。
macOS 系统服务
特点与应用场景:macOS 系统服务同样为系统的正常运行和各种功能的实现提供了支持,其设计注重用户体验和与硬件及其他系统组件的紧密集成。例如,Time Machine 服务用于自动备份用户数据,Spotlight 服务提供快速的文件和内容搜索功能等。
主要服务介绍:
- AirPlay 服务:允许用户将音频、视频等内容从 macOS 设备无线投射到支持 AirPlay 的设备上,如 Apple TV 等。- iCloud 服务:实现用户数据在不同设备之间的同步和共享,包括照片、文档、联系人、日历等。- Core Data 服务:为应用程序提供数据存储和管理功能,支持对象关系映射和数据持久化,方便开发者创建和管理应用的数据模型。
管理方式:
- 系统偏好设置:许多系统服务可以在 “系统偏好设置” 中的相应选项中进行配置和管理。例如,在 “共享” 偏好设置中可以开启或关闭文件共享、屏幕共享等服务,设置共享的名称、权限等参数。- launchctl 命令:用于加载、卸载和管理系统的启动项和服务。通过launchctl list命令可以列出当前正在运行的服务和启动项,launchctl start service_name和launchctl stop service_name分别用于启动和停止指定的服务,但该命令的使用相对较为复杂,需要对服务的标识和相关配置有一定的了解。- 进程线程:
Linux 进程线程
进程:
- 概念:进程是正在运行的程序的实例,是操作系统进行资源分配和调度的基本单位。每个进程都有自己独立的地址空间、内存区域、文件描述符等资源,不同进程之间相互隔离,互不干扰。- 创建与管理:在 Linux 中,可以使用fork()系统调用创建一个新的进程。fork()函数会复制当前进程的地址空间等资源,创建出一个与父进程几乎完全相同的子进程。父进程和子进程会分别从fork()函数的返回点继续执行,返回值不同,父进程返回子进程的 PID,子进程返回 0。通过exec()系列函数可以在子进程中加载并执行新的程序,替换子进程原来的代码段、数据段等。- 进程状态:包括运行态、就绪态、睡眠态、僵尸态等。运行态表示进程正在 CPU 上执行;就绪态是指进程已经准备好运行,只要分配到 CPU 资源就可以立即执行;睡眠态是进程因等待某些事件而暂时停止运行,如等待 I/O 操作完成;僵尸态是指子进程已经结束,但父进程尚未回收其资源,子进程的进程控制块(PCB)等信息仍然保留在系统中。
线程:
- 概念:线程是进程中的一个执行单元,是 CPU 调度和分派的基本单位。一个进程可以包含多个线程,它们共享进程的地址空间、文件描述符等资源,线程之间的切换开销相对较小,能够更高效地利用 CPU 资源,提高程序的并发执行能力。- 创建与管理:使用pthread_create()函数创建新的线程,该函数需要传递线程函数指针、线程参数等信息。线程函数是线程执行的具体逻辑,在函数中可以实现各种任务。通过pthread_join()函数可以等待指定线程结束,并获取线程的返回值,用于线程间的同步和资源回收。- 线程同步机制:常见的线程同步机制包括互斥锁、条件变量、信号量等。互斥锁用于保护共享资源,确保同一时刻只有一个线程能够访问共享资源;条件变量用于线程之间的等待和唤醒操作,当某个条件满足时,可以唤醒等待在该条件变量上的线程;信号量用于控制对有限资源的访问,实现线程之间的互斥和同步。
Windows 进程线程
进程:
- 结构与特点:Windows 进程由进程控制块(PCB)、程序代码、数据段、堆、栈等组成。每个进程都有一个唯一的进程标识符(PID),操作系统通过 PID 来管理和调度进程。Windows 进程具有相对独立的地址空间,不同进程之间的地址空间相互隔离,以保证系统的稳定性和安全性。- 创建与执行:使用CreateProcess()函数创建新的进程,该函数可以指定要执行的程序路径、命令行参数、进程的安全属性、环境变量等信息。创建成功后,新进程会在其独立的地址空间中开始执行指定的程序。- 进程间通信:Windows 提供了多种进程间通信(IPC)机制,如管道、命名管道、邮槽、共享内存、动态数据交换(DDE)、COM/DCOM 等。不同的 IPC 机制适用于不同的应用场景,例如管道适用于父子进程之间的通信,共享内存适用于需要高效共享大量数据的进程间通信。
线程:
- 线程管理:Windows 线程是进程中的执行单元,每个线程都有自己的线程上下文,包括程序计数器、寄存器、栈指针等。使用CreateThread()函数创建新的线程,线程创建后会立即开始执行指定的线程函数。通过WaitForSingleObject()或WaitForMultipleObjects()函数可以等待线程结束,实现线程间的同步。- 线程同步与并发控制:Windows 提供了多种线程同步对象,如互斥体、信号量、事件等。互斥体用于保护共享资源,确保同一时刻只有一个线程能够访问共享资源;信号量用于控制对有限资源的访问,类似于 Linux 中的信号量;事件用于线程之间的通知和同步,一个线程可以等待某个事件的发生,另一个线程可以设置事件的状态来通知等待的线程。- 纤程:除了传统的线程外,Windows 还支持纤程(Fiber)。纤程是一种比线程更轻量级的执行单元,它在用户模式下实现,不需要内核的支持。纤程可以在同一个线程中调度执行,通过ConvertThreadToFiber()函数将线程转换为纤程,然后使用CreateFiber()函数创建新的纤程,并通过SwitchToFiber()函数在不同的纤程之间切换执行。
macOS 进程线程
进程:
- 组成与资源分配:macOS 进程同样由代码段、数据段、堆、栈、进程控制块等组成,系统会为每个进程分配独立的地址空间和各种资源,如内存、文件描述符等。进程在运行过程中通过系统调用与内核进行交互,请求内核分配和管理资源。- 创建与启动:使用fork()系统调用创建新的进程,与 Linux 类似,fork()会复制当前进程的大部分资源创建子进程。子进程可以通过exec()系列函数加载并执行新的程序。另外,macOS 也支持posix_spawn()函数来创建和启动新的进程,它提供了一种更简洁、更安全的方式来创建进程,并且可以在创建过程中设置进程的属性和环境变量等。- 进程调度与优先级:macOS 的内核采用了多种调度算法来管理进程的执行,根据进程的优先级、资源需求等因素进行调度。进程的优先级可以通过nice()系统调用来调整,较高优先级的进程会获得更多的 CPU 时间片,从而更快地得到执行。
线程:
- 线程操作:在 macOS 中,使用pthread_create()函数创建新的线程,与 Linux 中的线程创建函数类似。线程创建后会独立执行指定的线程函数,多个线程可以并发执行,共享进程的资源。通过pthread_join()函数等待线程结束,回收线程资源。- 并发编程模型:除了传统的基于线程的并发编程外,macOS 还支持 Grand Central Dispatch(GCD)和 Operation Queue 等高级并发编程模型。GCD 是一种基于队列和任务块的并发编程框架,它可以自动管理线程的创建、调度和销毁,大大简化了并发编程的复杂性。Operation Queue 则是基于面向对象的操作对象和队列来实现并发任务的管理和调度,提供了更灵活的控制和依赖关系管理。- 线程安全与同步:为了保证多线程程序的正确性,需要注意线程安全问题。macOS 提供了与 Linux 类似的线程同步机制,如互斥锁、条件变量等。同时,在使用一些高级并发编程模型时,也需要遵循相应的线程安全规则,例如在 GCD 中,对于共享资源的访问需要使用适当的同步机制或采用线程安全的方式来处理。
- 系统编程:
Linux 系统编程
基本概念与特点:Linux 系统编程主要是指针对 Linux 操作系统底层功能和接口进行的编程开发工作。它涉及到对操作系统内核的调用,以实现对系统资源的管理和控制,如进程管理、内存管理、文件系统操作、设备驱动开发等。Linux 系统编程具有高度的灵活性和可定制性,开发人员可以深入到系统底层,根据具体需求对系统进行优化和扩展。
常用编程接口与工具:
- 系统调用:是 Linux 操作系统提供给用户程序的接口,通过系统调用,用户程序可以请求内核完成各种操作,如fork()用于创建进程,open()用于打开文件,read()和write()用于文件读写等。- C 标准库函数:在 Linux 系统编程中,C 标准库函数也是常用的工具之一。例如,stdio.h中的printf()、scanf()等函数用于标准输入输出操作,stdlib.h中的malloc()、free()等函数用于内存分配和释放。- GCC 编译器:是 Linux 下常用的编译器,用于将 C、C++ 等源程序编译成可执行文件。GCC 提供了丰富的编译选项和调试工具,方便开发人员进行代码优化和错误排查。
开发实践:
- 进程管理:通过系统调用fork()创建新的进程,使用exec()系列函数加载并执行新的程序,通过wait()或waitpid()函数等待子进程结束,实现进程的创建、执行和同步。- 内存管理:使用malloc()、calloc()等函数动态分配内存,使用free()函数释放内存。同时,还可以通过mmap()函数实现内存映射,将文件或设备的内存映射到进程的地址空间,方便进行文件读写和进程间共享内存。- 文件系统操作:使用open()、close()、read()、write()等系统调用对文件进行操作,通过opendir()、readdir()等函数遍历目录,实现文件和目录的创建、删除、读写等功能。- 网络编程:基于套接字(Socket)编程接口实现网络通信,使用socket()函数创建套接字,通过bind()、listen()、accept()等函数实现服务器端的监听和连接处理,使用connect()函数实现客户端的连接请求,使用send()和recv()函数进行数据发送和接收。
Windows 系统编程
核心概念与特性:Windows 系统编程侧重于利用 Windows 操作系统提供的丰富的 API 和框架来开发各种应用程序和系统级别的软件。Windows API 涵盖了图形界面、文件系统、网络通信、进程线程管理、内存管理等多个方面,为开发人员提供了强大的功能和灵活的控制能力。Windows 系统编程还注重与 Windows 操作系统的集成和兼容性,能够充分发挥 Windows 平台的优势。
主要编程接口与开发环境:
- Windows API:是 Windows 操作系统提供的一系列函数和数据结构,用于开发 Windows 应用程序和系统软件。例如,CreateWindow()函数用于创建窗口,MessageBox()函数用于显示消息框,CreateFile()函数用于打开文件等。- Microsoft Visual Studio:是 Windows 下常用的集成开发环境,提供了丰富的开发工具和调试功能,支持多种编程语言,如 C++、C#、VB 等。Visual Studio 与 Windows API 紧密集成,方便开发人员进行 Windows 系统编程。- .NET Framework:是微软推出的一个面向对象的编程框架,提供了丰富的类库和运行时环境,简化了 Windows 应用程序的开发。开发人员可以使用 C#、VB.NET等编程语言基于.NET Framework 进行快速开发,同时还可以方便地调用 Windows API 来实现更底层的功能。
编程实践:
- 图形界面编程:使用 Windows API 或基于.NET Framework 的 Windows Forms、WPF 等技术进行图形界面应用程序的开发,创建窗口、按钮、文本框等各种控件,实现用户与程序的交互。- 进程线程管理:通过CreateProcess()函数创建新的进程,使用CreateThread()函数创建新的线程,通过WaitForSingleObject()或WaitForMultipleObjects()函数等待进程或线程结束,实现多进程和多线程编程。- 文件系统操作:使用CreateFile()、ReadFile()、WriteFile()等函数对文件进行读写操作,通过FindFirstFile()、FindNextFile()等函数遍历目录,实现文件和目录的管理。- 网络编程:基于 Windows Sockets API 进行网络编程,使用socket()函数创建套接字,通过bind()、listen()、accept()等函数实现服务器端的监听和连接处理,使用connect()函数实现客户端的连接请求,使用send()和recv()函数进行数据发送和接收。
macOS 系统编程
特点与优势:macOS 系统编程结合了 Unix 的传统和苹果的创新技术,提供了丰富的编程接口和工具,使开发人员能够充分利用 macOS 系统的特性和功能。macOS 的系统编程注重用户体验和与硬件的紧密结合,能够开发出高效、美观、具有良好用户体验的应用程序和系统软件。
关键编程接口与资源:
- Carbon 和 Cocoa 框架:Carbon 是早期 macOS 系统编程的主要框架,提供了对传统 Mac OS API 的访问。Cocoa 则是基于 Objective-C 语言的面向对象编程框架,提供了丰富的类库和工具,用于开发 macOS 应用程序。Cocoa 框架包括了 Foundation、AppKit 等重要的框架,分别提供了基础数据类型、内存管理、对象序列化等功能和图形界面、用户交互等功能。- Xcode 开发环境:是苹果官方推荐的 macOS 和 iOS 应用开发环境,集成了编译器、调试器、界面设计工具等多种开发工具,支持 Objective-C、Swift 等编程语言,为开发人员提供了一站式的开发体验。- **Grand Central Dispatch (GCD)**:是一种强大的并发编程框架,用于在 macOS 和 iOS 系统中管理并发任务。GCD 提供了简单易用的 API,能够自动管理线程的创建、调度和销毁,大大提高了程序的并发性能和响应速度。
编程实践:
- Cocoa 应用程序开发:使用 Cocoa 框架中的 AppKit 等框架进行图形界面应用程序的开发,创建窗口、视图、控制器等对象,实现用户界面的设计和交互逻辑。通过 Objective-C 或 Swift 语言编写代码,实现应用程序的各种功能,如菜单操作、按钮点击响应、文本输入处理等。- 系统服务开发:基于 macOS 的系统服务框架,如 Launch Services、Core Data 等,开发各种系统级别的服务和应用扩展。例如,开发一个系统菜单栏应用程序,通过 Launch Services 实现开机自启,通过 Core Data 实现数据存储和管理。- 文件系统与资源管理:使用NSFileManager类等相关类进行文件系统的操作,如文件和目录的创建、删除、复制、移动等。同时,可以通过NSBundle类访问应用程序的资源文件,如图片、音频、视频等。- 进程间通信与协作:使用NSDistributedNotificationCenter等机制实现进程间的通信和通知,通过NSXPCConnection实现进程间的远程过程调用(RPC),方便不同进程之间的数据共享和协作。
了解操作系统可为内网渗透、逆向工程、病毒编写打基础,若只从事初级 web 渗透工作可不用了解,但对于红队人员来说必须掌握。
三、驱动程序
- 性质与作用 驱动程序是一种软件程序,主要用于操控硬件和操作系统内核,运行在底层。
- 应用场景与必要性 在涉及内网渗透、逆向工程、病毒分析、安全对抗、外挂保护等领域时,需要对驱动程序有所了解,特别是安全对抗,不懂驱动程序无法进行分析和防御。若不涉及这些领域可不学习,但从长远看应拓宽视野。
版权归原作者 安小华027 所有, 如有侵权,请联系我们删除。