郁金香灬老师 游戏安全  驱动 逆向调试 C/C++编程  脚本 UE4/UE5

找回密码
立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
发新帖
课程大纲和价格
官方联系方式2024在线课大纲QQ咨询

34万

积分

125

好友

132

主题
发表于 2024-2-20 21:54:45 | 查看: 294| 回复: 0
  1. #include<ntifs.h>

  2. NTSTATUS GetDosPathByProcessId(IN ULONG pid, OUT PANSI_STRING pAnsiNtPath);

  3. typedef NTSTATUS(*PfnZwQueryInformationProcess) (
  4.         __in HANDLE ProcessHandle,
  5.         __in PROCESSINFOCLASS ProcessInformationClass,
  6.         __out_bcount(ProcessInformationLength) PVOID ProcessInformation,
  7.         __in ULONG ProcessInformationLength,
  8.         __out_opt PULONG ReturnLength
  9.         );

  10. PfnZwQueryInformationProcess ZwQueryInformationProcess;

  11. //初始化未公开的导出函数
  12. NTSTATUS InitGloableFunction()
  13. {
  14.         UNICODE_STRING UtrZwQueryInformationProcessName =
  15.                 RTL_CONSTANT_STRING(L"ZwQueryInformationProcess");
  16.         ZwQueryInformationProcess =
  17.                 (PfnZwQueryInformationProcess)MmGetSystemRoutineAddress(&UtrZwQueryInformationProcessName);
  18.         return STATUS_SUCCESS;
  19. }

  20. NTSTATUS GetDosPathByProcessId(IN ULONG pid, OUT PANSI_STRING pAnsiNtPath)
  21. {
  22.         /*
  23.         1.根据PID获取进程句柄
  24.         2.使用ZwQueryInformationProcess 传入HANDLE 使用27号功能获取路径
  25.         */
  26.         HANDLE hProcess = 0;
  27.         CLIENT_ID cid;
  28.         OBJECT_ATTRIBUTES obj;
  29.         NTSTATUS ntStatus;
  30.         ULONG RetLength = 0;
  31.         PVOID pBuffer = NULL;
  32.         HANDLE hFile;
  33.         IO_STATUS_BLOCK iostu;
  34.         PVOID FileObject = NULL;
  35.         PFILE_OBJECT pMyFileObject = NULL;
  36.         UNICODE_STRING DosName;

  37.         UNICODE_STRING FunllPath;

  38.         if (ZwQueryInformationProcess == NULL)
  39.                 return STATUS_UNSUCCESSFUL;

  40.         cid.UniqueProcess = (HANDLE)pid;
  41.         cid.UniqueThread = 0;
  42.         InitializeObjectAttributes(&obj, 0, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, 0);
  43.         ntStatus = ZwOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &obj, &cid);
  44.         if (!NT_SUCCESS(ntStatus))
  45.                 return STATUS_UNSUCCESSFUL;
  46.         //使用27 号功能遍历

  47.         ntStatus = ZwQueryInformationProcess(hProcess, ProcessImageFileName, NULL, 0, &RetLength);
  48.         if (STATUS_INFO_LENGTH_MISMATCH != ntStatus)
  49.                 return STATUS_UNSUCCESSFUL;

  50.         //申请内存继续获取.
  51.         pBuffer = ExAllocatePoolWithTag(PagedPool, RetLength, 'niBI');
  52.         if (NULL == pBuffer)
  53.                 return STATUS_UNSUCCESSFUL;
  54.         //重新调用获取.

  55.         ntStatus = ZwQueryInformationProcess(hProcess, ProcessImageFileName, pBuffer, RetLength, &RetLength);
  56.         if (!NT_SUCCESS(ntStatus))
  57.         {
  58.                 if (NULL != pBuffer)
  59.                 {
  60.                         ExFreePoolWithTag(pBuffer, 'niBI');
  61.                 }
  62.                 return STATUS_UNSUCCESSFUL;
  63.         }

  64.         //开始转化路径
  65.         InitializeObjectAttributes(&obj, pBuffer, OBJ_KERNEL_HANDLE, 0, 0);
  66.         ntStatus = ZwOpenFile(
  67.                 &hFile,
  68.                 GENERIC_READ,
  69.                 &obj,
  70.                 &iostu,
  71.                 FILE_SHARE_READ | FILE_SHARE_WRITE,
  72.                 0);
  73.         if (!NT_SUCCESS(ntStatus))
  74.         {
  75.                 if (NULL != pBuffer)
  76.                 {
  77.                         ExFreePoolWithTag(pBuffer, 'niBI');
  78.                 }
  79.                 ZwClose(hFile);
  80.                 return STATUS_UNSUCCESSFUL;
  81.         }

  82.         //获得文件对象
  83.         ntStatus = ObReferenceObjectByHandle(
  84.                 hFile,
  85.                 GENERIC_ALL,
  86.                 *IoFileObjectType,
  87.                 KernelMode,
  88.                 &FileObject,
  89.                 NULL);

  90.         if (!NT_SUCCESS(ntStatus))
  91.         {
  92.                 if (NULL != pBuffer)
  93.                 {
  94.                         ExFreePoolWithTag(pBuffer, 'niBI');
  95.                 }

  96.                 if(FileObject)                ntStatus = (NTSTATUS) ObDereferenceObject(FileObject);

  97.                 ZwClose(hFile);
  98.                 return STATUS_UNSUCCESSFUL;
  99.         }

  100.         pMyFileObject = (PFILE_OBJECT)FileObject;

  101.         if (NULL == pMyFileObject)
  102.         {
  103.                 if (NULL != pBuffer)
  104.                 {
  105.                         ExFreePoolWithTag(pBuffer, 'niBI');
  106.                 }
  107.                 ntStatus = (NTSTATUS)ObDereferenceObject(FileObject);
  108.                 ZwClose(hFile);
  109.                 return STATUS_UNSUCCESSFUL;

  110.         }
  111.         //通过 RtlVolumeDeviceToDosName 获取Dos路径 也即是C: D: 等盘符
  112.         RtlVolumeDeviceToDosName(pMyFileObject->DeviceObject, &DosName);

  113.         //获得路径直接直接拼接即可.

  114.         FunllPath.MaximumLength = pMyFileObject->FileName.MaximumLength + DosName.MaximumLength;
  115.         FunllPath.Length = pMyFileObject->FileName.Length + DosName.Length;
  116.         FunllPath.Buffer = ExAllocatePoolWithTag(NonPagedPool, FunllPath.MaximumLength, 0);

  117.         //拼接路径
  118.         RtlCopyUnicodeString(&FunllPath, &DosName);//得到C:
  119.         RtlAppendUnicodeStringToString(&FunllPath, &pMyFileObject->FileName);//得到C:\\xxx路径,转为Asii
  120.         RtlUnicodeStringToAnsiString(pAnsiNtPath, &FunllPath, TRUE); //RtlFreeAnsiString  要释放空间.

  121.         if(FunllPath.Buffer)
  122.         ExFreePool(FunllPath.Buffer); //因为传出自动为其分配了内存所以这个进行谁放

  123.         if (NULL != pBuffer)
  124.         {
  125.                 ExFreePoolWithTag(pBuffer, 'niBI');
  126.         }

  127.         ntStatus = (NTSTATUS) ObDereferenceObject(FileObject);
  128.         ZwClose(hFile);
  129.         return STATUS_SUCCESS;
  130. }

复制代码


游戏安全课程 学员办理咨询联系QQ150330575 手机 139 9636 2600  免费课程 在 www.bilibili.com 搜 郁金香灬老师
您需要登录后才可以回帖 登录 | 立即注册

QQ咨询

QQ|Archiver|手机版|小黑屋|郁金香游戏技术

GMT+8, 2024-5-9 01:11 , Processed in 0.084502 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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