QueryFullProcessImageName, чем можно заменить на ХР?

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 12 окт 2009.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Как можно получить информацию на ХР? Подобную той что получается с помощью вышеназванной ф-ции.
     
  2. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    GetWindowModuleFileName?
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Процесс не всегда окно ,тем более чужой
     
  4. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    Ну тогда можно юзать toolhelp функцию modulefind, обращаясь к адресу 00400000. Эта функция возвращает MODULEENTRY32, в котором есть полный путь модуля.
     
  5. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    В MSDN чего то нет такой ф-ции,из какой дллки её загружать и что в неё передавать?
     
  6. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Вообщем мне надо зная пид процесса, определить его рабочую папку, тоесть в каком месте лежит исполняемый файл.
     
  7. movdqu

    movdqu New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    33
    Код (Text):
    1. // папка + имя
    2.     char buffer[MAX_PATH+128];
    3.     HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, dwProcessId );
    4.     if ( hProcess != NULL )
    5.     {
    6.         size_t buffer_lenght = GetModuleFileNameExA( hProcess, NULL, buffer, (MAX_PATH+128) );
    7.    
    8.         // только имя exe
    9.         buffer_lenght = GetModuleBaseNameA( hProcess, NULL, buffer, (MAX_PATH+128) );
    10.     };
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Код (Text):
    1. HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pid);
    2. MODULEENTRY32 me;
    3. me.dwSize = sizeof(me);
    4. if (h != INVALID_HANDLE_VALUE) && Module32First(h,&me))
    5. {
    6.    //me.szExePath - полный путь к экзешнику
    7.    ...
    8.   CloseHandle(h);
    9. }
     
  9. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Что то не получается , доступа недает :dntknw:
    Код (Text):
    1. #include <windows.h>
    2. #include <Psapi.h>
    3. #include <stdio.h>
    4. #pragma comment(lib, "Psapi.lib")
    5. char* dispp(void)
    6. {
    7. typedef LONG KPRIORITY;
    8. typedef int NTSTATUS;
    9. typedef enum _SYSTEMINFOCLASS
    10. {
    11. SystemBasicInformation, // 0x002C
    12. SystemProcessorInformation, // 0x000C
    13. SystemPerformanceInformation, // 0x0138
    14. SystemTimeInformation, // 0x0020
    15. SystemPathInformation, // not implemented
    16. SystemProcessInformation, // 0x00C8+ per process
    17. SystemCallInformation, // 0x0018 + (n * 0x0004)
    18. SystemConfigurationInformation, // 0x0018
    19. SystemProcessorCounters, // 0x0030 per cpu
    20. SystemGlobalFlag, // 0x0004 (fails if size != 4)
    21. SystemCallTimeInformation, // not implemented
    22. SystemModuleInformation, // 0x0004 + (n * 0x011C)
    23. SystemLockInformation, // 0x0004 + (n * 0x0024)
    24. SystemStackTraceInformation, // not implemented
    25. SystemPagedPoolInformation, // checked build only
    26. SystemNonPagedPoolInformation, // checked build only
    27. SystemHandleInformation, // 0x0004 + (n * 0x0010)
    28. SystemObjectTypeInformation, // 0x0038+ + (n * 0x0030+)
    29. SystemPageFileInformation, // 0x0018+ per page file
    30. SystemVdmInstemulInformation, // 0x0088
    31. SystemVdmBopInformation, // invalid info class
    32. SystemCacheInformation, // 0x0024
    33. SystemPoolTagInformation, // 0x0004 + (n * 0x001C)
    34. SystemInterruptInformation, // 0x0000, or 0x0018 per cpu
    35. SystemDpcInformation, // 0x0014
    36. SystemFullMemoryInformation, // checked build only
    37. SystemLoadDriver, // 0x0018, set mode only
    38. SystemUnloadDriver, // 0x0004, set mode only
    39. SystemTimeAdjustmentInformation, // 0x000C, 0x0008 writeable
    40. SystemSummaryMemoryInformation, // checked build only
    41. SystemNextEventIdInformation, // checked build only
    42. SystemEventIdsInformation, // checked build only
    43. SystemCrashDumpInformation, // 0x0004
    44. SystemExceptionInformation, // 0x0010
    45. SystemCrashDumpStateInformation, // 0x0004
    46. SystemDebuggerInformation, // 0x0002
    47. SystemContextSwitchInformation, // 0x0030
    48. SystemRegistryQuotaInformation, // 0x000C
    49. SystemAddDriver, // 0x0008, set mode only
    50. SystemPrioritySeparationInformation,// 0x0004, set mode only
    51. SystemPlugPlayBusInformation, // not implemented
    52. SystemDockInformation, // not implemented
    53. SystemPowerInfo, // 0x0060 (XP only!)
    54. SystemProcessorSpeedInformation, // 0x000C (XP only!)
    55. SystemTimeZoneInformation, // 0x00AC
    56. SystemLookasideInformation, // n * 0x0020
    57. SystemSetTimeSlipEvent,
    58. SystemCreateSession, // set mode only
    59. SystemDeleteSession, // set mode only
    60. SystemInvalidInfoClass1, // invalid info class
    61. SystemRangeStartInformation, // 0x0004 (fails if size != 4)
    62. SystemVerifierInformation,
    63. SystemAddVerifier,
    64. SystemSessionProcessesInformation, // checked build only
    65. MaxSystemInfoClass
    66. } SYSTEMINFOCLASS, *PSYSTEMINFOCLASS;
    67.  
    68. typedef enum
    69. {
    70. StateInitialized,
    71. StateReady,
    72. StateRunning,
    73. StateStandby,
    74. StateTerminated,
    75. StateWait,
    76. StateTransition,
    77. StateUnknown
    78. } THREAD_STATE;
    79.  
    80. typedef enum _KWAIT_REASON
    81. {
    82. Executive,
    83. FreePage,
    84. PageIn,
    85. PoolAllocation,
    86. DelayExecution,
    87. Suspended,
    88. UserRequest,
    89. WrExecutive,
    90. WrFreePage,
    91. WrPageIn,
    92. WrPoolAllocation,
    93. WrDelayExecution,
    94. WrSuspended,
    95. WrUserRequest,
    96. WrEventPair,
    97. WrQueue,
    98. WrLpcReceive,
    99. WrLpcReply,
    100. WrVirtualMemory,
    101. WrPageOut,
    102. WrRendezvous,
    103. Spare2,
    104. Spare3,
    105. Spare4,
    106. Spare5,
    107. Spare6,
    108. WrKernel,
    109. MaximumWaitReason
    110. } KWAIT_REASON, *PKWAIT_REASON;
    111.  
    112. typedef struct _CLIENT_ID
    113. {
    114. HANDLE UniqueProcess;
    115. HANDLE UniqueThread;
    116. } CLIENT_ID, *PCLIENT_ID;
    117.  
    118. typedef struct _UNICODE_STRING
    119. {
    120. USHORT Length;
    121. USHORT MaximumLength;
    122. PWSTR Buffer;
    123. } UNICODE_STRING, *PUNICODE_STRING;
    124.  
    125. typedef struct _SYSTEM_THREAD
    126. {
    127. LARGE_INTEGER liKernelTime; // 100 nsec units
    128. LARGE_INTEGER liUserTime; // 100 nsec units
    129. LARGE_INTEGER liCreateTime; // relative to 01-01-1601
    130. ULONG WaitTime; // ticks
    131. PVOID pStartAddress; // EIP
    132. CLIENT_ID Cid; // process/thread ids
    133. KPRIORITY Priority;
    134. KPRIORITY BasePriority;
    135. ULONG ContextSwitches;
    136. THREAD_STATE ThreadState;
    137. KWAIT_REASON WaitReason;
    138. // DWORD dwUnknown2; // maybe it not exists !!!
    139. } SYSTEM_THREAD, *PSYSTEM_THREAD;
    140.  
    141. typedef struct _VM_COUNTERS
    142. {
    143. ULONG uPeakVirtualSize;
    144. ULONG uVirtualSize;
    145. ULONG uPageFaultCount;
    146. ULONG uPeakWorkingSetSize;
    147. ULONG uWorkingSetSize;
    148. ULONG uQuotaPeakPagedPoolUsage;
    149. ULONG uQuotaPagedPoolUsage;
    150. ULONG uQuotaPeakNonPagedPoolUsage;
    151. ULONG uQuotaNonPagedPoolUsage;
    152. ULONG uPagefileUsage;
    153. ULONG uPeakPagefileUsage;
    154. } VM_COUNTERS, *PVM_COUNTERS;
    155.  
    156. typedef struct _IOCOUNTERS
    157. {
    158. ULONG uReadOperationCount;
    159. ULONG uWriteOperationCount;
    160. ULONG uOtherOperationCount;
    161. LARGE_INTEGER liReadTransferCount;
    162. LARGE_INTEGER liWriteTransferCount;
    163. LARGE_INTEGER liOtherTransferCount;
    164. } IOCOUNTERS, *PIOCOUNTERS;
    165.  
    166. typedef struct _SYSTEM_PROCESS_INFORMATION
    167. {
    168. ULONG uNext; // relative offset
    169. ULONG uThreadCount;
    170. LARGE_INTEGER liUnknown1;
    171. LARGE_INTEGER liUnknown2;
    172. LARGE_INTEGER liUnknown3;
    173. LARGE_INTEGER liCreateTime; // relative to 01-01-1601
    174. LARGE_INTEGER liUserTime; // 100 nsec units
    175. LARGE_INTEGER liKernelTime; // 100 nsec units
    176. UNICODE_STRING usName;
    177. KPRIORITY BasePriority;
    178. ULONG uUniqueProcessId;
    179. ULONG uInheritedFromUniqueProcessId;
    180. ULONG uHandleCount;
    181. ULONG uSessionId; // W2K Only!
    182. DWORD dwUnknown5;
    183. VM_COUNTERS VmCounters;
    184. ULONG uCommitCharge; // bytes
    185. SYSTEM_THREAD aST[];
    186. } SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
    187.  
    188. typedef NTSTATUS (NTAPI *PZwQuerySystemInformation)(
    189. SYSTEMINFOCLASS SystemInformationClass,
    190. PVOID pSystemInformation,
    191. ULONG uSystemInformationLength,
    192. PULONG puReturnLength
    193. );
    194. typedef BOOL (WINAPI *PWinStationGetProcessSid)(HANDLE hServer,DWORD ProcessId,FILETIME ProcessStartTime,PBYTE pProcessUserSid,PDWORD dwSidSize);
    195. typedef void (WINAPI *PCachedGetUserFromSid)(PSID pSid , PWCHAR pUserName, PULONG cbUserName);
    196. PZwQuerySystemInformation ZwQuerySystemInformation;
    197. PWinStationGetProcessSid WinStationGetProcessSid;
    198. PCachedGetUserFromSid CachedGetUserFromSid;
    199. PSYSTEM_PROCESS_INFORMATION SPI=NULL;
    200. ULONG memlen,bw;
    201. char PrcName[1024];
    202. char ExeName[1024];
    203. HANDLE hp;
    204. HANDLE hToken;
    205. TOKEN_PRIVILEGES Priv,PrivOld;
    206. DWORD cbPriv = sizeof(PrivOld);
    207. DWORD nameSize;
    208. wchar_t OwnerName[1024];
    209. char buf[2048];
    210. char buff[1024*70];strcpy(buff,"PID:Threads:\tUser:\t\tName:\n");
    211. ULONG  reqSize = 0;
    212. ULONG  sidSize;
    213. PSID    pSid;
    214. HMODULE winsta = NULL;
    215. HMODULE utildll = NULL;
    216. winsta = LoadLibrary("winsta.dll");
    217. WinStationGetProcessSid = (PWinStationGetProcessSid)GetProcAddress(winsta, "WinStationGetProcessSid");
    218. utildll = LoadLibrary("utildll.dll");
    219. CachedGetUserFromSid = (PCachedGetUserFromSid)GetProcAddress(utildll, "CachedGetUserFromSid");
    220. (int(__stdcall*)())ZwQuerySystemInformation=GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
    221. ZwQuerySystemInformation(SystemProcessInformation,SPI,0,&memlen);
    222. (void*)SPI=VirtualAlloc(NULL,memlen,MEM_COMMIT,PAGE_READWRITE);
    223. if(!ZwQuerySystemInformation(SystemProcessInformation,SPI,memlen,&bw))
    224. OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,&hToken );
    225. Priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    226. LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Priv.Privileges[0].Luid);
    227. AdjustTokenPrivileges(hToken,FALSE,&Priv,sizeof(Priv),&PrivOld,&cbPriv);
    228. while(SPI->uNext>0)
    229. {
    230. (void*)SPI=(PVOID)(SPI->uNext+(ULONG)SPI);
    231. if((SPI->usName.Length / 2)>=sizeof(PrcName)-1)continue;
    232. sidSize = 0;
    233. pSid = NULL;
    234. nameSize = MAX_PATH;
    235. WinStationGetProcessSid(NULL, (DWORD)SPI->uUniqueProcessId,*((FILETIME *)&SPI->liCreateTime), (PBYTE)pSid, &sidSize);
    236. if ((pSid = malloc(sidSize)) != NULL)
    237. {
    238. WinStationGetProcessSid(NULL,(DWORD)SPI->uUniqueProcessId, *((FILETIME *)&SPI->liCreateTime),(PBYTE)pSid, &sidSize);
    239. CachedGetUserFromSid(pSid,OwnerName,&nameSize);
    240. free(pSid);                                                              
    241. }
    242. wcstombs(PrcName,SPI->usName.Buffer,SPI->usName.Length);
    243. SetLastError(0);
    244. hp=OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,SPI->uUniqueProcessId);
    245. GetModuleFileNameEx(hp,NULL,ExeName,1024);
    246. wsprintf(buf,"%u     \t%u\t\t%ws\t\t%s\t%s\t%d\n",SPI->uUniqueProcessId,SPI->uThreadCount,OwnerName,PrcName,ExeName,GetLastError());
    247. strcat(buff,buf);
    248. }
    249. AdjustTokenPrivileges(hToken,FALSE,&PrivOld,sizeof(PrivOld),NULL,NULL);
    250. CloseHandle(hToken);
    251. VirtualFree(SPI,memlen,MEM_DECOMMIT);
    252. return (buff);
    253. }
     
  10. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    И где конкретно?
     
  11. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Priv.Privileges[0].Luid); ошибка ERROR_IO_PENDING почему то
     
  12. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    Попробуй так:

    BOOL bResult = FALSE;
    bResult=LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Priv.Privileges[0].Luid);
    if (!bResult)
    {
    dwStatus = GetLastError();
    if (dwStatus == ERROR_IO_PENDING) {
    dwStatus = WaitForSingleObject(Priv.Privileges[0].Luid,INFINITE);
    // или так dwStatus = WaitForSingleObject(&Priv.Privileges[0].Luid,INFINITE);
    if (dwStatus == WAIT_FAILED) - значит жопа
    {
    dwStatus = GetLastError();
    ......
    }
    ......
     
  13. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    WaitForSingleObject непомагает :dntknw: