首页
社区
课程
招聘
[求助]Inline hook 蓝屏求帮助
2012-6-5 15:32 3584

[求助]Inline hook 蓝屏求帮助

2012-6-5 15:32
3584
#include "ntddk.h"

//804ff720 b87a000000      mov     eax,7Ah   NtOpenProcess 的索引为7Ah
//804ff725 8d542404        lea     edx,[esp+4]

typedef struct _SystemServiceDescriptorTable
{
    PVOID     ServiceTableBase;
    PULONG     ServiceCounterTableBase;
    ULONG     NumberOfService;
    ULONG     ParamTableBase;
}SystemServiceDescriptorTable,*PSystemServiceDescriptorTable;

extern PSystemServiceDescriptorTable KeServiceDescriptorTable;

//定义NtOpenProcess原型
typedef NTSTATUS (__stdcall *NTOPENPROCESS)(OUT PHANDLE ProcessHandle,
                                                                                        IN ACCESS_MASK AccessMask,
                                                                                        IN POBJECT_ATTRIBUTES ObjectAttributes,
                                                                                        IN PCLIENT_ID ClientId);

NTOPENPROCESS RealNtOpenProcess;
//原函数地址
ULONG RealServiceAddress;
//要保护的进程id
HANDLE pid;

//函数声明
VOID hook();
VOID unhook();
VOID OnUnload(IN PDRIVER_OBJECT DriverObject);
NTSTATUS __stdcall MyNtOpenProcess(OUT PHANDLE ProcessHandle,
                                                                 IN ACCESS_MASK AccessMask,
                                                                 IN POBJECT_ATTRIBUTES ObjectAttributes,
                                                                 IN PCLIENT_ID ClientId);

#include "hook.h"
//EntryPoint
#ifdef __cplusplus
extern "C" {
#endif
NTSTATUS DriverEntry(
    IN OUT PDRIVER_OBJECT   DriverObject,
    IN PUNICODE_STRING      RegistryPath
    )
{
       
        //保护进程
        hook();
        DriverObject->DriverUnload = OnUnload;
        return STATUS_SUCCESS;  //函数一但离开Entry 就蓝屏了 WinDebug 上显示Access violation - code c0000005 (!!! second chance !!!)
00000000 ??  
}
#ifdef __cplusplus
}
#endif

//保护进程
VOID hook()
{
        ULONG address;
        address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x74 * 4;
        //保存原函数地址,供还原使用
        RealServiceAddress = *(ULONG *)address;

        //去除cr0保护
        __asm
        {
                cli
            mov eax,cr0
                and eax,not 10000h
                mov cr0,eax
        }
        //ssdt中7A位置的函数的地址为我们自己的函数,并过滤相关操作
        *((ULONG *)address) = (ULONG)MyNtOpenProcess;
        //cr0保护
        __asm
        {
                mov eax,cr0
                or eax,1000h
                mov cr0,eax
                sti
        }
        DbgPrint("yes,hook sucess!");
}

//取出保护
VOID unhook()
{
        ULONG address;
        address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;
       
        //去除cr0保护
        __asm
        {
                cli
            mov eax,cr0
                and eax,not 10000h
                mov cr0,eax
        }
        //用保存好的NtOpenProcess地址还原7A 位置的函数地址
        *((ULONG *)address) = (ULONG)RealServiceAddress;
        //cr0保护
        __asm
        {
                mov eax,cr0
                or eax,1000h
                mov cr0,eax
                sti
        }
        DbgPrint("yes,unhook sucess!");
}

//新的NtOpenProcess
NTSTATUS __stdcall MyNtOpenProcess(OUT PHANDLE ProcessHandle,
                                                                 IN ACCESS_MASK AccessMask,
                                                                 IN POBJECT_ATTRIBUTES ObjectAttributes,
                                                                 IN PCLIENT_ID ClientId)
{
        NTSTATUS status;
        ULONG notepadId;
        //首先调用原始函数获取信息做比对
        status = (NTSTATUS)(NTOPENPROCESS)RealNtOpenProcess(ProcessHandle,AccessMask,ObjectAttributes,ClientId);
        if(ClientId != NULL)
        {
                notepadId = (ULONG)ClientId->UniqueProcess;
                if(notepadId == 304)
                {
                        //1234 为要保护的进程的id 这里是记事本为例
                        ProcessHandle = NULL;
                        status = STATUS_ACCESS_DENIED;
                }
        }
        return status;
}

//卸载
VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
        unhook();
}

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (4)
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
RootSuLe 4 2012-6-5 16:15
2
0
很明显,RealNtOpenProcess地址是NULL
雪    币: 94
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
空白符 2012-6-5 17:00
3
0
谢谢楼上的,我也发现了,改掉了,可以了
雪    币: 15
活跃值: (512)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jfztaq 2012-6-5 18:04
4
0
我也遇到了和楼主同样的问题,楼主学的是郁金香的吗?
楼主能发一下正确的吗?
雪    币: 94
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
空白符 2012-6-6 11:33
5
0
我马上发一个给植物大战僵尸写个外挂,然后打开保护,让外挂失效的,在还原的文章,你等等,快完成了
游客
登录 | 注册 方可回帖
返回