常用汇编指令总结
MOV 将源操作数传送到目标操作数
ADD 将源操作数与目标操作数相加 最后结果给到目标操作数
SUB 将源操作数与目标操作数相减 最后结果给到目标操作数
AND 将源操作数与目标操作数进行与运算 最后结果给到目标操作数
OR 将源操作数与目标操作数进行或运算 最后结果给到目标操作数
XOR 将源操作数与目标操作数进行异或运算 最后结果给到目标操作数
NOT 将源操作数与目标操作数进行异非运算 最后结果给到目标操作数
MOVS 数据传送 与MOV不同处在于它可以将内存的数据传送到内存
STOS 将 AL AX EAX 的值存到EDI指定的内存地址
REP 循环
堆栈相关指令
先入后出
PUSH 押入 通用寄存器 内存地址 立即数
POP 释放。通用寄存器 内存地址
修改EIP指令
EIP 也是寄存器 不叫通用寄存器。存放的事CPU下一次要执行的指令地址
JMP指令 (EIP劫持)
JMP 寄存器 内存 立即数
修改EIP
CALL指令
也可以修改 EIP 与JMP指令一样
RET 指令
表示返回
什么是栈
后进先出。fILO (First in Last Out)
父子调用。父函数调用子函数 父函数在前 子函数在后。 返回时 子函数在前 父函数在后
栈贞 是真么
栈贞 也是 stack frame 其本质就是一个栈 保存函数调用过程中的的各种信息 参数 返回地址 本地变量
内存布局
BSS段 在采用段式内存管理的架构中 BSS段 bas segment 通常是指用来存放程序中为初始化的全局变量的一块内存区域 Block Started by Symbol属于静态内存分配
数据段 常是指用来存放程序中为已初始化的全局变量的一块内存区域 data segment
代码段 用来存放程序执行代码的一块内存地址。这部分区域的大小在程序运行之前就已经确定 病情内存区域属于只读 代码段中包含一些只读的常量。
堆
heap 堆是用于存放进程运行中被动态分配的内存段 他的大小并不固定 可动态图扩张或缩减 当进程调用malloc等函数分配内存时 新分配的内存就会被动态的上调 当用free 的时候就会被释放
栈
stack 用户存放程序临时创建的局部变量 也就是说我们函数括号中的变量 但是不包括static圣明的变量 static 意味着在数据段中存放变量 除此之外 再函数被调用时 起参数也会被压入发起调用的进程栈中 并且待到调用的结束后 函数的返回值也会被存放回栈中 由于栈先进后出的特点 所以栈特备方便来保存 恢复调用现场 我们可以把堆栈看成一个寄存 交换临时数据的内存区
win32 API
windows 是一个很全面的操作系统 除了协调应用程序的执行 分配内存 管理系统资源之外 他同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数) 可以帮助应用程序达到开启视窗 描绘图形 使用周边设备等目的,由于这些函数服务对象是应用程序 Application 所以便成为应用程序的变成接口。Application Programminf Interface 建成 API。window系统从 95以后都是三十二系位操作系统 Win32 知识window的32位操作平台
Api函数是开发windos 应用程序最底层的东西 就连windows本身的许多应用程序都是API函数来实现的 随着Window系统不断的升级。与系统相关的API函数也在不断的变化 最明显的变化是原来的 16位变成了32位 有的api 可以在 不同的版本运行 有的不可以
Api 函数都封装在动态连结库中 对APi函数的调用都需要加载动态连结库哦 常用的Api函数大多都封装在 KERMEL.dll,GDI.dll USER.dll中
Api 是开发win32应用的程序 及时使用MFC库来开发win32应用程序 也要对API函数进行了解。虽然MFC对API 进行了封装 但是没有封装所有
Winod
AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小
AnyPopup 判断屏幕上是否存在任何弹出式窗口
ArrangeIconicWindows 排列一个父窗口的最小化子窗口
AttachThreadInput 连接线程输入函数
BeginDeferWindowPos 启动构建一系列新窗口位置的过程
BringWindowToTop 将指定的窗口带至窗口列表顶部
CascadeWindows 以层叠方式排列窗口
ChildWindowFromPoint 返回父窗口中包含了指定点的第一个子窗口的句柄
ClientToScreen 判断窗口内以客户区坐标表示的一个点的屏幕坐标
CloseWindow 最小化指定的窗口
CopyRect 矩形内容复制
DeferWindowPos 该函数为特定的窗口指定一个新窗口位置
DestroyWindow 清除指定的窗口以及它的所有子窗口
DrawAnimatedRects 描绘一系列动态矩形
EnableWindow 指定的窗口里允许或禁止所有鼠标及键盘输入
EndDeferWindowPos 同时更新DeferWindowPos调用时指定的所有窗口的位置及状态
EnumChildWindows 为指定的父窗口枚举子窗口
GetlocalTime 获取本地时间
GeTickCoun 获取开机到现在的时间 or GetTickCount 64。
注册表
RegCreateLey。RegCreaKeyEx。创建新项
RegOpenKey REgOpenKeyEx 打开一个项
REgQueryValueEx 访问项的值
REg DeleteKey RegDeleteKeyEx 删除一个值
RegCloseKey 关闭句柄
Memory
virtualAlloc 开辟虚拟内存 Private
VirtualFree 释放内存 私有
CreateFiltMapping 开启物理页不与虚拟内存连接
MapViewOfFlile 连接
UnMapViewOfFole 关闭文件资源
FlushMapViewOfFile 刷新缓冲区
OpenFileMapping 打开一个共享
文件相关Api
CareateFlie 创建一个文件
GefFileSize 获取文件大小
获取环境变量
GetEevironmentStrings 获取系统内所有的环境变量
....
什么是进程
进程是指系统中运行的应用程序 一个进程内有很多线程。线程之间通讯IPC(管道,信号量,内存共享,消息队列)
线程的地址空间保存在进程的地址空间内
CreateProcess 创建进程
OpenProcess 打开进程
termilateprocess 终止进程
....
文件映射
文件映射 Memory-Mapped Files 使进程能把文件内容到晋城地址区间的一块内存来对待,因此进程不必使用文件 I/O 操作,只需要简单的指针操作就可以读取或者修改文件内容
应用程序有三种发方法来时多个进程共享一个文件映射对象
继承 第一个进程建立文件映射对象,他的子进程继承该对象的句柄
命名文件映射 第一个进程建立文件映射对象时可以给该对象指定一个名字 第二个进程可通过这个名字来打开文件映射对象 第一个进程也可以空过一些其他的IPC机制 有名管道,邮件槽等吧名字传递给第二个进程
句柄复制。 第一个进程建立文件映射对象 然后通过其他IPC机制 有名管道。邮件槽 等吧对象句柄传递给第二个进程 第二个进程复制改句柄就取得该文件映射对象的访问权限
文件映射在多个进程共享数据的非常有效方法,有较好的安全性,但文件映射只能用于本地机器的进程之间 不能用于网络中 而开发者还必须控制进程之间的同步问题
共享内存
实际上是文件映射的一个特殊情况。京城在创建文件映射对象时用 0xFFFFFFFFF 来代替文件句柄。HANDLE 只能运行在同一计算机之间
匿名管道
管道 Pipe 是一种具有两个端点的通讯通道 有一段句柄的进程可以解忧另一端的句柄的进程通讯 管道可以是单向。一端是只读的另一端是只写的。以可以是双向的
匿名管道 Anomymous Pipe 是福进程跟子进程之间 或者同一父进程的两个字进程之间传输数据的无名字的单向管道,通常由父进程创建管道 然后由要通讯的子进程继承通道的读端点跟写端点的句柄。来实现通讯 父进程还可以建立两个或者更多的继承匿名管道读写句柄。这些子进程可以使用管道进行通讯。不需要通过父进程
匿名管道是单片机上实现子进程标准的IO重定向的有效方法 他不能在网上使用 也不能用于两个不相关的进程之间
命名管道
命名管道 是服务器进程和一个或多个客户进程之间通讯的单向或者双向管道 不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间的使用 服务器建立命名管道的时候会给他制定一个名字 任何进程都可以通过改名字打开管道的另一端 根据给定的权限和服务器进行通讯
邮件槽
邮件槽Mailslots 佛佛那个进程间的单向通讯能力 任何进程都能建立邮件槽进行通讯 其他进程成为邮件槽客户。可以通过邮件槽的名字给邮件槽服务发送消息 进来的消息一直都放在邮件槽中 知道服务器进程和读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户 因此可以进行多个邮件槽 进程之间的双向通讯
通过邮件槽可以给本地进算计上的邮件槽其他计算机上的邮件槽制定网络区域中所有计算机上有同样名字的邮件槽发送信息 广播通讯的消息长度不能超过 400 字节 非广播信息长度则受邮件槽服务器指定的最大消息长度的限制
邮件槽与命名管道想次 不过他传输的数据通过不可靠UDP完成的 一单网络发生错误 无法保证消息的正确传输性 而命名管道传输数据则是建立在可靠连接基础上的 不过邮件槽有简化的变成接口和给制定网络区域内所有计算机0广播消息的能力 所以邮件槽是应用程序发送和接收消息的另外一种选择
远程过程调用 RPC
远程调用 RPC 是应用程序可以使用远程调用函数。这使在网络上用RPC进行进程通讯就像调用函数那么简单 RPC既可以在淡季不同进程之间使用 也可以在网络中使用
sockets
不在多赘述
VM_COPUDATA
是一种枪法却鲜为人知的消息 当一个应用向另外一个应用传递数据时,发送方只需使用调Send《essage函数 参数是目的窗口的句柄 传递数据的起始位置 WM_COPYDATA消息 接收发只需像处理其他消息那样出来WM_COPY DATA 消息 这样收发耍昂房就实现了数据共享
WM_COPYDATA是一种非常简单的方法 他在底层实际上是通过文件映射来实现的 他的缺点是灵活性不高 并且它只能用于windos的单片机上
进程令牌
进程提权 如果杀死一个进程需需要得到令牌环
访问令牌
访问令牌 ACESSTOKENS 是windos操作系统安全性一个概念
当用户登录时 系统创建一个访问令牌 里面包括登陆进程返回的sid和由本地安全策略分配给用户的和用户的安全组特权列表
系统使用令牌控制用可以访问那些安全对象 并控制用户执行相关系统操作的能力
主令牌 和 模拟令牌
主令牌是有windosw内核创建并且分配给进程的默认令牌。每个进程都有个主令牌 它描述了与当前进程相关的用户账户的安全上下文
如果用 sysinternal 工具 logonsessions 查看的话 这两个令牌属于不同的logon Session
OpenProcessToken
函数用阿里打开进程相关联的访问令牌
要对一个任意进程 包括系统安全进程和服务进程 进行制定了写相关的访问权限 OPenProcess操作 只要是当前进程具有SeDDeDEBUG 权限就可以
要是一个用户是 Adminstrator或是被赋予了相应的权限 就可以拥有该权限 可是就算我们用Administaror账号对一个系统安全进程执行 OPenProcess 还是会遇到访问拒绝的错误在默认情况下进程的一些访问权限是没有被启动的 所以我们就需要启动这些权限 调用API w
UAC提权
是微软在 Windows Vista 以后版本引入的安全机制 通过UAC 应用进程和任务可使用在非管理账户的安全上下文中运行 除非管理员在特别授予管理员级别的系统访问权限 UAC可以阻止未经过授权的应用程序自动安装。并且防止无意中更改系统设置
UAC 需要授权的动作有 Windows Update 增加或者删除用户账户 改变用户的账户类型 改变UAC设置 安装ActiveX 安装或移除程序 安装设备驱动程序。设置家长控制。将文件移动或者复制到Program Files 或者windosw目录中 查看其他用户文件夹等
再出发 UAC时 系统会创建一个consent.exe进程。该进程通过白名单程序和用户选择来判断是否创建管理员权限进程 请求进程将邀请求的进程 cmdline 和进程路径通过 LPC接口传递给appinfo 的RAiLuanchAdminProcess函数 该函数首先验证路径是否在白名单中 并将结果传递给 consent.exe进程 该进程验证被请求的进程签名以及发起者的权限是否符合要求。然后决定是否弹出 UAC弹框来让用户确认操作。这个UAC会创建新的安全桌面 并比之前的界面 同时 UAc 进程是SYSTEM 进程权限。其他普通进程无法尽心通讯交互 用户确认之后 会调用CreateProcessAsUser函数已管理员权限启动请求的进程
白名单程序 Bypass UAC
有些系统程序是直接获取管理员权限 并不会处罚UAC弹框 这类程序成为白名单程序 例如 slui.exe. wusa.exe taskmgr.exe 等等。可用通过对这些白名单程序进行 DLL劫持 注入或者是修改注册表的执行命令的方式进行启动程序 实现BYpassUac 的提权
直接到System32目录下运行CompMgmtLauncher.exe程序,并没有出现UAC弹窗,直接显示计算机管理的窗口界面。其中,使用进程监控器
Procmon.exe来监控CompMgmtLauncher.exe进程的所有操作行为,主要是监控注册表和文件的操作。通过分析Procmon.exe的监控数据发现,
CompMgmtLauncher.exe进程会先查询注册表HKCU\Software\Classes\mscfile\shell\open\command中数据,发现该路径不存在后,继续查询注册表
HKCR\mscfile\shell\open\command(Default)中的数据并读取,该注册表路径中存储着mmc.exe进程的路径信息。
在CompMgmtLauncher.exe启动的过程中,有一个关键的操作就是它会先读取注册表
HKCU\Software\Classes\mscfilelshell\open\command的数据。打开系统注册表编辑器regedit.exe,查看相应路径下的注册表,发现该注册表路径确
实不存在。所以,如果自己构造该注册路径,写入启动程序的路径,这样,CompMgmtLauncher.exe便会启动该程序。为了验证这个猜想,自己手动添加该注册表路径,并设置默认的数据为C:\WindowslSystem32\cmd.exe,然后使用Procmon.exe进行监控并运行CompMgmtLauncher.exe,成功弹出cmd.exe命令行窗口,而且提示管理员权限。
句柄
什么是句柄 一个整数 一般当前系统下整数是一样的。 比如 32bit系统系就是四字节
这个数字是一对象的唯一标识 和对象一一对应
这个对象可以是一块内存 一个资源 或者一个服务context 如socket thread 等等
指针也是一个句柄。知识由于指针同时拥有更多特殊的含义。实实在在的对应用内存里面的一个地址 所以 通常不把指针说成一句句柄 但是指针也能从一个32位的值引用到一大堆数据的引用
可以理解为系统指针。KEK Value
MFC的时间和消息区别
事件与消息
比如控件事件