首页
社区
课程
招聘
[求助]求助如何实现 64位下某个功能。
发表于: 2016-7-26 20:31 4512

[求助]求助如何实现 64位下某个功能。

2016-7-26 20:31
4512
求助一个驱动程序:WIN64位下 过掉某软件通过调用SetInformationThread实现阻断调试器和该软件的通信,说简单点就是 ······64位下 hook 一个内核函数,使得setinformationthread这个函数 无法执行 class为17的 那个功能

我自己写了个驱动,是让所有的class都为0。。。。调试器输出的信息是显示成功的,但是并没有效果···  我自己写的是32位 XP

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 19
活跃值: (1111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没代码没真相啊
2016-7-26 21:09
0
雪    币: 12
活跃值: (182)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好吧 我贴上我的代码
///////////////////////////////////////////////////////////////////////////////
///
/// Copyright (c) 2010 - <company name here>
///
/// Original filename: Fuck_ThreadHideFromDebugger.cpp
/// Project          : Fuck_ThreadHideFromDebugger
/// Date of creation : 2010-12-28
/// Author(s)        : <author name(s)>
///
/// Purpose          : <description>
///
/// Revisions:
///  0000 [2010-12-28] Initial revision.
///
///////////////////////////////////////////////////////////////////////////////

// $Id$

#ifdef __cplusplus
extern "C" {
#endif
#include <ntddk.h>
#include <string.h>
#ifdef __cplusplus
}; // extern "C"
#endif

#include "Fuck_ThreadHideFromDebugger.h"

#ifdef __cplusplus
namespace { // anonymous namespace to limit the scope of this global variable!
#endif
PDRIVER_OBJECT pdoGlobalDrvObj = 0;
#ifdef __cplusplus
}; // anonymous namespace
#endif

#pragma pack(1)
typedef struct ServiceDescriptorEntry
{
        unsigned int *ServiceTableBase;
        unsigned int *ServiceCounterTableBase; //Used only in checked build
        unsigned int NumberOfServices;
        unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;

#pragma pack()
extern "C"
__declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;

#define SYSTEMSERVICE(_function)  KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]

PMDL  g_pmdlSystemCall;
PVOID *MappedSystemCallTable;

#define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)

#define HOOK_SYSCALL(_Function, _Hook)  \
        (PVOID) InterlockedExchange( (PLONG) &MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG) _Hook)

#define UNHOOK_SYSCALL(_Function, _Hook)  \
        InterlockedExchange( (PLONG) &MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG) _Hook)

NTSYSAPI
NTSTATUS
NTAPI  ZwSetInformationThread(
                                                          IN HANDLE  ThreadHandle,
                                                          IN THREADINFOCLASS  ThreadInformationClass,
                                                          IN PVOID  ThreadInformation,
                                                          IN ULONG  ThreadInformationLength
                                                          );

typedef NTSTATUS (*ZWSETINFORMATIONTHREAD)(
        IN HANDLE  ThreadHandle,
        IN THREADINFOCLASS  ThreadInformationClass,
        IN PVOID  ThreadInformation,
        IN ULONG  ThreadInformationLength
        );

ZWSETINFORMATIONTHREAD        OldZwSetInformationThread;

NTSTATUS NewZwSetInformationThread(
                                                                   IN HANDLE  ThreadHandle,
                                                                   IN THREADINFOCLASS  ThreadInformationClass,
                                                                   IN PVOID  ThreadInformation,
                                                                   IN ULONG  ThreadInformationLength)
{
        NTSTATUS ntStatus;

        if(ThreadInformationClass == 17) //ANTI-DEBUG
        {
                DbgPrint("HaHa XXX HideThreadFromDebugger!!!!!");
                ntStatus =  STATUS_SUCCESS;
        }
        else
                ntStatus = ((ZWSETINFORMATIONTHREAD)(OldZwSetInformationThread))(
                ThreadHandle,
                ThreadInformationClass,
                ThreadInformation,
                ThreadInformationLength);
        return ntStatus;
}

NTSTATUS FUCKTHREADHIDEFROMDEBUGGER_DispatchCreateClose(
    IN PDEVICE_OBJECT                DeviceObject,
    IN PIRP                                        Irp
    )
{
    NTSTATUS status = STATUS_SUCCESS;
    Irp->IoStatus.Status = status;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return status;
}

NTSTATUS FUCKTHREADHIDEFROMDEBUGGER_DispatchDeviceControl(
    IN PDEVICE_OBJECT                DeviceObject,
    IN PIRP                                        Irp
    )
{
    NTSTATUS status = STATUS_SUCCESS;
    PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);

    switch(irpSp->Parameters.DeviceIoControl.IoControlCode)
    {
    case IOCTL_FUCKTHREADHIDEFROMDEBUGGER_OPERATION:
        // status = SomeHandlerFunction(irpSp);
        break;
    default:
        Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
        Irp->IoStatus.Information = 0;
        break;
    }

    status = Irp->IoStatus.Status;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return status;
}

VOID FUCKTHREADHIDEFROMDEBUGGER_DriverUnload(
    IN PDRIVER_OBJECT                DriverObject
    )
{
        DbgPrint("ROOTKIT: OnUnload called\n");

        // unhook system calls
        UNHOOK_SYSCALL( ZwSetInformationThread, OldZwSetInformationThread);

        // Unlock and Free MDL
        if(g_pmdlSystemCall)
        {
                MmUnmapLockedPages(MappedSystemCallTable, g_pmdlSystemCall);
                IoFreeMdl(g_pmdlSystemCall);
        }

    PDEVICE_OBJECT pdoNextDeviceObj = pdoGlobalDrvObj->DeviceObject;
    IoDeleteSymbolicLink(&usSymlinkName);

    // Delete all the device objects
    while(pdoNextDeviceObj)
    {
        PDEVICE_OBJECT pdoThisDeviceObj = pdoNextDeviceObj;
        pdoNextDeviceObj = pdoThisDeviceObj->NextDevice;
        IoDeleteDevice(pdoThisDeviceObj);
    }
}

#ifdef __cplusplus
extern "C" {
#endif
NTSTATUS DriverEntry(
    IN OUT PDRIVER_OBJECT   DriverObject,
    IN PUNICODE_STRING      RegistryPath
    )
{
    PDEVICE_OBJECT pdoDeviceObj = 0;
    NTSTATUS status = STATUS_UNSUCCESSFUL;
    pdoGlobalDrvObj = DriverObject;

    // Create the device object.
    if(!NT_SUCCESS(status = IoCreateDevice(
        DriverObject,
        0,
        &usDeviceName,
        FILE_DEVICE_UNKNOWN,
        FILE_DEVICE_SECURE_OPEN,
        FALSE,
        &pdoDeviceObj
        )))
    {
        // Bail out (implicitly forces the driver to unload).
        return status;
    };

    // Now create the respective symbolic link object
    if(!NT_SUCCESS(status = IoCreateSymbolicLink(
        &usSymlinkName,
        &usDeviceName
        )))
    {
        IoDeleteDevice(pdoDeviceObj);
        return status;
    }

    // NOTE: You need not provide your own implementation for any major function that
    //       you do not want to handle. I have seen code using DDKWizard that left the
    //       *empty* dispatch routines intact. This is not necessary at all!
    DriverObject->MajorFunction[IRP_MJ_CREATE] =
    DriverObject->MajorFunction[IRP_MJ_CLOSE] = FUCKTHREADHIDEFROMDEBUGGER_DispatchCreateClose;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FUCKTHREADHIDEFROMDEBUGGER_DispatchDeviceControl;
    DriverObject->DriverUnload = FUCKTHREADHIDEFROMDEBUGGER_DriverUnload;

        // save old system call locations
        OldZwSetInformationThread =(ZWSETINFORMATIONTHREAD)(SYSTEMSERVICE(ZwSetInformationThread));

        // Map the memory into our domain so we can change the permissions on the MDL
        g_pmdlSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices*4);
        if(!g_pmdlSystemCall)
                return STATUS_UNSUCCESSFUL;

        MmBuildMdlForNonPagedPool(g_pmdlSystemCall);

        // Change the flags of the MDL
        g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;

        MappedSystemCallTable = (PVOID*)MmMapLockedPages(g_pmdlSystemCall, KernelMode);

        // hook system calls
        HOOK_SYSCALL( ZwSetInformationThread, NewZwSetInformationThread);

    return STATUS_SUCCESS;
}
#ifdef __cplusplus
}; // extern "C"
#endif
2016-7-26 21:22
0
雪    币: 12
活跃值: (182)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
贴上代码了···麻烦帮忙看看 谢谢了
2016-7-26 21:25
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
明显不支持 x64 内核吧

你看看是不是HOOK成功没
2016-7-26 21:38
0
雪    币: 12
活跃值: (182)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这是我写的32位驱动 我在XP下测试  用PChunter能看到钩子··
2016-7-26 21:51
0
雪    币: 33
活跃值: (653)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
想玩驱动 最起码的windbg你得会用吧
2016-7-26 22:24
0
游客
登录 | 注册 方可回帖
返回