InlineHook3(单步异常挂钩,监测调试器行为)

本文详细探讨了Windows环境下,通过IDT(Interrupt Descriptor Table)实现的Hook技术,涉及裸函数、中断处理、内存操作和系统调用的修改。作者展示了如何修改中断入口地址并监控特定中断,以及hook后的代码执行流程。
#include <iostream>
#include<Windows.h>
char* p;
int i;
void JmpTarget();
void __declspec(naked) IdtEntry() {
    p = (char*)0x8003f120;
    for (int i = 0; i < 64; i++) {
        *p = ((char*)JmpTarget)[i];
        p++;
    }

    __asm {
        iretd

    }
}

void __declspec(naked) JmpTarget() {

    __asm {
        push eax
        mov eax,ss:[esp+4]
        mov ds:[0x8003f3f0],eax
        pop eax



        push 0
        mov word ptr [esp+2],0

        push 0x8053F31D
        ret
    }


}
void go() {
    __asm {
        mov eax, 1
        int 0x20
    }
}

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

在这里插入图片描述

开始Hook

#include <iostream>
#include<Windows.h>
DWORD g_num;
void __declspec(naked) IdtEntry() {
    __asm {
        mov eax, cr0
        and eax, not 10000h
        mov cr0, eax



        mov eax, 0x03f12068
        mov ds:[0x8053F314] , eax
        mov ax,0xc380
        mov ds : [0x8053F318] , eax


        //8053F314
        mov eax, cr0
        or eax, 10000h
        mov cr0, eax

 
        iretd

    }
}

void go() {
    __asm {
        mov eax, 1
        int 0x20
    }
}

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

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

#include <iostream>
#include<Windows.h>
DWORD g_num;
void __declspec(naked) IdtEntry() {
    __asm {
        mov eax, cr0
        and eax, not 10000h
        mov cr0, eax



        mov eax, 0x03f12068
        mov ds:[0x8053F314] , eax
        mov ax,0xc380
        mov ds : [0x8053F318] , eax


        //8053F314
        mov eax, cr0
        or eax, 10000h
        mov cr0, eax

  
        iretd

    }
}

void go() {
    __asm {
        mov eax, 1
        int 0x20
    }
}

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

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

#include <iostream>
#include<Windows.h>
char* p;
int i;
void JmpTarget();
void __declspec(naked) IdtEntry() {
    p = (char*)0x8003f120;
    for (int i = 0; i < 64; i++) {
        *p = ((char*)JmpTarget)[i];
        p++;
    }

    __asm {
        iretd

    }
}

void __declspec(naked) JmpTarget() {

    __asm {
        push eax
        mov eax, ss: [esp+4]
        mov ds : [0x8003f3f0] , eax
        mov eax,1
        mov ds : [0x8003f3f4] , eax
        pop eax



        push 0
        mov word ptr[esp + 2], 0

        push 0x8053F31D
        ret
    }


}
void go() {
    __asm {
        mov eax, 1
        int 0x20
    }
}

int main()
{
    if ((DWORD)IdtEntry != 0x401040) {
        printf("wrong addr:%p", IdtEntry);
        exit(-1);
    }
    go();
    system("pause");
}
#include <iostream>
#include<Windows.h>
DWORD g_num;
DWORD g_enabled;
void __declspec(naked) IdtEntry() {
    __asm {
        mov eax,ds:[0x8003f3f0]
        mov g_num,eax
        mov eax, ds : [0x8003f3f4]
        mov g_enabled,eax
        xor eax,eax
        mov ds:[8003f3f4],eax

        iretd

    }
}

void go() {
    __asm {
        mov eax, 1
        int 0x20
    }
}

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

    while (1) {
        go();
        Sleep(1000);
        if (g_enabled)
            printf("%p\n", g_num);
    }
   
    system("pause");
}

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寻梦&之璐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值