0线性地址挂shellcode

这篇博客探讨了Windows系统中的内存Hook技术,通过示例代码展示了如何使用CallGate函数来修改内存地址,实现对特定函数(如MessageBox)的Hook。文章详细解释了PDE(页目录项)和PTE(页表项)的概念,并展示了如何保存和恢复原始内存状态。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include <windows.h>

LPDWORD dwPDE=0;
LPDWORD dwPTE=0;
LPDWORD zeroPDE=0;
LPDWORD zeroPTE=0;
BYTE shellcode[] = {0x6a,0,0x6a,0,0x6a,0,0x6a,0,0xe8,0,0,0,0,0xc3};

VOID _declspec(naked) CallGate(){
	_asm{
		push 0x30
		pop fs
		pushad
		pushfd
		lea ecx,shellcode
		//Get PDE
		mov eax,ecx
		shr eax,0x14
		and eax,0xffc
		sub eax,0x3fd00000
		mov eax,[eax]
		mov dwPDE,eax
		//Get PTE
		mov eax,ecx
		shr eax,0xa
		and eax,0x3ffffc
		sub eax,0x40000000
		mov eax,[eax]
		mov dwPTE,eax
		//zero address hook physic address
		mov eax,ds:[0xc0300000]
		test eax,eax
		jnz Flag
		mov ecx,dwPDE
		mov ds:[0xc0300000],ecx
Flag:
		mov ecx,dwPTE
		mov ds:[0xc0000000],ecx
		//Save zero PDE and PTE
		mov eax,ds:[0xc0300000]
		mov zeroPDE,eax
		mov eax,ds:[0xc0000000]
		mov zeroPTE,eax
		popfd
		popad
		retf
	}
}

int main(){
	_asm{
//		int 3
	}
	BYTE gate[] = {0,0,0,0,0x48,0};
	UINT32 dwAddr = (UINT32)MessageBox;
	
	//Fix SHELLCODE
	UINT32 dwOffset = (UINT32)shellcode & 0xFFF;
	printf("%p\n",CallGate);
	getchar();
	*(LPDWORD)&shellcode[9] = UINT32(dwAddr -dwOffset-13);
	_asm{
		push fs
		call fword ptr gate
		pop fs
		call [dwOffset]
	}
	printf("0xC030:%p\n0xC00:%p\noffset:%x\n",zeroPDE,zeroPTE,dwOffset);
	system("pause");

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值