首页
社区
课程
招聘
[旧帖] 求助 关于 ssdt hook NtWriteVirtualMemory NtReadVirtualMemory NtOpenProcess 0.00雪花
发表于: 2010-11-30 18:56 12833

[旧帖] 求助 关于 ssdt hook NtWriteVirtualMemory NtReadVirtualMemory NtOpenProcess 0.00雪花

2010-11-30 18:56
12833
最简单的  要保护 demo.exe不被读写。
ssdt hook NtWriteVirtualMemory NtReadVirtualMemory NtOpenProcess
来防止demo.exe不被读写 。下面这个代码是我测试过hook ZwTerminateProcess  来防止demo.exe被第三方软件结束。

/*
	Project Name:	Processes Guard
	Description:	Protection user	specified process(es)
	Date:			2010-5-5
	Version:		1.0
	Author:			Kernone
	Blog:			http://hi.baidu.com/kernone
	File Name:		ProcGuard.c
	Copyright(c)	Kernone Soft 2010
*/
#include <ntddk.h>

#pragma pack(1)
typedef struct _SYSTEM_SERVICES_DESCRIPTOR_TABLE
{
	PULONG			*ServiceTableBase;
	PULONG			*ServiceCounterTableBase;	//Used in check builds only
	unsigned int	NumberOfServices;
	PULONG			*ParamTableBase;
}SSDT, *PSSDT;
#pragma pack()

typedef struct _DEVICE_EXTENSION
{
	PDEVICE_OBJECT	pDevObj;
	UNICODE_STRING	uniSymLink;
	PMDL			pMdl;
	PULONG			pulSSDTMapped;
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;

typedef NTSTATUS (*ZWTERMINATEPROCESS)(
    IN HANDLE  ProcessHandle,
    IN NTSTATUS  ExitStatus
    );
	
/*Getting system service function address, the index of function locates 1 bytes offset*/
#define	SYSTEM_SERVICE(_Func)	KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)_Func + 1)]
#define	SYSTEM_INDEX(_Func)		(*(PULONG)((PUCHAR)_Func + 1))
#define	IOCTL_START_PROTECTION	CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define	C_MAXPROCNUMS			12

//Global variable
__declspec(dllimport) SSDT	KeServiceDescriptorTable;
ZWTERMINATEPROCESS	ZwTerminateProcessReal;
ULONG	ulPIDs[C_MAXPROCNUMS];

DRIVER_UNLOAD	DriverUnload;
DRIVER_DISPATCH	DispatchDevOpen, DispatchDevCtl;
NTSTATUS ZwTerminateProcessHook(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus);


NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryPath)
{
	PDEVICE_OBJECT		pDevObj;
	PDEVICE_EXTENSION	pDevExt;
	UNICODE_STRING		uniSymLink, uniDevName;
	NTSTATUS			ntStatus;
	PMDL				pMdl;
	PULONG				pulSSDTMapped;
	
	RtlInitUnicodeString(&uniSymLink, L"\\DosDevices\\ProcessesGuard_KernoneSoft");
	RtlInitUnicodeString(&uniDevName, L"\\Device\\ProcessesGuard");
	pDriverObj->DriverUnload = DriverUnload;
	pDriverObj->MajorFunction[IRP_MJ_CREATE] = 
	pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchDevOpen;
	pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDevCtl;
	
	ntStatus = IoCreateDevice(pDriverObj, sizeof (DEVICE_EXTENSION), &uniDevName, FILE_DEVICE_UNKNOWN, 
		0, FALSE, &pDevObj);
	if (!NT_SUCCESS(ntStatus))
		return(ntStatus);
		
	IoCreateSymbolicLink(&uniSymLink, &uniDevName);
	pDevObj->Flags |= DO_BUFFERED_IO;
	pDevExt = pDevObj->DeviceExtension;
	pDevExt->pDevObj = pDevObj;
	pDevExt->uniSymLink = uniSymLink;
	
	pMdl = IoAllocateMdl(KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices * 4,
		FALSE, FALSE, NULL);
	if (pMdl == NULL)
	{
		IoDeleteSymbolicLink(&uniSymLink);
		IoDeleteDevice(pDevObj);
		return(STATUS_INSUFFICIENT_RESOURCES);
	}
	
	MmBuildMdlForNonPagedPool(pMdl);
	pMdl->MdlFlags |= MDL_MAPPED_TO_SYSTEM_VA;	//Write SSDT
	
	pulSSDTMapped = (PULONG)MmMapLockedPagesSpecifyCache(pMdl, KernelMode, MmNonCached, NULL, FALSE, NormalPagePriority);
	if (pulSSDTMapped == NULL)
	{
		IoDeleteSymbolicLink(&uniSymLink);
		IoDeleteDevice(pDevObj);
		IoFreeMdl(pMdl);
		return(STATUS_UNSUCCESSFUL);
	}
	
	pDevExt->pMdl = pMdl;
	pDevExt->pulSSDTMapped = pulSSDTMapped;
	
	ZwTerminateProcessReal = (ZWTERMINATEPROCESS)SYSTEM_SERVICE(ZwTerminateProcess);
	pulSSDTMapped[SYSTEM_INDEX(ZwTerminateProcess)] = (PULONG)ZwTerminateProcessHook;
	
	return(ntStatus);
}

VOID DriverUnload(PDRIVER_OBJECT pDriverObj)
{
	PDEVICE_OBJECT		pDevObj = pDriverObj->DeviceObject;
	PDEVICE_EXTENSION	pDevExt = pDevObj->DeviceExtension;
	PULONG				pulSSDTMapped = pDevExt->pulSSDTMapped;
	PMDL				pMdl = pDevExt->pMdl;
	
	pulSSDTMapped[SYSTEM_INDEX(ZwTerminateProcess)] = (PULONG)ZwTerminateProcessReal;
	MmUnmapLockedPages(pulSSDTMapped, pMdl);
	IoFreeMdl(pMdl);
	while (pDevObj)
	{
		pDevExt = pDevObj->DeviceExtension;
		pDevObj = pDevObj->NextDevice;
		
		IoDeleteSymbolicLink(&pDevExt->uniSymLink);
		IoDeleteDevice(pDevExt->pDevObj);
	}
}

NTSTATUS DispatchDevOpen(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
	NTSTATUS	ntStatus = STATUS_SUCCESS;
	
	pIrp->IoStatus.Status = ntStatus;
	pIrp->IoStatus.Information = 0;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	return(ntStatus);
}

NTSTATUS DispatchDevCtl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
	PIO_STACK_LOCATION	pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
	ULONG				ulIoCode, ulBufLength, ulRtn, ulCounts = 0, ulIndex;
	PVOID				pvBuf;
	NTSTATUS			ntStatus;
	
	ulIoCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
	switch (ulIoCode)
	{
	case IOCTL_START_PROTECTION:
		ulBufLength = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
		pvBuf = pIrp->AssociatedIrp.SystemBuffer;
		ulCounts = ulBufLength / sizeof (ULONG);
		KdPrint(("Protection Numbers: %d\n"), ulCounts);
		for (ulIndex = 0; ulIndex < ulCounts && ulIndex < C_MAXPROCNUMS; ulIndex++)
		{
			ulPIDs[ulIndex] = ((PULONG)pvBuf)[ulIndex];
			KdPrint(("Index %d -- PID %d\n"), ulIndex, ulPIDs[ulIndex]);
		}
		ntStatus = STATUS_SUCCESS;
		ulRtn = ulBufLength;
		break;
	default:
		ntStatus = STATUS_INVALID_PARAMETER;
		ulRtn = 0;
		break;
	}
	
	pIrp->IoStatus.Status = ntStatus;
	pIrp->IoStatus.Information = ulRtn;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	return(ntStatus);
}


CHAR *TerminateName = "demo.exe";      //这里就是我们的进程名   
UCHAR *PsGetProcessImageFileName( IN PEPROCESS Process );   
  
BOOLEAN IsProtect(CHAR *temp)            //判断正在结束的进程是否是我们要保护的进程   
{   
    ULONG len = strcmp(TerminateName, temp);   
    if(!len)   
        return TRUE;   
    return FALSE;   
} 
NTSTATUS ZwTerminateProcessHook(IN HANDLE ProcessHandle, IN NTSTATUS ExitStatus)//我们自己的NtTerminateProcess   
{   
    PEPROCESS process;  //接受通过ProcessHandle返回的进程   
    NTSTATUS status;    
    CHAR *pName;        //接受进程的进程名   
       
    status = ObReferenceObjectByHandle(ProcessHandle,   
        FILE_READ_DATA,0,KernelMode,&process,NULL);    //获取进程   
       
    if(!NT_SUCCESS(status))    
        return(ZwTerminateProcessReal(ProcessHandle, ExitStatus));   
       
    pName = (CHAR*)PsGetProcessImageFileName(process); //获取进程名   
    if(IsProtect(pName)) //判断是否是我们要保护的进程,是则返回权限不足,否则调用原函数结束进程   
    {   
        if(process != PsGetCurrentProcess())   
        {   
            return STATUS_ACCESS_DENIED;   
        }   
    }   
       
    return(ZwTerminateProcessReal(ProcessHandle, ExitStatus));    
} 


会驱动的帮忙看下 好么?

http://bbs.pediy.com/showthread.php?t=125616&highlight=%E5%86%85%E5%AD%98
这个是用硬件编码实现的--------诶也不知道怎么修改
如何实现 代码的机器兼容啊

悬赏30kb哦

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
2
现在我已经搞定了 这个驱动
要怎么写r0和r3下的进程通讯啊
delphi7的 ring0和ring3 下的 进程通讯

#include <ntddk.h>
#include "struct.h"

//int pos_CreateFile;     /* 保存这些函数的服务号 */
int pos_ReadVirtualMemory;
int pos_NtOpenProcess;
int pos_NtWriteVirtualMemory;

UNICODE_STRING uProcessName;
UNICODE_STRING MyuProcessName;
ANSI_STRING aProcessName;

//特殊的值,目标进程的ID
DWORD	dwTargetProcessID;

#define MY_CONTROL_CODE   0x4021
#define IOCTL_SET_TARGET_PROCESS_ID   (ULONG)CTL_CODE( FILE_DEVICE_UNKNOWN, MY_CONTROL_CODE, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA )

//一些常量定义
#define EPROCESS_SIZE           1  
#define PEB_OFFSET              2  
#define FILE_NAME_OFFSET        3  
#define PROCESS_LINK_OFFSET     4  
#define PROCESS_ID_OFFSET       5  
#define EXIT_TIME_OFFSET        6  
 
DWORD GetPlantformDependentInfo ( DWORD dwFlag )   
{    
	DWORD current_build;    
	DWORD ans = 0;
	
	PsGetVersion(NULL, NULL,¤t_build, NULL);    
	switch ( dwFlag )   
	{    
	case EPROCESS_SIZE:    
		if (current_build == 2195) ans = 0 ;        // 2000,当前不支持2000,下同   
		if (current_build == 2600) ans = 0x25C;     // xp   
		if (current_build == 3790) ans = 0x270;     // 2003   
		break;    
	case PEB_OFFSET:    
		if (current_build == 2195)  ans = 0;    
		if (current_build == 2600)  ans = 0x1b0;    
		if (current_build == 3790)  ans = 0x1a0;   
		break;    
	case FILE_NAME_OFFSET:    
		if (current_build == 2195)  ans = 0;    
		if (current_build == 2600)  ans = 0x174;    
		if (current_build == 3790)  ans = 0x164;   
		break;    
	case PROCESS_LINK_OFFSET:    
		if (current_build == 2195)  ans = 0;    
		if (current_build == 2600)  ans = 0x088;    
		if (current_build == 3790)  ans = 0x098;   
		break;    
	case PROCESS_ID_OFFSET:    
		if (current_build == 2195)  ans = 0;    
		if (current_build == 2600)  ans = 0x084;    
		if (current_build == 3790)  ans = 0x094;   
		break;    
	case EXIT_TIME_OFFSET:    
		if (current_build == 2195)  ans = 0;    
		if (current_build == 2600)  ans = 0x078;    
		if (current_build == 3790)  ans = 0x088;   
		break;    
	}    
	return ans;    
}  


NTSTATUS NewNtOpenProcess(PHANDLE  ProcessHandle,
						  ACCESS_MASK  DesiredAccess,
						  POBJECT_ATTRIBUTES  ObjectAttributes,
						  PCLIENT_ID  ClientId)
{
	NTSTATUS ntStatus;
	DWORD dwProcessId = NULL;
    ntStatus = ((ZWCREATEFILE)(OldNtOpenProcess))(
		ProcessHandle,
		DesiredAccess,
		ObjectAttributes,
		ClientId);
	if((ClientId != NULL))
	{
		dwProcessId = (HANDLE)ClientId->UniqueProcess;
		if (dwProcessId == dwTargetProcessID)
		{
			ntStatus = STATUS_ACCESS_DENIED;
		}

	}
	return ntStatus;
}

NTSTATUS
NewNtWriteVirtualMemory(IN HANDLE ProcessHandle,
								 IN PVOID BaseAddress,
								 IN PVOID Buffer,
								 IN ULONG BufferLength,
								 OUT PULONG ReturnLength OPTIONAL)
{
	NTSTATUS ntStatus;
	NTSTATUS	ret;
	PVOID		pEprocess;
	DWORD		dwProcessId;

	ntStatus = ((NTWRITEVIRTUALMEMORY)(OldNtWriteVitualMemory)) (
		ProcessHandle,
		BaseAddress,
		Buffer,
		BufferLength,
        ReturnLength);

	pEprocess = NULL;
	dwProcessId = GetPlantformDependentInfo(PROCESS_ID_OFFSET); 
	ret = ObReferenceObjectByHandle(ProcessHandle , 0, NULL, KernelMode, &pEprocess, NULL);
	if(STATUS_SUCCESS == ret)
	{
		dwProcessId = *(DWORD*)((BYTE*)pEprocess+dwProcessId); //被扫描进程的PID
		if (dwProcessId == dwTargetProcessID)
		{
			if(dwTargetProcessID == (DWORD)PsGetCurrentProcessId()) 
			{
				goto Next;
			}
			return STATUS_ACCESS_DENIED;
		}
	}

Next:
	return ntStatus;
}

NTSTATUS
NewNtReadVirtualMemory(
					  IN HANDLE ProcessHandle,
					  IN PVOID BaseAddress,
					  OUT PVOID Buffer,
					  IN ULONG BufferLength,
					  OUT PULONG ReturnLength OPTIONAL
					  )
{
	NTSTATUS	ret;
	PVOID		pEprocess;   //通过进程句柄得到ID
	PVOID		pExplorer_Eprocess;  //过滤掉桌面进程explorer时用到的一个EPROCESS类型临时变量
	DWORD		dwCurrentPID;  //当前ProcessHandle句柄对应的进程号

	DWORD dwProcessId;
	DWORD dwFileName;
	
	pEprocess = NULL;

	dwProcessId = GetPlantformDependentInfo(PROCESS_ID_OFFSET);    
    dwFileName  = GetPlantformDependentInfo(FILE_NAME_OFFSET);

	ret = ObReferenceObjectByHandle(ProcessHandle , 0, NULL, KernelMode, &pEprocess, NULL);
	if(STATUS_SUCCESS == ret)
	{
		//DbgPrint("the caller ProcessName is %s\n",(PUCHAR)((BYTE*)pEprocess + dwFileName));
		dwCurrentPID = *(DWORD*)((BYTE*)pEprocess+dwProcessId);         //得到被扫描的进程的PID

		if(dwCurrentPID == dwTargetProcessID)   //dwTargetProcessID                 //如果被扫描的进程PID跟预定的一样,那么就开始bypass
		{	
			DbgPrint("call NtReadVirtualMemory!Target Process is %d.  The Caller is %d\n",dwTargetProcessID, PsGetCurrentProcessId());

			if(dwTargetProcessID == (DWORD)PsGetCurrentProcessId())  //排除自己调用NtReadVirtualMemory来读取自己内存的情况
			{
				DbgPrint("call NtReadVirtualMemory by myself\n");
				goto Next;
			}
				pExplorer_Eprocess = PsGetCurrentProcess();	//得到当前进程eprocess结构

				RtlInitUnicodeString(&uProcessName,L"explorer.exe");
				RtlInitAnsiString(&aProcessName,(PUCHAR)((BYTE*)pExplorer_Eprocess + dwFileName));
				RtlAnsiStringToUnicodeString(&MyuProcessName,&aProcessName,TRUE);
				DbgPrint("call NtReadVirtualMemory by %wZ ---%wZ\n",&MyuProcessName,&uProcessName);

				if(RtlCompareUnicodeString(&uProcessName,&MyuProcessName, TRUE) == 0)  //不区分大小写的对比!
				{
					DbgPrint("call NtReadVirtualMemory by explorer process\n"); //排除explorer调用NtReadVirtualMemory来读取自己内存的情况
					goto Next;
				}
				DbgPrint("call NtReadVirtualMemory by other process %d\n",PsGetCurrentProcessId());
				//排除了自己对自己的内存操作,桌面进程对所关心的进程的操作之外,其他的一切进程对多关心的进程进行操作,一律pass
				ret = ((NTREADVIRTUALMEMORY)(OldNtReadVirtualMemory))(
					ProcessHandle,
					BaseAddress,
					L"Is By PopSky",      //自定义的垃圾数据
					BufferLength,
					ReturnLength
					);
				return ret;
		}
	}
Next:
	ret = ((NTREADVIRTUALMEMORY)(OldNtReadVirtualMemory))(
		ProcessHandle,
		BaseAddress,
		Buffer,
		BufferLength,
		ReturnLength
		);
	return ret;
}
/////////////////////////////////////////////////////////////////         --          --     
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//     --     -      -     -- 
//+                                                           +//     --      -   -       -- 
//+          下面2个函数用于得到部分SDT函数的地址             +//      --       -        --  
//+                                                           +//       -     sudami     -   
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//        --            --    
/////////////////////////////////////////////////////////////////          --        --  
//                                                                           --    --
//		                                                                        --
DWORD GetDllFunctionAddress (
					   char* lpFunctionName, 
					   PUNICODE_STRING pDllName
					   )
{
	HANDLE hThread, hSection, hFile, hMod;
	SECTION_IMAGE_INFORMATION sii;
	IMAGE_DOS_HEADER* dosheader;
	IMAGE_OPTIONAL_HEADER* opthdr;
	IMAGE_EXPORT_DIRECTORY* pExportTable;
	DWORD* arrayOfFunctionAddresses;
	DWORD* arrayOfFunctionNames;
	WORD* arrayOfFunctionOrdinals;
	DWORD functionOrdinal;
	DWORD Base, x, functionAddress;
	char* functionName;
	STRING ntFunctionName, ntFunctionNameSearch;
	PVOID BaseAddress = NULL;
	SIZE_T size=0;

	OBJECT_ATTRIBUTES oa = {sizeof oa, 0, pDllName, OBJ_CASE_INSENSITIVE};

	IO_STATUS_BLOCK iosb;

	//_asm int 3;
	ZwOpenFile(&hFile, FILE_EXECUTE | SYNCHRONIZE, &oa, &iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT);

	oa.ObjectName = 0;

	ZwCreateSection(&hSection, SECTION_ALL_ACCESS, &oa, 0,PAGE_EXECUTE, SEC_IMAGE, hFile);

	ZwMapViewOfSection(hSection, NtCurrentProcess(), &BaseAddress, 0, 1000, 0, &size, (SECTION_INHERIT)1, MEM_TOP_DOWN, PAGE_READWRITE);

	ZwClose(hFile);

	hMod = BaseAddress;

	dosheader = (IMAGE_DOS_HEADER *)hMod;

	opthdr =(IMAGE_OPTIONAL_HEADER *) ((BYTE*)hMod+dosheader->e_lfanew+24);

	pExportTable =(IMAGE_EXPORT_DIRECTORY*)((BYTE*) hMod + opthdr->DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT]. VirtualAddress);

	arrayOfFunctionAddresses = (DWORD*)( (BYTE*)hMod + pExportTable->AddressOfFunctions);

	arrayOfFunctionNames = (DWORD*)( (BYTE*)hMod + pExportTable->AddressOfNames);

	arrayOfFunctionOrdinals = (WORD*)( (BYTE*)hMod + pExportTable->AddressOfNameOrdinals);

	Base = pExportTable->Base;

	RtlInitString(&ntFunctionNameSearch, lpFunctionName);

	for(x = 0; x < pExportTable->NumberOfFunctions; x++) {
		functionName = (char*)( (BYTE*)hMod + arrayOfFunctionNames[x]);

		RtlInitString(&ntFunctionName, functionName);

		functionOrdinal = arrayOfFunctionOrdinals[x] + Base - 1; 
		functionAddress = (DWORD)( (BYTE*)hMod + arrayOfFunctionAddresses[functionOrdinal]);
		if (RtlCompareString(&ntFunctionName, &ntFunctionNameSearch, TRUE) == 0) {
			ZwClose(hSection);
			return functionAddress;
		}
	}

	ZwClose(hSection);
	return 0;
}

VOID IoTimeRoutine(
				   IN PDEVICE_OBJECT DeviceObject,
				   IN PVOID Context )
{
	int cnt = 0;
	DbgPrint("IoTimerRoutine() is Called!\n");
}


NTSTATUS
DispatchCreate(
	IN PDEVICE_OBJECT		DeviceObject,
	IN PIRP					Irp
	)
{
	NTSTATUS status = STATUS_SUCCESS;

    Irp->IoStatus.Information = 0;

	//dprintf("[KsBinSword] IRP_MJ_CREATE\n");

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

    return status;
}

NTSTATUS
DispatchClose(
	IN PDEVICE_OBJECT		DeviceObject,
	IN PIRP					Irp
	)
{
	NTSTATUS status = STATUS_SUCCESS;
    //DbgBreakPoint();
    Irp->IoStatus.Information = 0;

	//dprintf("[KsBinSword] IRP_MJ_CLOSE\n");

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

    return status;
}

NTSTATUS
DispatchDeviceControl(
	IN PDEVICE_OBJECT		DeviceObject,
	IN PIRP					Irp
	)
{
	NTSTATUS                    status = STATUS_SUCCESS;
	ULONG						controlCode;
	PIO_STACK_LOCATION			irpStack;
	HANDLE						hEvent;
	OBJECT_HANDLE_INFORMATION	objHandleInfo;
	ULONG                       outputLength, inputLength;
	PVOID                       inputBuffer;
	
	irpStack = IoGetCurrentIrpStackLocation(Irp);
	outputLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
	inputLength=irpStack->Parameters.DeviceIoControl.InputBufferLength;
	controlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
	switch(controlCode)
	{
	case IO_PROTECT:
		dwTargetProcessID = (HANDLE)irpStack->Parameters.DeviceIoControl.Type3InputBuffer;
		break;
	default:
		break;
	}
	
	Irp->IoStatus.Status = STATUS_SUCCESS;
	Irp->IoStatus.Information = 0;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);
	
	return status;
}
// 驱动入口
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath )
{
	NTSTATUS ntStatus = STATUS_SUCCESS;
    PDEVICE_OBJECT Device;
    UNICODE_STRING DeviceName, DeviceLink;  //设备名,符号链接名

    DbgPrint("[MyDriver] DriverEntry\n");

    RtlInitUnicodeString(&DeviceName, L"\\Device\\MyDriver");         //初始化设备名
    RtlInitUnicodeString(&DeviceLink, L"\\DosDevices\\MyDriver");  //初始化符号链接名

    /* IoCreateDevice 生成设备对象 */
    ntStatus = IoCreateDevice(DriverObject,         //生成设备的驱动对象
                              0,                    //设备扩展区内存大小
                              &DeviceName,          //设备名,\Device\MyDriver
                              FILE_DEVICE_UNKNOWN,  //设备类型
                              0,                    //填写0即可
                              FALSE,                //必须为FALSE
                              &Device);             //设备对象指针返回到DeviceObject中
    if (!NT_SUCCESS(ntStatus))
    {
        DbgPrint("[MyDriver] IoCreateDevice FALSE: %.8X\n", ntStatus);
        return ntStatus;  //生成失败就返回
    }
    else
        DbgPrint("[MyDriver] IoCreateDevice SUCCESS\n");

    /* IoCreateSymbolicLink 生成符号链接 */
    ntStatus = IoCreateSymbolicLink(&DeviceLink, &DeviceName);
    if (!NT_SUCCESS(ntStatus))
    {
        DbgPrint("[MyDriver] IoCreateSymbolicLink FALSE: %.8X\n", ntStatus);
        IoDeleteDevice(Device);  //删除设备
        return ntStatus;
    }
    else
        DbgPrint("[MyDriver] IoCreateSymbolicLink SUCCESS\n");

    Device->Flags &= ~DO_DEVICE_INITIALIZING;  //设备初始化完成标记

    DriverObject->MajorFunction[IRP_MJ_CREATE]         = DispatchCreate;
    DriverObject->MajorFunction[IRP_MJ_CLOSE]          = DispatchClose;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;
    DriverObject->DriverUnload                         = OnUnload;

	Hook();    //SSDT hook
    return ntStatus;
}
// 驱动卸载
VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
	UNICODE_STRING dosDeviceName;

	Unhook();

    RtlInitUnicodeString(&dosDeviceName, L"\\DosDevices\\MyDriver");

    IoDeleteSymbolicLink(&dosDeviceName);

	if (DriverObject->DeviceObject != NULL)
    {
        IoDeleteDevice(DriverObject->DeviceObject);  //删除设备
    }
}

//   此处修改SSDT中的NtCreateFile服务地址
VOID Hook()
{
	UNICODE_STRING dllName;
	DWORD          functionAddress;
	DWORD		   NtOpenProcessAddress;
	DWORD		   NtWriteVirtualMemoryAddress;
	int            position;
	int			   NtOpenProcessposition;
	int			   NtWriteVirtualMemoryposinion;
	PDEVICE_OBJECT pDeviceObject = NULL;

	RtlInitUnicodeString( &dllName, L"\\Device\\HarddiskVolume1\\Windows\\System32\\ntdll.dll" );

	//获取NtReadVirtualMemory的服务号完毕!
	functionAddress					 = GetDllFunctionAddress("NtReadVirtualMemory", &dllName);
	NtOpenProcessAddress			 = GetDllFunctionAddress("NtOpenProcess", &dllName);
	NtWriteVirtualMemoryAddress		 = GetDllFunctionAddress("NtWriteVirtualMemory", &dllName);
	position						 = *((WORD*)( functionAddress + 1 ));
	NtOpenProcessposition			 = *((WORD*)( NtOpenProcessAddress + 1 ));
	NtWriteVirtualMemoryposinion	 = *((WORD*)( NtWriteVirtualMemoryAddress + 1 ));
	pos_ReadVirtualMemory			 = position;
	pos_NtOpenProcess				 = NtOpenProcessposition;
	pos_NtWriteVirtualMemory		 = NtWriteVirtualMemoryposinion;
	//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

	OldNtReadVirtualMemory = (NTREADVIRTUALMEMORY) (*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + pos_ReadVirtualMemory));  //得到NtReadVirtualMemory函数的原始地址
	OldNtOpenProcess	   = (ZWCREATEFILE) (*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + pos_NtOpenProcess));
	OldNtWriteVitualMemory = (NTWRITEVIRTUALMEMORY) (*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + pos_NtWriteVirtualMemory));
	DbgPrint( "Address of Real OldNtReadVirtualMemory: 0x%08X\n", OldNtReadVirtualMemory );
	// 去掉内存保护
	__asm
	{
		cli
			mov     eax, cr0
			and     eax, not 10000h
			mov     cr0, eax
	}

	(NTREADVIRTUALMEMORY) (*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + pos_ReadVirtualMemory)) = NewNtReadVirtualMemory;
	(ZWCREATEFILE) (*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + pos_NtOpenProcess)) = NewNtOpenProcess;//SSDT HOOK NtReadVirtualMemory
	(NTWRITEVIRTUALMEMORY) (*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + pos_NtWriteVirtualMemory)) = NewNtWriteVirtualMemory;
	DbgPrint(" Address of NewNtReadVirtualMemory: 0x%08X\n", NewNtReadVirtualMemory );

	// 恢复内存保护
	__asm
	{
		mov     eax, cr0
			or     eax, 10000h
			mov     cr0, eax
			sti
	}
}

//////////////////////////////////////////////////////
VOID Unhook()
{
	__asm
	{
		cli
			mov     eax, cr0
			and     eax, not 10000h
			mov     cr0, eax
	}

	// 还原SSDT
	(NTREADVIRTUALMEMORY) (*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + pos_ReadVirtualMemory)) = OldNtReadVirtualMemory;
	(ZWCREATEFILE) (*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + pos_NtOpenProcess)) = OldNtOpenProcess;
	(NTWRITEVIRTUALMEMORY) (*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + pos_NtWriteVirtualMemory)) = OldNtWriteVitualMemory;
	__asm
	{
		mov     eax, cr0
			or     eax, 10000h
			mov     cr0, eax
			sti
	}
	DbgPrint("Unhook");
}
2010-11-30 20:18
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
3
vc 6也可以 应该怎么写 通讯。。。
2010-11-30 20:20
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
4
同求
2010-11-30 21:03
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
5
大哥 现在就缺一个 exe跟sys通讯 或者 内核下 进程名转化为进程id
2010-11-30 21:07
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
6
郁金香里面都有源码的,我的也是仿制他
2010-11-30 21:11
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
7
直接用内核函数读txt
exe把pid写在txt上
txt里面保存pid也可以的
所以现在就是sys读txt
2010-11-30 21:26
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
8
你写写看
保护demo.exe
驱动可编译的
弄好了我给你30 kx
悬赏的30kx是一定有的
我现在的kx是被暂时扣的
你加油试试
算是你贴子的完善
精华混不了
可以混点眼球
2010-11-30 21:27
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
9
居然没有人看上30kx
在一夜奋斗之后
修改了整个 通讯过程
终于 成功的实现了保护(虽然是用易语言)

只能在xp  2003系统下
又要解决兼容性 问题
。。。。。。。。。。。。。
上传的附件:
2010-12-1 12:35
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
10
顶下 没人看那
2010-12-3 10:56
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我一直在看,只是你不给出你的解决办法
我表示很纠结
2010-12-3 13:40
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
12
代码 以后发
现在写的太粗糙了

很多安全检验都没
还有很多过滤都没。
发一个最新进展

两个函数ssdt hook  理论上兼容 2000以上所有系统

保护进程实现了 一部分

这个是win7虚拟机 下的截图
上传的附件:
2010-12-3 21:43
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
13
经过不停的折腾 终于阻挡了疯狂的vce xxod  and 兼容win7 ...  ssdt inlinehook
过几天 继续折腾先暂停了。。太累了。。
2010-12-6 11:26
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
14
到这里下
http://bbs.pediy.com/showthread.php?p=899271#post899271
我发了代码在这里
2010-12-6 13:48
0
雪    币: 83
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
r3把pid保存成变量~然后取变量内存地址发给r0~

祝你顺利~
2010-12-7 11:54
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
r3把pid保存成变量~然后取变量内存地址发给r0~

为啥不直接发PID? 真是蛋疼
2010-12-7 12:00
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
17
也有直接发pid的不同的要求就要不同的写法(那个难度也有点 我这个本来关键在于那个没导出的 写内存的函数 不 通讯只是为了 方便测试 通讯部分其实是保留的)
多练习么 毕竟自己太菜。
2010-12-7 14:34
0
游客
登录 | 注册 方可回帖
返回
//