保护模式阶段测试说明

保护模式阶段测试说明

感谢hambaga师傅的博客

 要求

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

 这个其实就是造轮子,先咕咕咕了

申请长度为100的DWORD的数组,且每项用该项的地址初始化

// Task_Segment.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<windows.h>

DWORD* arr;

DWORD* GetPDE(DWORD addr)
{
    return (DWORD*)(0xc0600000+((addr>>18)&0x3ff8));
}

DWORD* GetPTE(DWORD addr)
{
    return (DWORD*)(0xc0000000+((addr>>9)&0x7ffff8));
}

__declspec(naked) void func()
{
    __asm
    {
        pushad
        pushfd
    }
    *GetPTE(0x1000)|=*GetPTE((DWORD)arr);
    __asm
    {
        popfd
        popad
        iretd
    }
}

int main(int argc, char* argv[])
{

    arr=(DWORD*)VirtualAlloc(0,0x1000,MEM_COMMIT,PAGE_READWRITE);
    int i=0;
    for(i=0;i<100;i++)
    {
        arr[i]=(DWORD)(arr);
    }
    printf("在IDT表构建中断门,请在windbg中执行下面的指令:
");
    printf("eq 8003f500 %04xee00`0008%04x",(DWORD)func>>16,(DWORD)func&0x0000ffff);
    getchar();
    __asm int 0x20

    unsigned long* p;
    p=(DWORD*)(0x1000);

    //printf("%x
",p);

    for(i=0;i<100;i++)
    {
        printf("%x:%x
",i,p[i]);
    }
    getchar();
    return 0;
}
原文地址:https://www.cnblogs.com/pppyyyzzz/p/13896649.html