【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

修改调用门描述符

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

posted @ 2021-03-17 13:28  一窝吉尼斯  阅读(276)  评论(0)    收藏  举报