2_多核复杂性

前置知识

为了防止中断嵌套会自动 cli

在中断能处理的时候会自动 cli -- 清除中断标记位 if。 这样如果在if = 0 的时候 ,0环死循环 那么就会造成系统假死崩溃。

实际代码验证

我们把前一次的代码设置成死循环

void _declspec(naked) IdtEntry(){// 这里是裸函数,所以不会有函数头 push ebp,mov ebp,esp,,和 ret x / sub esp,x 来平衡堆栈;//  这样的好处是 我们能控制全部的代码。__asm{    //mov eax, dword ptr ds : [0x8003f500];// 注意 : 行内 汇编(内联汇编,要求严格,需要把ds 这些都明确,不然会意想不到)    //mov g_iData, eax;// label:    jmp label;    iretd;//iret  是实地址模式 16位的中断返回}?

}

效果:

系统假死,---实际也死了,,,windbg 也下中断不下来 因为if = 0. 实际 windbg 发送请求给子系统,然后处理。但是这下处理不下来了。

windbg ctrl+break 失效 虚拟机也动不了

2 多核的复杂性 实验1

2.1 每个核 有独立的idt、gdt 所以你每次做的时候在多核情况下得都修改

使用windbg 在每一个cpu的 idt 的 0x20向量中添加不同的中断处理。

这里使用的如下:

在 0号处理器中:

在 1号处理器中(~在内核中是切换cpu 在3环中是切换线程):

2.2 代码展示多核中断提权处理区别

注意:使用windbg 设置双核的每个cpu idt 0x20项 修改成 IdtEntry1 地址 和 IdtEntry2地址

~0 : 在内核中是切换cpu 在3环是切换线程

evoid _ declspec (naked) IdtEntry1()_ asm{mov eax, 1mov g_ 1d, eaxiretdI}}//0x401010avold__ declspec (naked) IdtEntry2(){_asm{mov eax, 2mov g_ 1d, eax iretd}}avoid go(){asm int 0x20}?

2.3 效果

是每次点击 可能所处的cpu不同导致 调用的idt 处理不同,所以全局变量的修改也不同,所以输出的数据每次点击可能不一致。

由于每次所处的cpu 不同,所以中断处理不同:

完整代码:

前提:

使用windbg 在每一个cpu的 idt 的 0x20向量中添加不同的中断处理。

这里使用的如下:

在 0号处理器中:

在 1号处理器中(~在内核中是切换cpu 在3环中是切换线程):

#include"pch.h"#include <stdio.h>#include<stdlib.h>#include<Windows.h>// release 版本会比较好一点,debug会填充一些空间,release会比较稳定?DWORD g_iData = 0;//定义一个全局变量,来存储 0 环数据?void _declspec(naked) IdtEntry(){// 这里是裸函数,所以不会有函数头 push ebp,mov ebp,esp,,和 ret x / sub esp,x 来平衡堆栈;//  这样的好处是 我们能控制全部的代码。__asm{    //mov eax, dword ptr ds : [0x8003f500];// 注意 : 行内 汇编(内联汇编,要求严格,需要把ds 这些都明确,不然会意想不到)    //mov g_iData, eax;// label:    jmp label; // 中断默认 会cli 清除中断if标记位,避免中断嵌套(但是陷阱可以嵌套)    iretd;//iret  是实地址模式 16位的中断返回}??}// 0x401050void _declspec(naked) IdtEntry1(){__asm{    mov g_iData, 1;    iretd;}}// 0x401060void _declspec(naked) IdtEntry2(){__asm{    mov g_iData, 2;    iretd;}}?void go(){__asm {    int 0x20;// 产生中断请求,调用对应中断处理}}?void main(){if ((DWORD)IdtEntry != 0x401040)// code : there is not same as the past, there some crt func takes the place401000 ~401040{    printf("WRONG ADDR");    //exit(0);}go();// 产生中断请求,调用对应中断处理printf("Addr:%p; \nAddr:%p;\n", IdtEntry1,IdtEntry2);printf("Data: %d\n", g_iData);system("pause");}

3 多核复杂性 实验2

实验环境: 还是双核、xp

cr0 的第16位 : 0x10000 是页写保护属性WP;WP 位控制是否允许处理器向标记为只读的内存也写入数据;

写保护修改wp :

  • 0 --- 禁用写保护功能

    关闭 写保护 功能的代码

    asm{    // 修改写保护 WP    cli;//将处理器标志寄存器的中断标志位清0 ,不允许中断    mov eax, cr0    and eax, not 0x10000    mov cr0, eax}?
  • 1 --- 开启写保护功能

    恢复 写保护功能 代码

    _ asm{    mov eax, cr0    or eax, 0x10000    mov cr0, eax    sti;//将中断恢复}?

!pte 0xaddr // 是查看对应地址所在的页目录、页表物理页保护属性

3.1 实验2: 多核复杂性 HOOK KiFastCallEntry()

使用 pchunter 查看 驱动 模块的 的地址 ntkrnlpa.exe(注意在以前老系统中分ntkrnlpa.exe 分了单核、多核、开了pae、未开pae等版本组合;2个2进制位所以有4个不同的ntkrnlpa.exe;这里注意定位你当前使用的是哪一个ntkrnlpa.exe),然后使用 IDA 分析并加载符号;

注意: 修改ida 的加载基址为 pchunter 里面显示的基址,这样便于查看分析。

查看 KiFastCallEntry 函数;

3.2 实验代码

分析:

多核的时候,在 0 号核 中处理蓝屏代码;但是这里我们修改了KiFastCallEntry() 之后 把0号处理器进入了一个死循环, 使得 1号核 时间片中程序 3环进入0环调用KiFastCall ,执行我们Hook的错误代码产生的异常没有被 0 号处理器蓝屏处理。但是 使用windbg 查看 的确 1号处理器 异常产生了。

void __declspec(naked)IdtEntry(){?__asm{    mov eax,cr0    and eax, not 10000h // not 即 将 cr0 第16位 置为0 关闭写保护    mov cr0, eax                mOveax, FFFFFFFF    mov ds: [0x80542520],eax// 这里这个地址 是kifastcallentry里面的起始地址;所以造成其他3环进0环回出错L:    jmp L;    iretd}}?

原文地址:https://www.cnblogs.com/leibso-cy/p/11718826.html

时间: 2024-10-30 21:48:14

2_多核复杂性的相关文章

.NET 4 并行(多核)编程系列之一入门介绍

本系列文章将会对.NET 4中的并行编程技术(也称之为多核编程技术)以及应用作全面的介绍. 本篇文章的议题如下:  1. 并行编程和多线程编程的区别.  2. 并行编程技术的利弊  3. 何时采用并行编程 系列文章链接: .NET 4 并行(多核)编程系列之一入门介绍 .NET 4 并行(多核)编程系列之二 从Task开始 .NET 4 并行(多核)编程系列之三 从Task的取消 .NET 4 并行(多核)编程系列之四 Task的休眠 .NET 并行(多核)编程系列之五 Task执行和异常处理

操作系统与多核处理器

早在上世纪90年代末,就有众多业界人士呼吁用CMP(单芯片多处理器)技术来替代复杂性较高的单线程CPU.IBM.惠普.Sun等高端服务器厂商,更是相继推出了多核服务器CPU.不过,由于服务器价格高.应用面窄,并未引起大众广泛的注意.直到AMD抢先手推出64位处理器后,英特尔才想起利用"多核"这一武器进行"帝国反击战".2005年4月,英特尔仓促推出简单封装双核的奔腾D和奔腾四至尊版840.AMD在之后也发布了双核皓龙(Opteron)和速龙(Athlon) 64 X

“多个单核CPU”与“单个多核CPU”哪种方式性能较强?

多个单核CPU: 成本更高,因为每个CPU都需要一定的线路电路支持,这样对主板上布局布线极为不便.并且当运行多线程任务时,多线程间通信协同合作也是一个问题.依赖总线的传输,速度较慢,且每一个线程因为运行在不同的CPU上.导致不同线程间各开一个Cache,会造成资源的浪费,同时如果线程间协作就会有冗余数据的产生,更加大了内存的开销. 单个多核CPU: 可以很好地规避基本上多个单核CPU提到的所有缺点.它不需要考虑硬件上的开销以及复杂性问题,同时也可以很好地解决多线程间协同工作的问题,减少内存的开销

[转帖]AMD、英特尔为何争相走向胶水多核处理器?真相在此

AMD.英特尔为何争相走向胶水多核处理器?真相在此 胶水多核到底好不好?这个事不是简单一句话能说明的,今天的超能课堂里我们就来聊聊MCM胶水多核技术的过去及未来. 作者:孟宪瑞来源:超能网|2018-11-21 15:25 收藏 分享 从2017年到现在,不到两年时间里X86处理器行业的变化要比过去五年都要大,标志性事件就是AMD重返高性能处理器市场,除了在桌面处理器力推8核16线程处理器之外,在服务器市场上还推出了32核64线程处理器,前不久更推出了7nm的64核128线程"罗马"处

linux学习笔记——搭建基于nginx的web服务器、多核配置、nginx配置参数

############ 认识nginx #############Nginx:(发音同 engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用.  其优点是轻量级(占有内存少),高并发(并发能力强),事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用ngi

多核并行编程技术(一)

首先需要先理解几个概念:串行:最基本的程序执行方式,串行程序的整个运行时,只有一个调用栈和一个运行时上下文,单进程/单线程程序可以认为是串行程序.并发:多线程出现后比较常见的程序执行方式,多线程程序运行时,会有多个运行时上下文和对应的多个调用栈.逻辑上多个线程同时发生,物理上是有操作系统调度,CPU某一时刻依然只执行一个线程的任务,但是某个执行中的线程随时可能被OS调度走,而随后运行的线程操作的数据可能跟刚刚被调度走的线程造成冲突,所以有共享数据同步问题. 多进程如果有共享数据,也符合并发程序的

解读Nodejs多核处理模块cluster

前言大家都知道nodejs是一个单进程单线程的服务器引擎,不管有多么的强大硬件,只能利用到单个CPU进行计算.所以,有人开发了第三方的cluster,让node可以利用多核CPU实现并行. 随着nodejs的发展,让nodejs上生产环境,就必须是支持多进程多核处理!在V0.6.0版本,Nodejs内置了cluster的特性.自此,Nodejs终于可以作为一个独立的应用开发解决方案,映入大家眼帘了. 目录 cluster介绍 cluster的简单使用 cluster的工作原理 cluster的A

几种内部排序-分类-复杂性-稳定性

1. 简述 本文主要说明一些常用的内部排序算法的分类.复杂性和稳定性.主要基于现在的理解和学习,详细准确的复杂度可以参见维基百科等比较权威的网站,对于一些算法的不同实现,复杂度也不同,这里给出的复杂度都是相对较好的算法的复杂度. 2. 分类    3. 复杂性和稳定性 冒泡排序:在已经有序的情况,取得O(N)的复杂度.    快速排序:每次递归都是N的复杂度,递归次数根据序列有关系,当已经有序的情况下,递归N次,时间复杂度为O(N*LogN)    插入排序:在已经有序的情况,取得O(N)的复杂

vs2012 多核编译

http://blog.csdn.net/huojicha/article/details/9308105 #vs2012多核编译1. 属性->配置属性->c/c++->代码生成->关闭/GM2. 属性->配置属性->c/c++->命令行->输入/MP+多核数 如:/MP4