- OF overflow flag
- ZF zero flag
- je指令
- 指令结果为0则ZF=1
- TF trap flag
- CPU的工作方式.
- 当TF=1时,CPU每执行一次指令就会触发1号终端,
- SF sign flag
- 指令结果为负数则SF=1
- CF carry flag
- PF parity falg
- 记录指令执行后,其运算结果的所有位中1的个数是否为偶数
- DF direction flag
- 当DF=1时,存储器地址自动减少
- 当DF=0时,存储器地址自动增加
- CLD指令设置DF=0
- STD指令设置DF=1
- 相关指令有:MOVSB,MOVSW,MOVSD
- 将DS:SI =>(cx字节)=>ES:DI 位数: 32位模式寄存器叫EFLAG,大小32 64位模式寄存器叫RFLAG,大小64
如何读写flag:
- 读
- pushf 指令将flag数据压入桟,pop ax存入寄存器
- 写
- popf指令将桟顶数据存入flag寄存器
OF和CF的区别是什么?
--> CF(Carry Flag): 进位标志位,标志某一个操作过程中是否从高位借位。 --> OF(Over Flag): 溢出标志位,标志某一个操作后结果是否超出目的寄存器的最大可存储值。
https://blog.csdn.net/abc123lzf/article/details/109258188
控制寄存器 #
- CR3 也被称为PDBR,存放页目录表的物理地址(前20位)
- 每次进程切换时,linux就会把下一个将要运行进程的页目录表物理内存基地址等信息存放到CR3中
https://blog.csdn.net/SweeNeil/article/details/106171361
windows ring3 到 ring0 #
TODO: sysenter和int 2e
windows进程间通讯 #
windows共享内存 #
调试器原理,三大断点实现 #
软中断: 在点击中断的地址处保存原指令,然后写入0xcc(int3)
硬中断:
调试寄存器有DR0-7,只有四个可用存储硬中断地址(0-3)
内存中断: 页异常
用中文回答,为什么在windows平台上,为什么软中断只需要修改一次,硬中断需要对所有的线程执行上下文进行修改
aes加密中key和iv的作用 #
key:加密密钥 iv:初始向量
块加密
https://justinyan.me/post/4356
linux 进程命令 #
windows网络命令 #
- ping
- ipconfig
- arp
- *tracert
- *route
- *nslookup
windows如何防止内存被扫描 #
像一些魔改的cs实现会让木马hook sleep函数,sleep时加密配置防止被扫描
32位程序如何在64位操作系统上运行 #
Microsoft 提供了一个名为 WoW64(Windows 32-bit on Windows 64-bit)的兼容层,用于运行32位应用程序。WoW64是一个兼容层,它模拟了32位Windows环境,包括文件系统重定向(system32=>SysWOW64)和注册表重定向等功能,从而使32位应用程序能够在64位系统中运行。
进程、线程、协程 #
进程是操作系统分配资源和调度的基本单位,每个进程都有字节的地址空间、数据
线程是进程内的执行单元,所有线程共享相同的进程内存和资源,每个线程拥有自己的执行堆栈和PC。 线程的上下文切换成本比进程低,适合轻量级的并发任务,在多核处理器上可用并行。
协程是一种用户态的执行单元,提供了比线程更轻量的非抢占式多任务处理能力
反调试、反HOOK、反注入方法,消息钩子的运行机制 #
-
反调试:
- 使用API检测调试器
- 异常处理
- 检查PEB中的BeingDebugged标志位
- 检测由于调试而产生的时间差异
- 检查是否有设置硬件断点
-
反HOOK:
- 代码完整性检查(函数入口点是否有hook)
- 直接系统调用(syscall)
-
反注入方法:
- 访问权限设置(限制进程写入内存,TODO how?)
- 内存扫描:扫描异常内存块(TODO)
- 模块白名单:是否有未知来源的模块
-
消息钩子的运行机制 (windows hooks)
windows中多进程的同步方式,多线程的同步方式 #
- 进程同步
- Mailslots
- Pipes
- Windows Messaging
- 线程同步
- EnterCriticalSection,创建临界变量,临界块使得同一时间只能够有一个线程的代码段访问到该共享资源,需要程序员保证变量在块中,不然没用
- TODO Synchronize:使用同步对象来实现线程之间的同步。
- both
- mutex
- Semaphores 信号量,同时允许多个事件发生
- HANDLE hSemaphore = CreateSemaphore(NULL, 3, 3, "PrintQueueSemaphore");
- WaitForSingleObject(hSemaphore, INFINITE);
- ReleaseSemaphore(hSemaphore, 1, NULL);
- events
IDA #
x64dbg #
Windbg #
-
g
运行 -
r
查看所有寄存器r rax
查看 rax
-
u
查看当前eip的反汇编 -
直接按回车执行上一条命令
-
分号做分割,可以在一行执行多条命令
-
ctrl + break
强制停止命令 -
sxe ld:xx.dll
dll加载时断下 -
* blabla
注释 -
u $exentry
查看入口/entry -
x ntdll!D*
查看符号 -
p
step over -
t
(trace) step into
条件断点:??
Gdb #
- r 运行,run
- c 继续,continue
- info reg 查看寄存器
- br *main 在main函数下断点
- br src/ss.c:123 在文件 ss.c:123 处下断点
- del 1 删除断点1
- diable 1 禁用断点1
- enable 1 启用断点1
- info br 查看断点
- x/4gx 0xdeadbeef 检查内存
- x/4wx 控制每行的列数
- x/2wx $rax
- x/10i $pc 打印当前汇编
- x/10i $rip rip/eip/pc都可以
- x/-10i $rip 可以倒着来
- n(next) 源码级别step over
- s(step) 源码级别step in
- si(stepi) 汇编级别step in
- ni(nexti) 汇编级别step over
- starti 开始时断下(找不到入口/entry时)