找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5322|回复: 2

为什么把MiniLzOpenProcess转换成C++版本不成功呢?

[复制链接]

1

主题

6

回帖

0

精华

初来乍到

积分
12
发表于 2011-8-19 07:27:47 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>
  2. #include <Windows.h>

  3. NTSTATUS GetDebugPrivilege()
  4. {
  5.         PVOID RtlAdjustPrivilege=NULL;
  6.         DWORD dwRetVal=0;
  7.         NTSTATUS ntst=0xC0000022;
  8.         RtlAdjustPrivilege=(PVOID)GetProcAddress(GetModuleHandleA("ntdll.dll"),"RtlAdjustPrivilege");
  9.         if(RtlAdjustPrivilege==NULL)
  10.                 return ntst;
  11.         //RtlAdjustPrivilege(20,1,0,&dwRetVal);
  12.         __asm
  13.         {
  14.                 lea eax,dwRetVal
  15.                 push eax
  16.                 push 0
  17.                 push 1
  18.                 push 20
  19.                 call RtlAdjustPrivilege
  20.                 mov ntst,eax
  21.         }
  22.         return ntst;
  23. }

  24. /*
  25. Private Function MiniLzOpenProcess(ByVal ProcessID As Long, ByVal DesiredAccess As Long) As Long
  26.     Dim ObjectAttributes(5&) As Long, ClientId(1&) As Long, ProcessHandle As Long, PHtemp As Long, HandleTable() As Long, ProcessInfo(5&) As Long
  27.     ObjectAttributes(0&) = 24&: ClientId(0&) = ProcessID
  28.     If ZwOpenProcess(VarPtr(ProcessHandle), DesiredAccess, VarPtr(ObjectAttributes(0&)), VarPtr(ClientId(0&))) >= 0& Then
  29.         PHtemp = ProcessHandle
  30.     Else
  31.         ReDim HandleTable(&H7FFF&)
  32.         Do
  33.             ReDim HandleTable(UBound(HandleTable) * 2& + 1&)
  34.             ProcessHandle = ZwQuerySystemInformation(16&, VarPtr(HandleTable(0&)), UBound(HandleTable) * 4& + 4&, 0&)
  35.         Loop While ProcessHandle = &HC0000004
  36.         Do While HandleTable(0&) > 0&
  37.             If (HandleTable(HandleTable(0&) * 4& - 2&) And &HFF&) = 5& Then
  38.                 ClientId(0&) = HandleTable(HandleTable(0&) * 4& - 3&) And &HFFFF&
  39.                 If ZwOpenProcess(VarPtr(ProcessHandle), 64&, VarPtr(ObjectAttributes(0&)), VarPtr(ClientId(0&))) >= 0& Then
  40.                     If ZwDuplicateObject(ProcessHandle,
  41.                                                                                         HandleTable(HandleTable(0&) * 4& - 2&) \ &H10000,
  42.                                                                                         -1&,
  43.                                                                                         VarPtr(PHtemp),
  44.                                                                                         DesiredAccess Or &H400&,
  45.                                                                                         0&,
  46.                                                                                         4&) >= 0& Then
  47.                         If ZwQueryInformationProcess(PHtemp, 0&, VarPtr(ProcessInfo(0&)), 24&, 0&) >= 0& Then
  48.                                                         If ProcessInfo(4&) = ProcessID Then
  49.                                                                 goto proc_end
  50.                                                         End If
  51.                             ZwClose PHtemp
  52.                                                 End If
  53.                     End If
  54.                     ZwClose ProcessHandle
  55.                 End If
  56.             End If
  57.             HandleTable(0&) = HandleTable(0&) - 1&
  58.         Loop
  59.         PHtemp = 0&
  60.     End If
  61. proc_end:
  62.         MiniLzOpenProcess = PHtemp
  63. End Function
  64. */

  65. HANDLE DkOpenProcess(DWORD DesiredAccess, BOOL bInheritHandle, DWORD ProcessID)
  66. {
  67.         //typedef function
  68.         typedef long (__stdcall *ZWOPENPROCESS)(PHANDLE, ULONG, PLONG, PLONG);
  69.         typedef long (__stdcall *ZWQUERYSYSTEMINFORMATION)(LONG, PVOID, ULONG, PULONG);
  70.         typedef long (__stdcall* ZWDUPLICATEOBJECT)(HANDLE, ULONG, HANDLE, PHANDLE, ACCESS_MASK, BOOLEAN, ULONG);
  71.         typedef long (__stdcall* ZWQUERYINFORMATIONPROCESS)(HANDLE, PVOID, PVOID, ULONG, PULONG );   
  72.         typedef long (__stdcall *ZWCLOSE)(HANDLE);
  73.         ZWOPENPROCESS ZwOpenProcess=(ZWOPENPROCESS)GetProcAddress(GetModuleHandleA("ntdll.dll"),"ZwOpenProcess");
  74.         ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation=(ZWQUERYSYSTEMINFORMATION)GetProcAddress(GetModuleHandleA("ntdll.dll"),"ZwQuerySystemInformation");
  75.         ZWDUPLICATEOBJECT ZwDuplicateObject=(ZWDUPLICATEOBJECT)GetProcAddress(GetModuleHandleA("ntdll.dll"),"ZwDuplicateObject");
  76.         ZWQUERYINFORMATIONPROCESS ZwQueryInformationProcess=(ZWQUERYINFORMATIONPROCESS)GetProcAddress(GetModuleHandleA("ntdll.dll"),"ZwQueryInformationProcess");
  77.         ZWCLOSE ZwClose=(ZWCLOSE)GetProcAddress(GetModuleHandleA("ntdll.dll"),"ZwClose");
  78.         //declare var
  79.         long ObjectAttributes[6]={0}, ClientId[2]={0}, ProcessInfo[6]={0};
  80.         HANDLE ProcessHandle=NULL, PHtemp=NULL;
  81.         PDWORD HandleTable=NULL;
  82.         DWORD HandleTableCount=0;
  83.         NTSTATUS st=0;
  84.         //code
  85.         ObjectAttributes[0]=24;
  86.         ClientId[0]=ProcessID;
  87.     if(ZwOpenProcess(&ProcessHandle, DesiredAccess, &ObjectAttributes[0], &ClientId[0]) >= 0)
  88.     {   
  89.                 PHtemp = ProcessHandle;
  90.         }
  91.         else
  92.         {
  93.                 //Enum Handle Table
  94.                 HandleTableCount=0x7FFF+1;
  95.                 HandleTable=(PDWORD)malloc(HandleTableCount);
  96.                 memset(HandleTable,0,HandleTableCount);
  97.                 do{
  98.                         HandleTableCount=(HandleTableCount-1)*2+1;
  99.                         HandleTable=(PDWORD)malloc(HandleTableCount);
  100.                         memset(HandleTable,0,HandleTableCount);
  101.                         st = ZwQuerySystemInformation(16, &HandleTable[0], (HandleTableCount-1)*4+4, 0);
  102.                 }while(st==0xC0000004);
  103.                 //Get Target Handle
  104.                 while(HandleTable[0] > 0)
  105.                 {
  106.                         if((HandleTable[HandleTable[0]*4-2] & 0xFF) == 5)
  107.                         {
  108.                                 ClientId[0] = HandleTable[HandleTable[0]*4-3] & 0xFFFF;
  109.                                 if(ZwOpenProcess(&ProcessHandle, 64, &ObjectAttributes[0], &ClientId[0]) >= 0)
  110.                                 {
  111.                     if(ZwDuplicateObject(ProcessHandle, HandleTable[HandleTable[0]*4-2] / 0x10000, (HANDLE)-1, &PHtemp, DesiredAccess | 0x400, 0, 4) >= 0)
  112.                                         {
  113.                                                 if(ZwQueryInformationProcess(PHtemp, 0, &ProcessInfo[0], 24, 0) >= 0)
  114.                                                 {
  115.                                                         if(ProcessInfo[4] == ProcessID)
  116.                                                         {
  117.                                                                 goto proc_end;
  118.                                                         }
  119.                                                         ZwClose(PHtemp);
  120.                                                 }
  121.                                         }
  122.                                         ZwClose(ProcessHandle);
  123.                                 }
  124.                         }
  125.                         HandleTable[0] = HandleTable[0] - 1;
  126.                 }
  127.                 PHtemp=NULL;
  128.         }
  129. proc_end:
  130.         return PHtemp;
  131. }

  132. int main()
  133. {
  134.         GetDebugPrivilege();
  135.         DWORD pid;
  136.         printf("Input Process id: ");
  137.         scanf("%ld", &pid);
  138.         printf("Process Handle: %ld", DkOpenProcess(PROCESS_ALL_ACCESS, 0, pid));
  139.         getchar();
  140.         getchar();
  141.         return 0;
  142. }
复制代码
谁能告诉我是什么原因?

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2011-8-19 07:52:15 | 显示全部楼层
我看到了DkOpenProcess,有意思。
问下Dk是不是Donkey的缩写?

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-8-19 09:36:21 | 显示全部楼层
这年头不流行到这个了,流行Naylon的FxOpenProcess:http://www.m5home.com/bbs/thread-4806-1-1.html
我以前貌似收藏了个C版本的复制句柄打开进程,你拿去看看吧。。。

LzOpenProcess.rar

59.09 KB, 下载次数: 5373

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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