VIII Международная научно-практическая Интернет-конференция «Спецпроект: анализ научных исследований» (30–31 мая 2013г.)

Лотоцький В. Я.

Тернопільський національний економічний університет, Україна

ВИЗНАЧЕННЯ РОБОЧОЇ ПАПКИ ВИКОНУВАНОГО ПРОЦЕСУ АКТИВНОГО ВІКНА ЗАСОБАМИ WIN32 API ТА C#

 

В цій статті розглянуто підхід до визначення робочої папки виконуваного процесу активного вікна користувача ОС Windows 8 у середовищі Windows Runtime . Підхід базується на Win32 API .

 

Актуальність.      Із виходом ОС Windows 8 компанія Microsoft представила нову архітектуру ПЗ Windows Runtime . Додатки, створені згідно нової архітектури, розповсюджуються за допомогою Windows Store та, будучи запущеними на пристрої користувача, працюють всередині процесу WWAHost.exe, що унеможливлює ідентифікацію активного додатку, використовуючи назву його процесу.

Таким чином, поточне ПЗ для ОС Windows, ціллю якого є збір та опрацювання інтенсивності використання додатків, містить проблеми з розпізнаванням активних додатків у середовищі Windows Runtime . Нами було розглянуто широкий ряд додатків-профайлерів і у кожному з них було підтверджено існування проблеми невірної ідентифікації активного додатку Windows Runtime , коли, незалежно від активного додатку, зберігалась лише назва процесу WWAHost.exe.

Оскільки нам не вдалось знайти існуючого ПЗ чи підходу, які б коректно розв’язували поставлену задачу, було прийнято рішення знайти підхід до визначення активного додатку у середовищі Windows Runtime шляхом роботи з оточенням активного процесу.

Підхід. Проаналізувавши роботу додатків з Windows Store ми переконались, що кожний додаток ініціалізує окремий процес WWAHost.exe та виконується в ньому. Зчитавши Process Environment Block ( PEB ) [1] ми можемо знайти вказівник на структуру RTL_USER_PROCESS_PARAMETERS [2], що, в свою чергу, містить вказівник на стрічку з поточною директорією процесу: поле UNICODE_STRING CurrentDirectoryPath [3].

У середовищі Windows Runtime директорія поточного процесу WWAHost.exe містить ряд інформації щодо активного додатку, що включає в себе ім’я додатку, яке залишається незмінним, доки додаток залишається інстальованим у ОС. Таким чином, проаналізувавши директорію поточного процесу WWAHost.exe та застосувавши правила регулярних виразів [4] ми можемо отримати назву активного додатку Windows Store .

Реалізація. Process Environment Block ( PEB ), зазвичай, знаходиться в верхніх ділянках пам’яті процесу, над « 0х7ff00000 ». Адреса PEB є різною майже для всіх процесів, що унеможливлює її оголошення у вигляді константи. Єдиним способом отримати її є використання недокументованої функції бібліотеки ntdll.lib NtQueryInformationProcess [5].

Для виклику функції NtQueryInformationProcess необхідно знати адресу PEB . Для знаходження адреси PEB будь-якого процесу слід отримати інформацію про структуру PROCESS_BASIC_INFORMATION наступним чином:

 

private struct PROCESS_BASIC_INFORMATION

{

public IntPtr Reserved1 ;

public IntPtr PebBaseAddress ;

public IntPtr Reserved2_0;

public IntPtr Reserved2_1;

public IntPtr UniqueProcessId ;

public IntPtr Reserved3 ;

}

private struct UNICODE_STRING

{

public short Length ;

public short MaximumLength ;

public IntPtr Buffer ;

}

  [ DllImport ("ntdll.dll")]

private static extern int NtQueryInformationProcess ( IntPtr ProcessHandle , int ProcessInformationClass , ref PROCESS_BASIC_INFORMATION ProcessInformation , int ProcessInformationLength , IntPtr ReturnLength );

[ DllImport ("kernel32.dll", SetLastError = true )]

private static extern bool ReadProcessMemory ( IntPtr hProcess , IntPtr lpBaseAddress , ref UNICODE_STRING lpBuffer , IntPtr dwSize , IntPtr lpNumberOfBytesRead );

 

Оголосивши необхідні структури, безпосередньо в методі, що працює з активним процесом, дізнаємося його адресу PEB :

 

PROCESS_BASIC_INFORMATION pbi = new PROCESS_BASIC_INFORMATION ();

int hr = NtQueryInformationProcess ( handle , 0, ref pbi , Marshal.SizeOf ( pbi ), IntPtr.Zero );

if ( hr != 0)

throw new Win32Exception ( hr );

 

За допомогою отриманої PEB адреси процесу ( pbi.PebBaseAddress ) можна зчитати інформацію, на яку вона вказує та добратись до структури RTL_USER_PROCESS_PARAMETERS :

 

IntPtr pp = new IntPtr ();

if (! ReadProcessMemory ( handle , pbi.PebBaseAddress + processParametersOffset , ref pp , new IntPtr ( Marshal.SizeOf ( pp )), IntPtr.Zero ))

throw new Win32Exception ( Marshal.GetLastWin32Error ());

 

Наступним кроком потрібно отримати структуру UNICODE_STRING CurrentDirectoryPath та прочитати її вміст у буфер для подальшого використання:

 

UNICODE_STRING us = new UNICODE_STRING ();

if (! ReadProcessMemory ( handle , pp + offset , ref us , new IntPtr ( Marshal.SizeOf ( us )), IntPtr.Zero ))

throw new Win32Exception ( Marshal.GetLastWin32Error ());

if (( us.Buffer == IntPtr.Zero ) || ( us.Length == 0))

return null ;

 

Нарешті, прочитавши буфер, отримуємо поточну директорію активного процесу:

 

string s = new string ( '\0' , us.Length / 2);

hr = NtWow64ReadVirtualMemory64 ( handle , us.Buffer , s, us.Length , IntPtr.Zero );

if ( hr != 0)

{

throw new Win32Exception ( hr );

}

return s;

 

З шляху поточної директорії маємо змогу побачити, який саме додаток Windows Store виконується всередині процесу WWAHost.exe та в подальшому використовувати цю інформацію для власних цілей.

Висновок. У роботі описано підхід та найважливіші аспекти реалізації пошуку поточної директорії активного процесу, що дає змогу отримати назву активного додатку, який виконується у процесі WWAHost.exe в середовищі Windows Runtime .

Цей підхід дасть змогу вдосконалити існуючі додатки-профайлери та добавити можливість відслідковування та оцінювання статистики використання додатків у середовищі Windows Runtime .

 

Список використаних джерел:

1.              Wikipedia [Електронний ресурс]. – Process Environment Block . – Режим доступу: http://www.en.wikipedia.org/wiki/Process_Environment_Block http :// www . msdn . microsoft . com / en - us / library / ms 123401. aspx

2.              MSDN. The Microsoft developer network library [Електронний ресурс]. – RTL_USER_PROCESS_PARAMETERS structure . – Режим доступу:   http:// www. msdn.microsoft.com/en-us/library/windows/desktop/aa813741( v=vs.85 ). aspx

3.              The Undocumented Functions . [Електронний ресурс]. – RTL_USER_PROCESS_PARAMETERS . – Режим доступу:   http:// www. undocumented.ntinternals.net/UserMode/Structures/RTL_USER_PROCESS_PARAMETERS.html

4.              Friedl Jeffrey E. F. Mastering Regular Expressions . O'Reilly Media ; Third Edition edition ( August 15, 2006). – 544 p.

5.              The Undocumented Functions [Електронний ресурс]. – NtQueryInformationProcess . – Режим доступу:   http:// www. undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/NtQueryInformationProcess.html   http://www.undocumented.ntinternals.net/UserMode/UndocumentedFunctions/NTObjects/ Process /NtQueryInformationProcess.html