滴水中级班保护模式阶段测试作业

2024-03-17 09:58

本文主要是介绍滴水中级班保护模式阶段测试作业,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

// 保护模式阶段测试第一题.cpp : Defines the entry point for the console application.
//

1给定一个线性地址,长度,读取内容

2-9-9-12

#include "stdafx.h"
#include <Windows.h>
typedef struct PAGE{
    DWORD PTELinkAddress;
    DWORD PDELinkAddress;
    DWORD PTELow;
    DWORD PDELow;
};
char Buf[6];
PAGE Page;    
void  _declspec(naked) print(){
    __asm{

        pushad
        pushf
        mov  eax,dword ptr ds:[Page.PTELinkAddress]
        mov  eax,dword ptr ds:[eax]
        mov  dword ptr ds:[Page.PTELow],eax
        mov  eax,dword ptr ds:[Page.PDELinkAddress]
        mov  eax,dword ptr ds:[eax]
        mov  dword ptr ds:[Page.PDELow],eax
        popf
        popad
        retf
    }
}
void Init(int LinkAddress){

    Page.PDELinkAddress=0xC0600000+((LinkAddress>>18)&0x3ff8);
    Page.PTELinkAddress=0xC0000000+((LinkAddress>>9)&0x7ffff8);
}
int MmIsAddressValid(int LinkAddress){
    Init(LinkAddress);
    __asm{
        call fword ptr Buf;
    }
    if(0==Page.PDELow&0x1){    //PDE p位为1PTT无效
        return 0;
    }
    if(0==Page.PTELow*0x1){    //PTE p位为1物理页无效
        return 0;
    }
    return true;
}
int ReadMemory(void* SrcAddress,DWORD DestAddresss,DWORD size){
    int cout=((int)DestAddresss)%0x1000;
    if(cout+size<=0x1000){                //访问的数据在一个物理页
        if(0==MmIsAddressValid(((int)DestAddresss)&0xfffff000)){
            return 0;
        }
        memcpy(SrcAddress,(void*)DestAddresss,size);
    }
    else{                                //访问的数据长度不在一个物理页上
        int n=(cout+size)/0x1000+1;        //需要访问这么多个页才能知道有没有内存能不能读
        int RoundAddress=(((int)DestAddresss)&0xfffff000);
        for(int i=0;i<n;i++){
            if(0==MmIsAddressValid(((int)RoundAddress))){
                return 0;                //只要有一个页没有挂物理页就返回失败
            }
            RoundAddress+=0x1000;
        }
        memcpy(SrcAddress,(void*)DestAddresss,size);
    }
    return 1;
}
int main(int argc, char* argv[])
{
    int* P=(int*)VirtualAlloc(NULL,0x1000,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
    *((WORD*)&Buf[4])=0x48;
    printf("%p\n",print);
    if(0==ReadMemory((void*)P,0x300000,0x1000)){
        MessageBox(0,0,"读取内存失败",0);
    }

    printf("Hello World!\n");
    return 0;
}

 

保护模式阶段测试第二题

#include "stdafx.h"
#include <Windows.h>
#define  SRCADDRESS   0x1000
typedef struct PAGE{
    DWORD SrcLinkAddress;
    DWORD DestLinkAddress;        //把目标地址线性的物理页挂到原线性地址的屋里也出
    DWORD DestPDELinkAddress;
    DWORD DestPTELinkAddress;
    DWORD SrcPDELinkAddress;
    DWORD SrcPTELinkAddress;
};
PAGE Page;
void Init(int* P){
    Page.SrcLinkAddress=SRCADDRESS;
    Page.DestLinkAddress=(int)P;
    int a=(((Page.DestLinkAddress)>>18)&0x3ff8);
    Page.DestPDELinkAddress=0xC0600000+((Page.DestLinkAddress>>18)&0x3ff8);
    Page.DestPTELinkAddress=0xC0000000+((Page.DestLinkAddress>>9)&0x7ffff8);
    Page.SrcPDELinkAddress=0xC0600000+((Page.SrcLinkAddress>>18)&0x3ff8);
    Page.SrcPTELinkAddress=0xC0000000+((0x1000>>9)&0x7ffff8);
}//0001 000 0 0000 0000
 
void  _declspec(naked) print(){
    __asm{
    
        pushad
        mov edx,dword ptr ds:[Page.SrcPDELinkAddress]        //原地址PDE的p位  判断是否有
        and edx,0x1
        jne  taolaod                                        //P位不等于0

        //如果把0x1000的PDE了会改变 2MB线性地址的物理页全都错乱
        //如果VirtualAlloc分配的地址是上下有2GB线性地址没有挂需要给src的线性地址挂上PTE
        //这里面是给0x1000线性地址如果该PDE堆栈就挂了 ring3堆栈就挂了  0x1000线性地址与ring3堆栈公有一个PTE,我曾经吃过亏
taolaod:
        mov eax,dword ptr ds:[Page.DestPTELinkAddress]
        mov ecx,dword ptr ds:[eax]
        mov eax,dword ptr ds:[eax+4]

        mov edx,ds:[Page.SrcPTELinkAddress]
        mov dword ptr ds:[edx],ecx
        mov dword ptr ds:[edx+4],eax
        popad
        retf
    }
}
int main(int argc, char* argv[])
{
    int  i=0;
    char Buf[6];
    int* P=(int*)VirtualAlloc(NULL,0x1000,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
    if(NULL==P){
        MessageBox(NULL,0,"VirtualAlloc开辟内存失败",0);
    }
    for(i=0;i<100;i++){
        P[i]=(int)(P+i);
    }
    Init(P);
    *((WORD*)&Buf[4])=0x48;
    printf("%p\n",print);
    int c=0;
    __asm{
        call fword ptr Buf;
    }
    int *a=(int*)0x1000;
    for(i=0;i<100;i++){
        if(i%5){
            printf("%p\t",a[i]);
        }else{
            printf("\n");
        }
    }
    printf("Hello World!\n");
    return 0;
}
 

这篇关于滴水中级班保护模式阶段测试作业的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/818612

相关文章

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

BIRT 报表的自动化测试

来源:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-birttest/如何为 BIRT 报表编写自动化测试用例 BIRT 是一项很受欢迎的报表制作工具,但目前对其的测试还是以人工测试为主。本文介绍了如何对 BIRT 报表进行自动化测试,以及在实际项目中的一些测试实践,从而提高了测试的效率和准确性 -------