Windows内核试验13_系统调用

ReadMem

HookBase

#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
DWORD Target[3] = { 0x8003f120,0x8003f1c0,0x8003f200 };
DWORD* ServiceTable = (DWORD*)0x8003f3c0;
void SystemCallEntry();
void ReadMem();
void AllocMem();
int i;
char* p;

void __declspec(naked) IdtEntry() {
	p = (char*)Target[0];
	for (i = 0; i < 128; i++) {
		*p = ((char*)SystemCallEntry)[i];
		p++;
	}
	
	p = (char*)Target[1];
	for (i = 0; i < 64; i++) {
		*p = ((char*)ReadMem)[i];
		p++;
	}
	p = (char*)Target[2];
	for (i = 0; i < 64; i++) {
		*p = ((char*)AllocMem)[i];
		p++;
	}
	ServiceTable[0] = 0x8003f1c0;
	ServiceTable[1] = 0x8003f200;

	__asm {
		mov eax,0x0008f120
		mov ds:[0x8003f508],eax
		mov eax,0x8003ee00
		mov ds : [0x8003f50C] , eax
	}


	__asm {
		iretd
	}

}

void __declspec(naked) SystemCallEntry() {
	__asm {
		push 0x30
		pop fs
		sti

		mov ebx,ss:[esp+0xC]
		mov ecx,ds:[ebx+4]
		mov ebx,0x8003f3c0
		mov edx,ds:[ebx+eax*4]
		call edx

		cli
		push 0x3b
		pop fs
		iretd
	}
}

void __declspec(naked) ReadMem() {
	__asm {
		mov eax,ds:[ecx]
		ret
	}
}
void __declspec(naked) AllocMem() {
	__asm {
		push ecx
		push 0
		mov eax,0x8053454C
		call eax
		ret
	}

}
void go() {
	__asm int 0x20
}
// eq 8003f500 0040ee00`00081040

void main() {
	if ((DWORD)IdtEntry != 0x401040) {
		printf("wrong address:%p", IdtEntry);
		exit(-1);
	}
	go();

}

InlineHook3

#include <iostream>
#include<Windows.h>

DWORD ReadMem(DWORD addr);
DWORD AllocMem(DWORD size);

DWORD __declspec(naked) ReadMem(DWORD addr) {
    __asm {
        mov eax,0
        int 0x21
        ret
    }
}



DWORD __declspec(naked) AllocMem() {
    __asm {
        mov eax, 1
        int 0x21
        ret
    }
}
// eq 8003f508 8003ee00`0008f120

int main()
{
    printf("%p\n", ReadMem(0x8003f3c8));
    printf("%p\n", AllocMem(16));
    system("pause");
}

在这里插入图片描述
在这里插入图片描述

AllocMem

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻梦&之璐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值