吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3858|回复: 13
收起左侧

[系统底层] HOOK-NtReadFile 实现驱动与应用程序通信

  [复制链接]
aswcy815174418 发表于 2021-9-18 04:08

测试环境:Windows XP SP3
本质:通过InlineHOOK,NtReadFile,判断参数来判断是否是自己的暗号
Ring3(应用)代码:

#include "stdio.h"
#include "windows.h"
void main(){
    char buf[20] = {0};
    ReadFile(-1,buf,0,0,0);
    getchar();
    return;
}

Ring0(驱动)头文件

#pragma once
#include "ntifs.h"

typedef NTSTATUS(*p)(
    HANDLE           FileHandle ,
    HANDLE           Event ,
    PIO_APC_ROUTINE  ApcRoutine ,
    PVOID            ApcContext ,
    PIO_STATUS_BLOCK IoStatusBlock ,
    PVOID            Buffer ,
    ULONG            Length ,
    PLARGE_INTEGER   ByteOffset ,
    PULONG           Key
    );

//获取NtReadFile函数地址
unsigned int GetNtReadFileAddr();
//改回原来的数据
void cancel();
//修改成jmp到自己的函数
void Modify();

//原始数据保留
extern UCHAR buf[10];

Ring0(驱动)主函数

#include "Tools.h"

VOID DriverUnload(PDRIVER_OBJECT driver) {
    cancel();
    DbgPrint("firts:Our driver is unloading!!\r\n");
}

extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath){
    DriverObject->DriverUnload = DriverUnload;
    DbgPrint("first : hello ,load server!!\n");
    DbgPrint("NtReadFile:%x\n" , GetNtReadFileAddr());

    //保留原始数据
    for(size_t i = 0; i < 10; i++) {
        buf[i] = *(unsigned char*) (GetNtReadFileAddr() + i);
    }

    Modify();

    return STATUS_SUCCESS;
}

Ring0(驱动)实现

#include "Tools.h"

UCHAR buf[10] = { 0 };

unsigned int GetNtReadFileAddr() {
    unsigned int* SericeTable;
    _asm {

        mov eax , fs:[0x124];
        mov eax , [eax + 0xe0];
        mov[SericeTable] , eax;
    }

    return *(unsigned int*) (*SericeTable + 0xb7 * 4);
}

NTSTATUS MyNtReadFile(
    HANDLE           FileHandle ,
    HANDLE           Event ,
    PIO_APC_ROUTINE  ApcRoutine ,
    PVOID            ApcContext ,
    PIO_STATUS_BLOCK IoStatusBlock ,
    PVOID            Buffer ,
    ULONG            Length ,
    PLARGE_INTEGER   ByteOffset ,
    PULONG           Key
) {
    if(-1 == (unsigned int) FileHandle) {
        if(NULL != Buffer) {
            LPSTR str = (LPSTR) Buffer;
            strcpy(str , "Hello World!\n");
        }
        DbgPrint("成功捕捉!\n");
    }

    p NtReadFile = (p) GetNtReadFileAddr();

    cancel();

    NTSTATUS ret = NtReadFile(FileHandle , Event , ApcRoutine , ApcContext , IoStatusBlock , Buffer , Length , ByteOffset , Key);

    Modify();

    return ret;
}

void Modify() {
    unsigned int NtReadFile = GetNtReadFileAddr();
    *(UCHAR*) NtReadFile = 0xe9;
    *(unsigned int*) (NtReadFile + 1) = (unsigned int) &MyNtReadFile - GetNtReadFileAddr() - 5;
}

void cancel() {
    for(size_t i = 0; i < 10; i++) {
        *(unsigned char*) (GetNtReadFileAddr() + i) = buf[i];
    }
}
效果图.png
驱动卸载测试.png
服务编号获取.png

免费评分

参与人数 9吾爱币 +13 热心值 +8 收起 理由
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Chaozzz + 1 我很赞同!
junjia215 + 1 + 1 我很赞同!
qaz003 + 1 + 1 谢谢分享。。超喜欢内核和驱动类内容
xhever + 1 + 1 谢谢@Thanks!
努力加载中 + 1 + 1 热心回复!
a3586597 + 1 我很赞同!
HOOK_XYS + 1 + 1 谢谢@Thanks!
5omggx + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| aswcy815174418 发表于 2021-9-22 16:52
Chaozzz 发表于 2021-9-22 16:31
大佬的工作很有意思啊,期待下一次更新,要是能给个项目让菜鸡(me)学学,更是极好的

这些都是从滴水上面学习来的
 楼主| aswcy815174418 发表于 2021-9-18 13:52
yunruifuzhu 发表于 2021-9-18 09:07
驱动编程,环境要怎么安装啊。。第一步就卡住了

sdk和wdk都得装,如果需要编程xp的驱动,vs版本得是不超过vs2017。
yunruifuzhu 发表于 2021-9-18 09:07
驱动编程,环境要怎么安装啊。。第一步就卡住了
75769837 发表于 2021-9-18 09:42
驱动编程 厉害啊老哥
godmessengers 发表于 2021-9-18 11:10
好用,强大,感谢楼主分享!
小木曾雪菜 发表于 2021-9-18 11:16
为什么还用xp?
 楼主| aswcy815174418 发表于 2021-9-18 13:54

还在学习阶段
wangtengshui 发表于 2021-9-18 14:33
好用,强大,感谢楼主分享!
寒雪冰熊 发表于 2021-9-18 17:05
思路还不错。不过XP有点过时了。楼主可以试试WIN7 x64的
 楼主| aswcy815174418 发表于 2021-9-18 17:28
寒雪冰熊 发表于 2021-9-18 17:05
思路还不错。不过XP有点过时了。楼主可以试试WIN7 x64的

还在学习阶段,等学完了,再去弄高版本系统
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 19:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表