コード例 #1
0
ファイル: path.cpp プロジェクト: RelicOfTesla/MySdk
void EnumFile( const bf::path& dir_path, bool childs, const std::function<bool( const bf::path&)>& pfn )
{
#if USE_BOOST_DIRECTORY_ITERATOR
	for( bf::directory_iterator it = bf::directory_iterator( dir_path ), it_end;
			it != it_end; ++it )
	{
		if( bf::is_regular( it->status() ) )
		{
			if( !pfn( it->path() ) )
			{
				break;
			}
		}
		else if( childs )
		{
			if( bf::is_directory( it->status() ) )
			{
				EnumFile( it->path(), childs, pfn );
			}
		}
	}
#else
	EnumDirectory( GetTPath( dir_path ).c_str(), childs, pfn );
#endif
}
コード例 #2
0
ファイル: dir_enum.hpp プロジェクト: RelicOfTesla/MySdk
inline static
void EnumDirectory(const TCHAR* dir_path, bool childs, const std::function<bool(const TCHAR*)>& pfn)
{
	std::basic_string<TCHAR> dir = dir_path;
	if (!dir.size())
	{
		return;
	}
	{
		TCHAR rch = *dir.rbegin();
		if (rch != TEXT('\\') && rch != TEXT('/'))
		{
			dir += TEXT('\\');
		}
	}

	WIN32_FIND_DATA FindInfo = {0};
	HANDLE hFind = FindFirstFile( (dir + TEXT("*")).c_str(), &FindInfo);
	if (hFind != INVALID_HANDLE_VALUE)
	{
		do
		{
			if (FindInfo.cFileName[0] == TEXT('.') &&
					( FindInfo.cFileName[1] == TEXT('.') ||  FindInfo.cFileName[1] == 0 ) )
			{
				continue;
			}
			if (FindInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && childs)
			{
				EnumDirectory((dir + FindInfo.cFileName).c_str(), childs, pfn);
			}
			else if ((int)FindInfo.dwFileAttributes != -1)
			{
				if ( !pfn( (dir + FindInfo.cFileName).c_str() ) )
				{
					break;
				}
			}
		}
		while (FindNextFile(hFind, &FindInfo));
	}
	FindClose(hFind);
}
コード例 #3
0
ファイル: Sysark.cpp プロジェクト: jinyongjie/jyj_github
NTSTATUS IoDispatchDeviceControl( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp )
{
    PVOID InputBuffer, OutputBuffer;
    ULONG InputBufferLength, OutputBufferLength;
    ULONG IoControlCode;
    TCHAR pMsg[MAX_PATH];
    ULONG msgLen, pid, ulBuffer;
    PEPROCESS pEProces;
    UNICODE_STRING usBuffer;
    NTSTATUS status = STATUS_SUCCESS;
    PALL_PROCESSES_INFO pAllProcessInfo;
    PALL_PROCESS_MODULE_INFO pAllProcessModuleInf;
    PALL_PROCESS_THREAD_INFO pAllProcessThreadInf;


    PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(pIrp);


    InputBuffer = pIrp->AssociatedIrp.SystemBuffer;
    InputBufferLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
    OutputBufferLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
    IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
    pIrp->IoStatus.Information = NULL;

    KdPrint(("IoControlCode is 0x%08x\n", IoControlCode));

    switch(IrpStack->Parameters.DeviceIoControl.IoControlCode)
    {
    //强杀进程
    case IOCTL_KILL_PROCESS:
    {
        //_asm int 3
        KdPrint(("enum kill process:\n"));
        __try
        {
            pid = *(ULONG*)InputBuffer;
            status = PsLookupProcessByProcessId((HANDLE)pid, &pEProces);
            if(NT_SUCCESS(status))
            {
                ObDereferenceObject(pEProces);
            }
            status = TerminateProcess(pEProces);
            if(NT_SUCCESS(status))
            {
                DbgPrint("TerminateProcess Ok!\n");
            }
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            pIrp->IoStatus.Information = STATUS_INVALID_PARAMETER;
            status = STATUS_UNSUCCESSFUL;
        }
    }
    break;
    //枚举进程
    case IOCTL_ENUM_PROCESS:
    {
        KdPrint(("enum process :\n"));
        //_asm int 3
        __try {

            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);

            pAllProcessInfo = (PALL_PROCESSES_INFO)ExAllocatePool(PagedPool, sizeof(ALL_PROCESSES_INFO));
            RtlZeroMemory(pAllProcessInfo, sizeof(ALL_PROCESSES_INFO));

            //EnumProcessByActiveProcess(pDeviceObject, pIrp, pAllProcessInfo);
            ScanXpHandleTable(pDeviceObject, pIrp, pAllProcessInfo);
            EnumProcessByThreadList(pDeviceObject, pIrp, pAllProcessInfo);

            if (RtlCopyMemory(OutputBuffer, pAllProcessInfo, sizeof(PROCESS_INFO) * pAllProcessInfo->uCount + sizeof(ULONG32)))
            {
                pIrp->IoStatus.Information = sizeof(PROCESS_INFO) * pAllProcessInfo->uCount + sizeof(ULONG32);
            }

        } __except( EXCEPTION_EXECUTE_HANDLER ) {

            pIrp->IoStatus.Information = STATUS_INVALID_PARAMETER;
            status = STATUS_UNSUCCESSFUL;
        }
        if (NULL != pAllProcessInfo)
        {
            ExFreePool(pAllProcessInfo);
            pAllProcessInfo = NULL;
        }

    }
    break;
    //枚举进程模块
    case IOCTL_ENUM_PROCESS_MODULE:
    {
        KdPrint(("enum process module:\n"));
        //_asm int 3
        __try {
            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);
            pAllProcessModuleInf = (PALL_PROCESS_MODULE_INFO)ExAllocatePool(PagedPool, sizeof(ALL_PROCESS_MODULE_INFO));
            RtlZeroMemory(pAllProcessModuleInf, sizeof(ALL_PROCESS_MODULE_INFO));
            pid = *(ULONG*)InputBuffer;
            PsLookupProcessByProcessId((HANDLE)pid, &pEProces);
            ObDereferenceObject(pEProces);

            EnumProcessModuleByPEB(pEProces, pAllProcessModuleInf);

            if (RtlCopyMemory(OutputBuffer, pAllProcessModuleInf, sizeof(PROCESS_MODULE_INFO) * pAllProcessModuleInf->uCount + sizeof(ULONG32)))
            {
                pIrp->IoStatus.Information = sizeof(PROCESS_MODULE_INFO) * pAllProcessModuleInf->uCount + sizeof(ULONG32);
            }

        } __except( EXCEPTION_EXECUTE_HANDLER ) {

            pIrp->IoStatus.Information = STATUS_INVALID_PARAMETER;
            status = STATUS_UNSUCCESSFUL;
        }
        if (NULL != pAllProcessModuleInf)
        {
            ExFreePool(pAllProcessModuleInf);
            pAllProcessModuleInf = NULL;
        }
    }
    break;
    //枚举进程线程
    case IOCTL_ENUM_PROCESS_THREAD:
    {
        KdPrint(("enum process thread:\n"));
        //_asm int 3
        __try {

            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);
            pAllProcessThreadInf = (PALL_PROCESS_THREAD_INFO)ExAllocatePool(PagedPool, sizeof(PALL_PROCESS_THREAD_INFO));
            RtlZeroMemory(pAllProcessThreadInf, sizeof(PALL_PROCESS_THREAD_INFO));
            pid = *(ULONG*)InputBuffer;
            PsLookupProcessByProcessId((HANDLE)pid, &pEProces);
            ObDereferenceObject(pEProces);

            EnumProcessThread(pEProces, pAllProcessThreadInf);

            if (RtlCopyMemory(OutputBuffer, pAllProcessThreadInf, sizeof(PROCESS_THREAD_INFO) * pAllProcessThreadInf->uCount + sizeof(ULONG32)))
            {
                pIrp->IoStatus.Information = sizeof(PROCESS_THREAD_INFO) * pAllProcessThreadInf->uCount + sizeof(ULONG32);
            }

        } __except( EXCEPTION_EXECUTE_HANDLER ) {

            pIrp->IoStatus.Information = STATUS_INVALID_PARAMETER;
            status = STATUS_UNSUCCESSFUL;
        }
        if (NULL != pAllProcessThreadInf)
        {
            ExFreePool(pAllProcessThreadInf);
            pAllProcessThreadInf = NULL;
        }

    }
    break;
    //删除文件
    case IOCTL_DELETE_FILE:
    {
        KdPrint(("enum delete file :\n"));
        //_asm int 3
        __try {

            RtlInitUnicodeString(&usBuffer, (PWCHAR)InputBuffer);
            DeleteFile(&usBuffer);

        } __except( EXCEPTION_EXECUTE_HANDLER ) {

            pIrp->IoStatus.Information = STATUS_INVALID_PARAMETER;
            status = STATUS_UNSUCCESSFUL;
        }
    }
    break;
    //获取驱动模块的数目
    case IOCTL_GET_DRIVER_MODULE_INFO_SIZE:
    {
        //_asm int 3
        KdPrint(("get driver modules info size :\n"));
        __try
        {
            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);
            EnumDriverModules(g_pDriverObj);
            ulBuffer = GetDriverModulesInfoCount();
            if (RtlCopyMemory(OutputBuffer, &ulBuffer, sizeof(ULONG)))
            {
                pIrp->IoStatus.Information = sizeof(ulBuffer);
            }
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            FreePagedLookasideListForDriverModules();
            KdPrint(("IOCTL_GET_DRIVER_MODULE_INFO_SIZE error"));
            status = STATUS_UNSUCCESSFUL;
        }
    }
    break;
    //获取驱动模块列表信息
    case IOCTL_ENUM_DRIVER_MODULE:
    {
        //_asm int 3
        KdPrint(("enum driver module :\n"));
        __try
        {
            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);
            GetDriverModulesInfo(OutputBuffer);
            ulBuffer = GetDriverModulesInfoCount();
            pIrp->IoStatus.Information = ulBuffer * sizeof(DRIVER_MODULE_INFO);
            FreePagedLookasideListForDriverModules();
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            KdPrint(("IOCTL_ENUM_DRIVER_MODULE error!"));
            status = STATUS_UNSUCCESSFUL;
        }
    }
    break;
    //获取服务列表的数目
    case IOCTL_GET_SERVICES_COUNT:
    {
        //_asm int 3
        KdPrint(("get services count :\n"));
        __try
        {
            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);
            EnumServices();
            ulBuffer = GetServicesCount();
            if (RtlCopyMemory(OutputBuffer, &ulBuffer, sizeof(ULONG)))
            {
                pIrp->IoStatus.Information = sizeof(ulBuffer);
            }
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            FreePagedLookasideListForServices();
            KdPrint(("IOCTL_GET_DRIVER_MODULE_INFO_SIZE error"));
            status = STATUS_UNSUCCESSFUL;
        }
    }
    break;
    //获取服务列表的信息
    case IOCTL_ENUM_SERVICES:
    {
        //_asm int 3
        KdPrint(("enum services :\n"));
        __try
        {
            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);
            GetServicesInfo(OutputBuffer);
            ulBuffer = GetServicesCount();
            pIrp->IoStatus.Information = ulBuffer * sizeof(DRIVER_MODULE_INFO);
            FreePagedLookasideListForServices();
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            KdPrint(("IOCTL_ENUM_DRIVER_MODULE error!"));
            status = STATUS_UNSUCCESSFUL;
        }

    }
    break;
    //获取自启动列表的数目
    case IOCTL_GET_STARTUP_INFO_COUNT:
    {
        //_asm int 3
        KdPrint(("get startup count :\n"));
        __try
        {
            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);
            EnumSystemStartupInfo();
            ulBuffer = GetSystemStartupInfoCount();
            if (RtlCopyMemory(OutputBuffer, &ulBuffer, sizeof(ULONG)))
            {
                pIrp->IoStatus.Information = sizeof(ulBuffer);
            }
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            //FreePagedLookasideListForStartup();
            KdPrint(("IOCTL_GET_STARTUP_INFO_COUNT error"));
            status = STATUS_UNSUCCESSFUL;
        }
    }
    break;
    //获取自启动列表的信息
    case IOCTL_ENUM_STARTUP:
    {
        //_asm int 3
        KdPrint(("enum startup :\n"));
        __try
        {
            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);
            GetSystemStartupInfo(OutputBuffer);
            ulBuffer = GetSystemStartupInfoCount();
            pIrp->IoStatus.Information = ulBuffer * sizeof(STARTUP_INFO);
            FreePagedLookasideListForStartup();
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            KdPrint(("IOCTL_ENUM_STARTUP error!"));
            status = STATUS_UNSUCCESSFUL;
        }
    }
    break;
    //获得SSDT计数
    case IOCTL_GET_SSDT_COUNT:
    {
        //_asm int 3
        KdPrint(("hook count :\n"));
        __try
        {
            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);
            ulBuffer = GetSSDTCount();
            if (RtlCopyMemory(OutputBuffer, &ulBuffer, sizeof(ULONG)))
            {
                pIrp->IoStatus.Information = sizeof(ulBuffer);
            }

        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            KdPrint(("IOCTL_GET_SSDT_COUNT error!"));
            status = STATUS_UNSUCCESSFUL;
        }


    }
    break;
    case IOCTL_ENUM_SSDT:
    {
        //_asm int 3
        KdPrint(("enum SSDT :\n"));
        __try
        {
            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);
            EnumSSDT(OutputBuffer);
            ulBuffer = GetSSDTCount();
            pIrp->IoStatus.Information = ulBuffer * sizeof(STARTUP_INFO);
            FreePagedLookasideListForSSDT();
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            KdPrint(("IOCTL_ENUM_SSDT error!"));
            status = STATUS_UNSUCCESSFUL;
        }
    }
    break;
    //设置SSDT
    case IOCTL_SET_SSDT:
    {
        //_asm int 3
        KdPrint(("set ssdt :\n"));
        __try
        {
            DisableWriteProtection();
            SetSSDT((PVOID)InputBuffer);
            EnableWriteProtection();

        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            KdPrint(("IOCTL_SETSSDT error!"));
            status = STATUS_UNSUCCESSFUL;
        }
    }
    break;
    //获得SHADOW SSDT 计数
    case IOCTL_GET_SHADOW_HOOK_COUNT:
    {
        //_asm int 3
        KdPrint(("shadow hook count :\n"));
        __try
        {
            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);
            ulBuffer = GetShadowSSDTCount();
            if (RtlCopyMemory(OutputBuffer, &ulBuffer, sizeof(ULONG)))
            {
                pIrp->IoStatus.Information = sizeof(ulBuffer);
            }

        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            KdPrint(("IOCTL_GET_SHADOW_HOOK_COUNT error!"));
            status = STATUS_UNSUCCESSFUL;
        }

    }
    break;
    case IOCTL_ENUM_SHADOW_HOOK:
    {
        //_asm int 3
        KdPrint(("enum shadow ssdt :\n"));
        __try
        {
            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);
            EnumShadowSSDT(OutputBuffer);
            ulBuffer = GetShadowSSDTCount();
            pIrp->IoStatus.Information = ulBuffer * sizeof(STARTUP_INFO);
            FreePagedLookasideListForShadowSSDT();
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            KdPrint(("IOCTL_ENUM_SHADOW_HOOK error!"));
            status = STATUS_UNSUCCESSFUL;
        }

    }
    break;
    //设置SHADOW SSDT
    case IOCTL_SET_SHADOW_HOOK:
    {
        //_asm int 3
        KdPrint(("set shadow ssdt :\n"));
        __try
        {
            DisableWriteProtection();
            SetShadowSSDT((PVOID)InputBuffer);
            EnableWriteProtection();

        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            KdPrint(("IOCTL_SET_SHADOW_HOOK error!"));
            status = STATUS_UNSUCCESSFUL;
        }
    }
    break;
    //获取目录下文件的计数
    case IOCTL_GET_DIRECTORY_INFO_COUNT:
    {
        //_asm int 3
        KdPrint(("get directory info count :\n"));
        __try
        {
            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);
            EnumDirectory((PCHAR)InputBuffer);
            ulBuffer = GetDirectoryInfoCount();
            if (RtlCopyMemory(OutputBuffer, &ulBuffer, sizeof(ULONG)))
            {
                pIrp->IoStatus.Information = sizeof(ulBuffer);
            }
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            KdPrint(("IOCTL_GET_DIRECTORY_INFO_COUNT error!"));
            status = STATUS_UNSUCCESSFUL;
        }
    }
    break;
    //获取目录下所有文件的信息
    case IOCTL_ENUM_DIRECTORY_INFO:
    {
        //_asm int 3
        KdPrint(("enum directory info :\n"));
        __try
        {
            OutputBuffer = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
            RtlZeroMemory(OutputBuffer, pIrp->MdlAddress->ByteCount);
            GetDirectoryInfo((PVOID)OutputBuffer);
            ulBuffer = GetDirectoryInfoCount();
            pIrp->IoStatus.Information = ulBuffer * sizeof(DIRECTORY_INFO);

        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            KdPrint(("IOCTL_ENUM_DIRECTORY_INFO error!"));
            status = STATUS_UNSUCCESSFUL;
        }
    }
    break;
    //修改文件权限
    case IOCTL_MODIFY_FILE_RIGHT:
    {
        //_asm int 3
        KdPrint(("modify file right :\n"));
        __try
        {
            status = ModifyRight((FILE_RIGHT_MODIFY*)InputBuffer);
            status = STATUS_SUCCESS;

        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            KdPrint(("IOCTL_MODIFY_FILE_RIGHT error!"));
            status = STATUS_UNSUCCESSFUL;
        }
    }
    break;
    default:
        status = STATUS_INVALID_DEVICE_REQUEST;
        pIrp->IoStatus.Information = 0;
        break;
    }

    //ClearLog();

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