Windows系统调用中API从3环到0环(下)
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
Windows系统调用中API从3环到0环(下)
如果对API在三环的部分不了解的,可以查看 Windows系统调用中的API三环部分(依据分析重写ReadProcessMemory函数
这篇文章分为上下两篇,其中上篇初步讲解大体轮廓,下篇着重通过实验来探究其内部实现,最终分析两个函数(快速调用与系统中断),来实现通过系统中断直接调用内核函数。
一、INT 0x2E进0环
.text : 77F070C0 // 之前调用该函数时 mov eax, 0x115,向eax传入一个函数号
.text : 77F070C0 lea edx, [esp + arg_4] // 当前参数的指针存储在 edx中
.text : 77F070C4 int 2Eh; // 通过中断门的形式进入到内核中
1)在GDT表中查看0x2eh
在保护模式的门这一节中,我们了解到当发生中断时,操作系统会查找idt表,根据中断号在idt表中找到中断门描述符,从中断门描述符中读取CS:EIP的信息。
之后,SS EIP 通过搜索GDT表,该表中存放着各个TSS描述符(每个进程一个TSS,内核一个TSS,TSS存放各种寄存器用于任务切换),来查找内核的 SS ESP。
如图:我们通过windbg来查找出该地址 gdt+2e*8
根据中断门描述符属性将 83e8ee00`00082fee 拆分拼接之后可知SS:08 / EIP:83e82fee
2)查看 EIP:83e82fee 这个函数
kd> u 83e82fee
nt!KiSystemService:
83e82fee 6a00 push 0
83e82ff0 55 push ebp
83e82ff1 53 push ebx
83e82ff2 56 push esi
83e82ff3 57 push edi
83e82ff4 0fa0 push fs
83e82ff6 bb30000000 mov ebx,30h
83e82ffb 668ee3 mov fs,bx
该 nt!KiSystemService函数是真正的内核函数,并不是ntdll.dll模块下,其存在于ntoskrnl.exe / ntkrnlpa.exe中(根据分页模式不同选用不同的程序)
二、通过 systenter进入0环
MSR寄存器存着进入内核的 CS、ESP、EIP的寄存器的值,SS=IA32_SYSENTER_CS+8。
1)windbg查看这个MSR寄存器的值
rdmsr 174 //查看CS
rdmsr 175 //查看ESP
rdmsr 176 //查看EIP
2)查看EIP这个函数
kd> u 83e830c0
nt!KiFastCallEntry:
83e830c0 b923000000 mov ecx,23h
83e830c5 6a30 push 30h
83e830c7 0fa1 pop fs
83e830c9 8ed9 mov ds,cx
83e830cb 8ec1 mov es,cx
83e830cd 648b0d40000000 mov ecx,dword ptr fs:[40h]
83e830d4 8b6104 mov esp,dword ptr [ecx+4]
83e830d7 6a23 push 23h
其是调用nt!KiFastCallEntry这个函数,跟nt!KiSystemService一样,该函数是真正的内核函数。
三、通过中断来重写ReadProcessMemory函数(通过快速调用时的实现可以查看这篇Windows系统调用中的API三环部分(依据分析重写ReadProcessMemory函数))
#include "pch.h"
#include <iostream>
#include <algorithm>
#include <Windows.h>
void ReadMemory(HANDLE hProcess, PVOID pAddr, PVOID pBuffer, DWORD dwSize, DWORD *dwSizeRet)
{ _asm
{ lea eax, [ebp + 0x14]
push eax
push[ebp + 0x14]
push[ebp + 0x10]
push[ebp + 0xc]
push[ebp + ]
mov eax, 0x115
mov edx,esp
int 0x2e
add esp,
}
}
int main()
{
HANDLE hProcess = ;
int t = ;
DWORD pBuffer;
//hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0,a);
ReadMemory((HANDLE)-, (PVOID)&t, &pBuffer, sizeof(int), );
printf("%X\n", pBuffer);
ReadProcessMemory((HANDLE)-, &t, &pBuffer, sizeof(int), );
printf("%X\n", pBuffer); getchar();
return ;
}
Windows系统调用中API从3环到0环(下)的更多相关文章
- Windows系统调用中API的3环部分(依据分析重写ReadProcessMemory函数)
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中API的3环部分 一.R3环API分析的重 ...
- Windows系统调用中API从3环到0环(上)
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中API从3环到0环(上) 如果对API在三 ...
- Windows系统调用中的系统服务表描述符
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中的系统服务表描述符 在前面,我们将解过 ...
- Windows系统调用中的现场保存
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中的现场保存 我们之前介绍过三环进零环的步骤 ...
- Windows系统调用中的系统服务表
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中的系统服务表 如果这部分不理解,可以查看 ...
- Windows Forms和WPF在Net Core 3.0框架下并不会支持跨平台
Windows Forms和WPF在Net Core 3.0框架下并不会支持跨平台 微软将WinForms和WPF带到.NET Core 3.0这一事实,相信大家都有所了解,这是否意味着它在Linux ...
- KiSystemCall64 win10 21h2函数流程分析 3环到0环
0x00基本信息 系统:windows 10 21h2 工具:ida 7.7 , windbg 10 3环写一个win32k 函数 看访问流程 0x01分析 例如:3环函数 FlattenPath(x ...
- windows,cmd中,如何切换到磁盘的根目录下
需求描述: 在windows的cmd中操作,有的时候也会遇到切换了很多的目录,然后需要切换到根目录的情况 操作过程: 1.通过cd \的方式,切换回当前磁盘的根目录下 备注:未切换之前,在Driver ...
- 64位CreateProcess逆向:(二)0环下参数的整合即创建进程的整体流程
转载:https://bbs.pediy.com/thread-207683.htm 点击下面进入总目录: 64位Windows创建64位进程逆向分析(总目录) 在上一篇文章中,我们介绍了Create ...
随机推荐
- 实验吧CTF练习题---WEB---Forms解析
实验吧web之Forms 地址:http://www.shiyanbar.com/ctf/1819 flag值:ctf{forms_are_easy} 解题步骤: 1.查看页面源代码,从中发现&q ...
- FreeSql (二十一)查询返回数据
FreeSql 采用 ExpressionTree 优化读取速读,如果懂技术的你一定知道 .NETCore 技术下除了原生代码,最快就是 Emit 和 ExpressionTree. 项目在初期使用的 ...
- jps虚拟机进程状态工具
jps(JVM Process Status Tool) jps工具可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine ...
- 【第十六篇】这一次要写的是bootstrap-table
先上图吧这就是效果图 上代码(这一部分是工具栏的,还包括slider滑动条) <div class="box-body"> <div class="ro ...
- java8中字符串常量以及GC相应处理机制
目录 1,常量池 1.1, class文件常量池 1.2, 运行时常量池 1.3,字符串常量池 String.intern() -XX:StringTableSize 2,使用new关键字和使用字符串 ...
- Hadoop&Hbase 双机热备--Pacemaker&DRBD部署
相关文章 DRBD的介绍请参考http://blog.csdn.net/rzhzhz/article/details/7103772 DRBD的部署请参考http://blog.csdn.ne ...
- Visual Studio Code安装以及C/C++运行环境搭建
众所周知VSCode是全宇宙最好用的编辑器 (雾 配置了很久,今日终于配置完成了,还是有点麻烦的,本文是为了方便一些不懂怎么配置的小白,以及还有一些美化教程. 一.安装 Visual Studio C ...
- Python基础(十一)
今日主要内容 补充:三目运算 f-strings 迭代器 生成器 补充:三目运算 三目运算(三元运算)结构: 表达式1 if 条件表达式 else 表达式2 c = a if a > b els ...
- Django-中间件-csrf扩展请求伪造拦截中间件-Django Auth模块使用-效仿 django 中间件配置实现功能插拔式效果-09
目录 昨日补充:将自己写的 login_auth 装饰装在 CBV 上 django 中间件 django 请求生命周期 ***** 默认中间件及其大概方法组成 中间件的执行顺序 自定义中间件探究不同 ...
- 详解es6 class语法糖中constructor方法和super的作用
大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScript 6中 ...