1.b获取自身句柄
2.b得到自己的imagebase/sizeofimage
3.b创建缓冲区 将自己复制进去
4.b打开要注入的进程
5. 在a进程申请内存,大小sizeofiamge
6.修复b的重定位表
7.将修复后的数据 拷贝到A进程中
8.创建远程线程 执行b中的entry函数
9.entry修复IAT表 表中地址记录的函数地址的值
3环:FS:[0]指向的是TEB 加偏移 找到PEB
0环:FS:[0]指向KPCR 64位在GS中 IA64在0x00000000fff00000
KiWatiListHead 等待链表1个 调度链表32(线程优先级)个(服务器版本每个核有个调度链表) 正在跑的线程在cpu的kpcr中
线程切换的三种情况:
1.当前线程主动调用API:
API函数-》KiSwapThread->KiSwapContext->SwapContext
2.当前线程时间片到期:
KiDisPatchInterrupt->KiQuantumEnd->SwapContext
3.有备用线程(KPCR.PrcbData.NextThread)
KiDispatchInterrupt->SwapContext
FS[30]->TEB 切换时 改变的段描述符的基址
CR3页目录表基址 当前进程的KPROCESS.DirectoryTableBase 0x18
dt _KAPC_STATE
ntdll!_KAPC_STATE
+0x000 ApcListHead : [2] _LIST_ENTRY
+0x010 Process : Ptr32 _KPROCESS
+0x014 KernelApcInProgress : UChar
+0x015 KernelApcPending : UChar
+0x016 UserApcPending : UChar
0x44进程的 CR3 0x220父进程
进程挂靠
ntreadvirtualmemory
kiattachprocess
修改父进程的值为要读取的进程
修改CR3的值 swapprocess
不同进程的高2G数据 物理地址 几乎相同
DriverSection 指向了驱动链表 LDR_TABLE_ENTRY 成功LIST_ENTRY
KeServiceDescriptorTable
重载内核 拷贝系统服务表 HOOK KiFastCallEntry
Mutex 当前线程可以重复进入 MmUnloadSystemImage KeReleaseMutant(x,y,Abandom,z) 被丢弃 不会造成其他线程死锁
Mutant APcDisable =0
Mutex APcDisable =1
PSPCidTAble object_handle tablecode 第一位0代表多少分级
CPU异常 查IDT 执行中断处理函数 CommonDispathcExce KiDispatchException IRETD返回3环
throw ->kiRaiseException->KiDispatchException 系统调用返回3环
3环 KiUserExceptionDispatcher ->RTLDispatchException 返回true 调用zwcontinue 进入0环 再次进入3环 从修正后的位置执行
返回假 调用zwraiseexception 第二轮异常分发
VEH AddVectorExceptionHanddler
SEH
UnhandlerExceptionFilter NtQueryINformationProcess debugport有调试就回调给调试器
没调试 就走 SetUnhandlerExceptionFilter 顶层回调
没设置SetUnhandlerExceptionFilter 就会走系统的结束进程线程
调试器进程 0xf24 存储 Debug_Object对象句柄
被调试进程的 DebugPort存储的是 _Debug_Object的地址
调试事件采集函数 DbgK_函数 DbgKSendApiMessage(a(7种消息类型),b(要不要挂起其他线程)) ->add _Debug_Object+30的链表位置
调试进程的时候 BeingDebug 设置DebugBreakPoint
DebugActiveProcess FakeProcess
软件断点: INT 3 IDT中断处理函数 CommonDispathcExce KiDispatchException DbgkForwordException DbgKSendApiMessage
内存断点:VirtualProtectEx 物理页的 影响整个页 PTE PAGE_NOACCESS P=0 PAGE_EXECUTE_READ (P=1 R/W=0)
CPU访问内存 引起缺页异常 引起 IDT E号中断
硬件断点CPU检测到DR寄存器 触发单步异常 1号中断 调试寄存器 Dr0-Dr3(线性地址 L0 G0 -L3 G3 置1 G影响全局 L影响一次) D4-D5(保留)
Dr7 32位 L0G0-L3G3 R/W 0 -RW3 (00 执行断点 01写入断点 11访问断点)LEN(00 1字节 01 2字节 11 4字节)
Dr6 B0-B3位 区分是EFlag的TF位 引起的异常 还是硬件断点引起的 单步异常
单步异常 :EFLAG的 TF置1 CPU每执行一步 触发一个异常
单步步过:硬件断点 或 软件断点 遇到call等 计算指令长度 在下一行下断点