【Windows内核】(9)调用门实验
1、构造一个调用门,实现3环读取高2G内存
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
DWORD Value;
void __declspec(naked) GetReg()
{
__asm
{
pushad
pushfd
mov eax,0x8003f008
mov ebx,[eax]
mov Value,ebx
popfd
popad
retf
}
}
int main(int argc, char* argv[])
{
char buff[6] = {0,0,0,0,0x48,0};
__asm
{
call fword ptr [buff]
}
printf("%x \n",Value);
getchar();
return 0;
}
函数地址:00401020

构造调用门描述符 0040EC00 00081020 放入地址0x8003f048中

运行查看结果 成功读取了GDT表第二项的低四字节
2、在第一题的基础上进行修改,在门中再建一个门跳转到其他地址
#include "stdafx.h"
#include <windows.h>
char buff[6] = {0,0,0,0,0x48,0};
char buff1[6] = {0,0,0,0,0x90,0};
BOOL bFunctionHas0CPL1Called; // 证明裸函数1被调用
BOOL bFunctionHas0CPL2Called; // 证明裸函数2被调用
void __declspec(naked) one()
{
__asm
{
mov al,1
mov byte ptr ds:[bFunctionHas0CPL1Called],al
call fword ptr [buff1]
retf
}
}
void __declspec(naked) two()
{
__asm
{
mov al,1
mov byte ptr ds:[bFunctionHas0CPL2Called],al
retf
}
}
int main()
{
__asm
{
call fword ptr [buff]
}
printf("%d %d\n", bFunctionHas0CPL1Called,bFunctionHas0CPL2Called);
getchar();
return 0;
}
函数一的地址:00401030

函数二的地址:00401050

修改调用门描述符

运行 结果显示两个函数都通过调用门调用


浙公网安备 33010602011771号