Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Получить командную строку процесса в x64 [D7]


P   (07.04.11 22:44

Здравствуйте

Подскажите как получить командную строку процесса в Windows 7 x64?


P   (07.04.11 22:45[1]

P.S.

Для 64 битных процессов конечно


Rouse_ ©   (07.04.11 23:00[2]

Также ка и для 32 битных, вроде...


P   (07.04.11 23:10[3]


> Rouse_ ©   (07.04.11 23:00) [2]


Нет в x64 адрес другой, тока как получить это смещение никак не въеду


Rouse_ ©   (07.04.11 23:34[4]

Не понял, какой адрес? :) Нукась покажи код...


P   (07.04.11 23:52[5]


> Rouse_ ©   (07.04.11 23:34) [4]


Нет под рукой Delphi

Вроде нашел

* PEB data structure
*/
typedef struct _PEB
{                                                                 /* win32/win64 */
   BOOLEAN                      InheritedAddressSpace;             /* 000/000 */
   BOOLEAN                      ReadImageFileExecOptions;          /* 001/001 */
   BOOLEAN                      BeingDebugged;                     /* 002/002 */
   BOOLEAN                      SpareBool;                         /* 003/003 */
   HANDLE                       Mutant;                            /* 004/008 */
   HMODULE                      ImageBaseAddress;                  /* 008/010 */
   PPEB_LDR_DATA                LdrData;                           /* 00c/018 */
   RTL_USER_PROCESS_PARAMETERS *ProcessParameters;                 /* 010/020 */


ftp://ftp.zsmtu.ru/pub/Distr/Linux/wine-1.1.33/include/winternl.h


Дмитрий   (30.05.11 23:16[6]

Вы нашли решение? Не могли бы его опубликовать? А то уже долго мучаюсь с этой темой (


Valentin ©   (08.07.11 07:18[7]

А функцию API GetCommandLine нельзя использовать? под х64 возвращает длинный (64-битный) указатель на командную строку. Правда, разбивку на параметры придется вручную отработать или для этого написать оберточную функцию. Но если нет других способов, то на крайняк есть этот способ .


Valentin ©   (08.07.11 07:32[8]

по приведенной ссылке


> ftp://ftp.zsmtu.ru/pub/Distr/Linux/wine-1.1.33/include/winternl.
> h


typedef struct _RTL_USER_PROCESS_PARAMETERS
{
   ULONG               AllocationSize;
   ULONG               Size;
   ULONG               Flags;
   .......  
   UNICODE_STRING      ImagePathName;
   UNICODE_STRING      CommandLine;
   PWSTR               Environment;
   ........    
   RTL_DRIVE_LETTER_CURDIR DLCurrentDirectory[0x20];
} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;


P   (16.09.11 11:07[9]


> Дмитрий   (30.05.11 23:16) [6]


Из под Delphi 7 можно попробовать NtWow64QueryInformationProcess64, NtWow64ReadVirtualMemory64

что то типа этого

type
 NTSTATUS = Integer;

 PROCESS_BASIC_INFORMATION = packed record
   Reserved1: UINT64;
   PebBaseAddress: UINT64;
   Reserved2: array [0 .. 1] of UINT64;
   UniqueProcessId: UINT64;
   Reserved3: UINT64;
 end;

 PPROCESS_BASIC_INFORMATION = ^PROCESS_BASIC_INFORMATION;

 TNtQueryInformationProcess = function(ProcessHandle: THANDLE; ProcessInformationClass: ULONG; ProcessInformation: Pointer; ProcessInformationLength: ULONG; ReturnLength: Pointer): NTSTATUS; stdcall;
 TNtReadVirtualMemory = function(ProcessHandle: THANDLE; BaseAddress: UINT64; Buffer: Pointer; BufferLength: UINT64; ReturnLength: Pointer): NTSTATUS; stdcall;

var
 NtQueryInformationProcess: TNtQueryInformationProcess;
 NtReadVirtualMemory: TNtReadVirtualMemory;

function AddCurrentProcessPrivilege(PrivilegeName: WideString): Boolean;
var
 TokenHandle: THandle;
 TokenPrivileges: TTokenPrivileges;
 ReturnLength: Cardinal;
begin
 Result := False;
 if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle) then
 begin
   try
     LookupPrivilegeValueW(nil, PWideChar(PrivilegeName), TokenPrivileges.Privileges[0].Luid);
     TokenPrivileges.PrivilegeCount := 1;
     TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     if AdjustTokenPrivileges(TokenHandle, False, TokenPrivileges, 0, nil, ReturnLength) then
       Result := True;
   finally
     CloseHandle(TokenHandle);
   end;
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 hLibrary: HMODULE;
 ProcessHandle: THandle;
 PBI: PROCESS_BASIC_INFORMATION;
 ReturnLength: UINT64;
 i: ULONG;
 Buffer: UINT64;
 Data: array [0 .. 666] of Byte;
begin
 AddCurrentProcessPrivilege('SeDebugPrivilege');

 hLibrary := LoadLibrary('ntdll.dll');
 if hLibrary <> 0 then
 begin
     @NtQueryInformationProcess := GetProcAddress(hLibrary, 'NtWow64QueryInformationProcess64');
     @NtReadVirtualMemory := GetProcAddress(hLibrary, 'NtWow64ReadVirtualMemory64');
 end;

 ProcessHandle:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, True, 4040);

 if NtQueryInformationProcess(ProcessHandle, 0, @PBI, SizeOf(PBI), nil) = 0 then
 begin
   if NtReadVirtualMemory(ProcessHandle, PBI.PebBaseAddress + $20, @Buffer, SizeOf(Buffer), @ReturnLength) = 0 then
   begin
     if NtReadVirtualMemory(ProcessHandle, Buffer + $78, @Buffer, SizeOf(Buffer), @ReturnLength) = 0 then
     begin
       if NtReadVirtualMemory(ProcessHandle, Buffer, @Data, SizeOf(Data), @ReturnLength) = 0 then
       begin
         for i := 0 to 666 do
          Form1.Memo1.Text := Form1.Memo1.Text + (Char(Data[i]));
       end;
     end;
   end;
 end;
end;


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо