Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как узнать командную строку приложения в обработчике PsSetLoadImageNotifyRoutine  (Прочитано 15088 раз)
0 Пользователей и 1 Гость смотрят эту тему.
l_sunny
Участник

ru
Offline Offline

« : 13-04-2010 04:29 » 

При создании процесса в обработчике PsSetLoadImageNotifyRoutine() требуется узнать имя процесса вместе с параметрами командной строки.
Пробовал смотреть в структуре PPEB Peb, но видимо процесс ещё не до конца создался и в поле Peb->ProcessParameters->CommandLine.Buffer находится не адрес, а какое-то маленькое число, например 0x658.
А в Peb->ProcessParameters->CommandLine.Length и Peb->ProcessParameters->CommandLine.MaximumLength нормальные значения.
Может есть какие-то другие способы.
Записан
l_sunny
Участник

ru
Offline Offline

« Ответ #1 : 13-04-2010 05:40 » 

Сам догадался. Оказывается в Peb->ProcessParameters->CommandLine.Buffer лежит не адрес командной строки, а смещение на неё относительно Peb->ProcessParameters. Вот паразиты в микрософте сидят, не могут переменную по назначению использовать, два дня на них убил.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 13-04-2010 08:21 » 

кстати а в каком файле она определена? что то я у себя ее найти не могу...
http://msdn.microsoft.com/en-us/library/aa813741(VS.85).aspx - глянул, но...
Microsoft Visual Studio 8\VC\PlatformSDK\Include\winternl.h - там ее нет А черт его знает...
или в полном SDK?
да и PEB у меня определена там как
Код:
//
// The PEB and TEB structures are subject to changes between Windows
// releases, thus the fields offsets may change as well as the Reserved
// fields.  The Reserved fields are reserved for use only by the Windows
// operating systems.  Do not assume a maximum size for the structures.
//

//
// Instead of using the BeingDebugged field, use the Win32 APIs
//     IsDebuggerPresent, CheckRemoteDebuggerPresent
// Instead of using the SessionId field, use the Win32 APIs
//     GetCurrentProcessId and ProcessIdToSessionId
// Sample x86 assembly code that gets the SessionId (subject to change
//     between Windows releases, use the Win32 APIs to make your application
//     resilient to changes)
//     mov     eax,fs:[00000018]
//     mov     eax,[eax+0x30]
//     mov     eax,[eax+0x1d4]
//
typedef struct _PEB {
    BYTE Reserved1[2];
    BYTE BeingDebugged;
    BYTE Reserved2[229];
    PVOID Reserved3[59];
    ULONG SessionId;
} PEB, *PPEB;
« Последнее редактирование: 13-04-2010 08:24 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
l_sunny
Участник

ru
Offline Offline

« Ответ #3 : 14-04-2010 04:25 » 

Да, эту структуру нужно переопределить, а то все нужные поля запихали в Reserved.
У меня она определена так:
typedef struct _PEB
{
  BYTE                          Reserved1[2];
  BYTE                          BeingDebugged;
  BYTE                          Reserved2[1];
  PVOID                         Reserved3[1];
  PVOID                         ImageBaseAddress;
  PPEB_LDR_DATA                 Ldr;
  PRTL_USER_PROCESS_PARAMETERS  ProcessParameters;
  BYTE                          Reserved4[104];
  PVOID                         Reserved5[52];
  ULONG                         PostProcessInitRoutine;
//  PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
  BYTE                          Reserved6[128];
  PVOID                         Reserved7[1];
  ULONG                         SessionId;
}PEB, *PPEB;

где ProcessParameters:
// http://msdn.microsoft.com/en-us/library/aa813741(VS.85).aspx
typedef struct _RTL_USER_PROCESS_PARAMETERS {
  BYTE           Reserved1[16];
  PVOID          Reserved2[10];
  UNICODE_STRING ImagePathName;
  UNICODE_STRING CommandLine;
}RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 14-04-2010 13:32 » 

https://club.shelek.ru/viewart.php?id=135

Там и PEB'ы и TEB'ы и всё что душе угодно
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 14-04-2010 15:00 » 

да, смущает только
Цитата
typedef struct _SYSTEM_STRINGS
{
   UNICODE_STRING   SystemRoot;       // C:\WINNT
   UNICODE_STRING   System32Root;     // C:\WINNT\System32
   UNICODE_STRING   BaseNamedObjects; // \BaseNamedObjects
}SYSTEM_STRINGS,*PSYSTEM_STRINGS;
и
Цитата
#if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
как вы думаете, в какой версии такие пути были? Ага
не факт, что внутренние структуры остались полностью без изменений...


ЗЫ хотя нашлись строки
Цитата
   SystemPowerInfo,             // 0x0060 (XP only!)
   SystemProcessorSpeedInformation,    // 0x000C (XP only!)



итого сравниваем http://msdn.microsoft.com/en-us/library/aa813741(VS.85).aspx
Код:
typedef struct _RTL_USER_PROCESS_PARAMETERS {
  BYTE           Reserved1[16];
  PVOID          Reserved2[10];
  UNICODE_STRING ImagePathName;
  UNICODE_STRING CommandLine;
} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;

и https://club.shelek.ru/viewart.php?id=135
Код:
typedef struct _PEB
{
UCHAR InheritedAddressSpace; // 0
UCHAR ReadImageFileExecOptions; // 1
UCHAR BeingDebugged; // 2
BYTE b003; // 3
PVOID Mutant; // 4
PVOID ImageBaseAddress; // 8
PPEB_LDR_DATA Ldr; // C
PPROCESS_PARAMETERS ProcessParameters; // 10
PVOID SubSystemData; // 14  
......
......
Код:

typedef struct _PROCESS_PARAMETERS
{
    ULONG MaximumLength;
    ULONG Length;
    ULONG Flags; // PROCESS_PARAMETERS_NORMALIZED
    ULONG DebugFlags;
//==  BYTE           Reserved1[16];
    
    HANDLE ConsoleHandle;
    ULONG ConsoleFlags;
    HANDLE StandardInput;
    HANDLE StandardOutput;
    HANDLE StandardError;

    CURDIR CurrentDirectory; //   +2 DWORD
    UNICODE_STRING DllPath; //   +2 DWORD
    UNICODE_STRING ImagePathName; //==PVOID  Reserved2[10] - где то посередине<<<<<<<<<<<<<<<<<<<
    UNICODE_STRING CommandLine;

    PWSTR Environment;
    ULONG StartingX;
    ULONG StartingY;
    ULONG CountX;
    ULONG CountY;
    ULONG CountCharsX;
    ULONG CountCharsY;
    ULONG FillAttribute;
    ULONG WindowFlags;
    ULONG ShowWindowFlags;
    UNICODE_STRING WindowTitle;
    UNICODE_STRING Desktop;
    UNICODE_STRING ShellInfo;
    UNICODE_STRING RuntimeInfo;
    RTL_DRIVE_LETTER_CURDIR CurrentDirectores[32];
} PROCESS_PARAMETERS, *PPROCESS_PARAMETERS;

и получается у нас полная хрень....
« Последнее редактирование: 14-04-2010 21:31 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 14-04-2010 17:07 » 

PPS
когда майкрософт пишет в документации
[This structure may be altered in future versions of Windows.]
то это означает именно то, что означает.... майкрософт вообще довольно честный товарисч)

l_sunny, может так вышло что вы наткнулись на ImagePathName.MaximumLength,  ImagePathName.Buff который был размещен сразу после _RTL_USER_PROCESS_PARAMETERS? после которого был размещен собственно CommandLine.Buff
« Последнее редактирование: 14-04-2010 17:22 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 14-04-2010 20:54 » 

Ну..... за неимением лучшего. Хотябы так. Мне кстати этот ntdll.h помог не так давно.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 14-04-2010 21:23 » 

я просто к тому, что надо осторожнее такие файлы использовать. или инфу с msdn с такими комментариями)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
l_sunny
Участник

ru
Offline Offline

« Ответ #9 : 16-04-2010 05:45 » 

l_sunny, может так вышло что вы наткнулись на ImagePathName.MaximumLength,  ImagePathName.Buff который был размещен сразу после _RTL_USER_PROCESS_PARAMETERS? после которого был размещен собственно CommandLine.Buff
Случайность тут исключена, ImagePathName.Buff  и CommandLine.Buff содержат значения, на порядок большие длины строки и указывают на разные смещения относительно начала структуры и строки там соответственно разные и соответствуют действительности.
Другое дело это работает в XP, сохранилась ли структура PEB и такой вот способ её использования в новых ОС - мне неизвестно.

Кстать файлик ntdll.h содержит полные структуры, без полей Reserved, спасибо resource.

Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 16-04-2010 05:56 » 

l_sunny, просто у меня размеры структур не сошлись - по этому файлу и по сайту. и смещения CommandLine получились разные. на +4байта. если я не ошибся.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
l_sunny
Участник

ru
Offline Offline

« Ответ #11 : 16-04-2010 07:24 » 

l_sunny, просто у меня размеры структур не сошлись - по этому файлу и по сайту. и смещения CommandLine получились разные. на +4байта. если я не ошибся.
Если смотреть структуру PROCESS_PARAMETERS, то смещения на CommandLine одинаковые, видимо CURDIR недооценили:

Структура в http://msdn.microsoft.com/en-us/library/aa813741(VS.85).aspx:
Код:
typedef struct _RTL_USER_PROCESS_PARAMETERS {
  BYTE           Reserved1[16]; // 0
  PVOID          Reserved2[10]; // 16 (длина=10*4)
  UNICODE_STRING ImagePathName; // 56 (длина UNICODE_STRING=8)
  UNICODE_STRING CommandLine; // 64
} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;


И та же структура в ntdll.h:
Код:

typedef struct _PROCESS_PARAMETERS
{
    ULONG MaximumLength; // 0
    ULONG Length; // 4
    ULONG Flags; // 8
    ULONG DebugFlags; // 16
     
    HANDLE ConsoleHandle; // 20
    ULONG ConsoleFlags; // 24
    HANDLE StandardInput; // 28
    HANDLE StandardOutput; // 32
    HANDLE StandardError; // 36

    CURDIR CurrentDirectory; // 40, (длина= 10 [8(UNICODE_STRING)+4(HANDLE)])
    UNICODE_STRING DllPath; // 48
    UNICODE_STRING ImagePathName; // 56
    UNICODE_STRING CommandLine; // 64
    ...
}

В обоих случаях смещения на CommandLine = 64.

Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 16-04-2010 09:08 » 

Получается то получается. Но то что тут написано - это конечно интересная математика: 8 + 4 = 16 ?
Размер CurrentDirectory: 8 + 4 = 10 ?
40 + 10 = 48 ? Да и 40 + 12 тоже никак не 48.

Ну итоге если правильно посчитать, то 64 всё таки получается
Записан
l_sunny
Участник

ru
Offline Offline

« Ответ #13 : 16-04-2010 10:23 » 

Да, ошибочка вышла, исправляюсь:
Код:
typedef struct _PROCESS_PARAMETERS
{
    ULONG MaximumLength; // 0
    ULONG Length; // 4
    ULONG Flags; // 8
    ULONG DebugFlags; // 12
     
    HANDLE ConsoleHandle; // 16
    ULONG ConsoleFlags; // 20
    HANDLE StandardInput; // 24
    HANDLE StandardOutput; // 28
    HANDLE StandardError; // 32

    CURDIR CurrentDirectory; // 36, (длина= 12 [8(UNICODE_STRING)+4(HANDLE)])
    UNICODE_STRING DllPath; // 48
    UNICODE_STRING ImagePathName; // 56
    UNICODE_STRING CommandLine; // 64
    ...
}
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 16-04-2010 14:51 » 

да. мои извинения, обсчитался.  CURDIR за два слова посчитал вместо трех... Здесь была моя ладья...
если не возражаете тему подчищу... ? Скромно так...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines