Переменные окружения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Переменные окружения

Сообщение GM » 10.10.2004 (Вс) 8:04

Вообщем все узнал о процессах, осталось одно как узнать переменные другого процесса. GetEnvironmentVariable возращает переменные текущего процесса.
الفيجوال بيسك الرابح

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.10.2004 (Вс) 11:33

Никак нельзя узнать переменные другого процесса. Можно свои и системные. Последние в реестре.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 10.10.2004 (Вс) 15:50

Если очень захотеть то можно, для этого придется дамповать память чужого процуесса и в ней искать то, что хочется. Таких утилит у хакеров много, а вот зачем они "честному" программисту?
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 11.10.2004 (Пн) 7:51

GSerg писал(а):Никак нельзя узнать переменные другого процесса. Можно свои и системные. Последние в реестре.
Ну как это делает тот же ФАР, или Process Explorer??
الفيجوال بيسك الرابح

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.10.2004 (Пн) 11:22

При вынесении подобных суждений я руководствуюсь прочитанным в MSDN :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.10.2004 (Пн) 12:13

GetProcessEnvironment :)
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.10.2004 (Пн) 13:58

:roll:
Results for: GetProcessEnvironment

Sorry, no results were found in this category.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.10.2004 (Пн) 15:24

Моя пошутила :)
Можно посмотреть исходники плугинов для FAR, которые отображают информуцию об окружении процесса.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.10.2004 (Пн) 15:54

Типа, ндаа...

А я сейчас вспомнил, что что-то подобное уже делал: http://groups.google.com/groups?selm=34 ... put=gplain

NtQueryInformationProcess возвращает ссылку (PebBaseAddress) на структуру, где кроме всего прочего, лежит адрес блока окружения процесса.

Вот объявление этой структуры (в SDK и DDK её вроде бы нету):
Код: Выделить всё
typedef struct _PEB {
  BOOLEAN                 InheritedAddressSpace;
  BOOLEAN                 ReadImageFileExecOptions;
  BOOLEAN                 BeingDebugged;
  BOOLEAN                 Spare;
  HANDLE                  Mutant;
  PVOID                   ImageBaseAddress;
  PPEB_LDR_DATA           LoaderData;
  PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
  PVOID                   SubSystemData;
  PVOID                   ProcessHeap;
  PVOID                   FastPebLock;
  PPEBLOCKROUTINE         FastPebLockRoutine;
  PPEBLOCKROUTINE         FastPebUnlockRoutine;
  ULONG                   EnvironmentUpdateCount;
  PPVOID                  KernelCallbackTable;
  PVOID                   EventLogSection;
  PVOID                   EventLog;
  PPEB_FREE_BLOCK         FreeList;
  ULONG                   TlsExpansionCounter;
  PVOID                   TlsBitmap;
  ULONG                   TlsBitmapBits[0x2];
  PVOID                   ReadOnlySharedMemoryBase;
  PVOID                   ReadOnlySharedMemoryHeap;
  PPVOID                  ReadOnlyStaticServerData;
  PVOID                   AnsiCodePageData;
  PVOID                   OemCodePageData;
  PVOID                   UnicodeCaseTableData;
  ULONG                   NumberOfProcessors;
  ULONG                   NtGlobalFlag;
  BYTE                    Spare2[0x4];
  LARGE_INTEGER           CriticalSectionTimeout;
  ULONG                   HeapSegmentReserve;
  ULONG                   HeapSegmentCommit;
  ULONG                   HeapDeCommitTotalFreeThreshold;
  ULONG                   HeapDeCommitFreeBlockThreshold;
  ULONG                   NumberOfHeaps;
  ULONG                   MaximumNumberOfHeaps;
  PPVOID                  *ProcessHeaps;
  PVOID                   GdiSharedHandleTable;
  PVOID                   ProcessStarterHelper;
  PVOID                   GdiDCAttributeList;
  PVOID                   LoaderLock;
  ULONG                   OSMajorVersion;
  ULONG                   OSMinorVersion;
  ULONG                   OSBuildNumber;
  ULONG                   OSPlatformId;
  ULONG                   ImageSubSystem;
  ULONG                   ImageSubSystemMajorVersion;
  ULONG                   ImageSubSystemMinorVersion;
  ULONG                   GdiHandleBuffer[0x22];
  ULONG                   PostProcessInitRoutine;
  ULONG                   TlsExpansionBitmap;
  BYTE                    TlsExpansionBitmapBits[0x80];
  ULONG                   SessionId;

} PEB, *PPEB;


ProcessParameters указывает вот на эту структуру:
Код: Выделить всё
typedef struct _RTL_USER_PROCESS_PARAMETERS {
  ULONG                   MaximumLength;
  ULONG                   Length;
  ULONG                   Flags;
  ULONG                   DebugFlags;
  PVOID                   ConsoleHandle;
  ULONG                   ConsoleFlags;
  HANDLE                  StdInputHandle;
  HANDLE                  StdOutputHandle;
  HANDLE                  StdErrorHandle;
  UNICODE_STRING          CurrentDirectoryPath;
  HANDLE                  CurrentDirectoryHandle;
  UNICODE_STRING          DllPath;
  UNICODE_STRING          ImagePathName;
  UNICODE_STRING          CommandLine;
  PVOID                   Environment;
  ULONG                   StartingPositionLeft;
  ULONG                   StartingPositionTop;
  ULONG                   Width;
  ULONG                   Height;
  ULONG                   CharWidth;
  ULONG                   CharHeight;
  ULONG                   ConsoleTextAttributes;
  ULONG                   WindowFlags;
  ULONG                   ShowWindowFlags;
  UNICODE_STRING          WindowTitle;
  UNICODE_STRING          DesktopName;
  UNICODE_STRING          ShellInfo;
  UNICODE_STRING          RuntimeData;
  RTL_DRIVE_LETTER_CURDIR DLCurrentDirectory[0x20];



} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;


А вот в ней Environment указывает уже на то, что нам так нужно :-)


Ещё одно интересное примечание:
RTL_USER_PROCESS_PARAMETERS is located at address 0x20000 (for all processes created by call WIN32 API CreateProcess).


Всем советую побродить по http://undocumented.ntinternals.net/ - много интересного.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.10.2004 (Пн) 21:37

Вот, короче, рабочий, хотя сырой, пример чтения чужого окружения:
Код: Выделить всё
Option Explicit

Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function NtQueryInformationProcess Lib "ntdll" (ByVal hProcess As Long, ByVal ProcessInformationClass As Long, ProcessInformation As Any, ByVal ProcessInformationLength As Long, ReturnLength As Long) As Long
Private Type PROCESS_BASIC_INFORMATION
    ExitStatus As Long
    PebBaseAddress As Long  'points to a structure too long to declare
    AffinityMask As Long
    BasePriority As Long
    UniqueProcessId As Long
    InheritedFromUniqueProcessId As Long
End Type
Private Type UNICODE_STRING
    Length As Integer
    MaximumLength As Integer
    Buffer As Long
End Type
Private Type RTL_USER_PROCESS_PARAMETERS
    MaximumLength As Long
    Length As Long
    Flags As Long
    DebugFlags As Long
    ConsoleHandle As Long
    ConsoleFlags As Long
    StdInputHandle As Long
    StdOutputHandle As Long
    StdErrorHandle As Long
    CurrentDirectoryPath As UNICODE_STRING
    CurrentDirectoryHandle As Long
    DllPath As UNICODE_STRING
    ImagePathName As UNICODE_STRING
    CommandLine As UNICODE_STRING
    Environment As Long
    StartingPositionLeft As Long
    StartingPositionTop As Long
    Width As Long
    Height As Long
    CharWidth As Long
    CharHeight As Long
    ConsoleTextAttributes As Long
    WindowFlags As Long
    ShowWindowFlags As Long
    WindowTitle As UNICODE_STRING
    DesktopName As UNICODE_STRING
    ShellInfo As UNICODE_STRING
    RuntimeData As UNICODE_STRING
    DLCurrentDirectory(1 To &H200) As Byte
End Type
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const PROCESS_VM_READ = &H10

Private Sub Main()
Dim hWnd As Long, PID As Long, hProcess As Long
Dim pbi As PROCESS_BASIC_INFORMATION, dummy As Long
Dim ProcessParameters As Long, upp As RTL_USER_PROCESS_PARAMETERS
Dim EnvironmentStrings As String

hWnd = &H1B06C4     'hardcoded
If hWnd = 0 Then Exit Sub
GetWindowThreadProcessId hWnd, PID
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, PID)
If hProcess = 0 Then Exit Sub
NtQueryInformationProcess hProcess, 0, pbi, Len(pbi), dummy
ReadProcessMemory hProcess, pbi.PebBaseAddress + 16, ProcessParameters, 4, dummy
ReadProcessMemory hProcess, ProcessParameters, upp, LenB(upp), dummy
EnvironmentStrings = String(65536, 0)
ReadProcessMemory hProcess, upp.Environment, ByVal StrPtr(EnvironmentStrings), 4096, dummy
CloseHandle hProcess

Dim v As Variant
For Each v In Split(EnvironmentStrings, vbNullChar)
    If Len(v) Then Debug.Print v
Next
End Sub


Перед запуском надо задать правильный hWnd (ищется шпионом).
Размер читаемой области тоже надо подгонять вручную, если слишком мало - не всё прочитается, если слишком много - не прочитается вообще ничего :-)
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 12.10.2004 (Вт) 7:13

Спасибо tyomitch сейчас попробую.
الفيجوال بيسك الرابح

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 19.10.2004 (Вт) 7:45

2 tyomitch, я смотрю в объявлении функции есть ImagePathName, DesktopName и все они как UNICODE_STRING. Можно ли их перевести в обычный String?
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.10.2004 (Вт) 17:43

Можно - точно так же, как в примере с EnvironmentStrings.
Объявляешь строку, заполняешь до нужной длины, копируешь данные через ReadProcessMemory.
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14

    TopList  
cron