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

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

ru
Offline Offline

« : 19-10-2004 05:54 » 

Тут такая проблема. Я определяю имя текущего процесса

Код:
NTSTATUS NTAPI GetProcessName (PCHAR Buffer, ULONG SizeBuffer){

PROCESS_BASIC_INFORMATION ProcInfo;
ULONG Size;
PPEB pPeb;
PPROCESS_PARAMETERS pProcParam;

if (Buffer == NULL) return STATUS_ERROR;
memset (Buffer, 0, SizeBuffer);
strcpy (Buffer, "???");

if ( ZwQueryInformationProcess  (NtCurrentProcess(), ProcessBasicInformation, &ProcInfo,
                                     sizeof(PROCESS_BASIC_INFORMATION), &Size) == STATUS_SUCCESS){

        if ((pPeb = (PEB *)ProcInfo.PebBaseAddress) != NULL){
            pProcParam = pPeb->ProcessParameters;
            if (pProcParam){
                memset(Buffer, 0, SizeBuffer);
                sprintf (Buffer, "%S", pProcParam->ApplicationName.Buffer);
                return STATUS_SUCCESS;
            }
        }
    }

    return STATUS_ERROR;
}


Имя помещается в буфер. SoftIce показывает, что он заполняется и заполняется правильно.

Но когда я его пытаюсь вывести в файл, то выводится "Не понял"
В чем может быть проблемма ?

З.Ы. Посоветовали использовать не ZwQueryInformationProcess, а

Код:
PEPROCESS PsGetCurrentProcess( );

Но почему-то из _EPROCESS не получается получить указатель на Peb, хотя описание _EPROCESS
Код:
typedef struct _EPROCESS{
    ...
    struct _PEB  *Peb;
    ...
}

Компилятор ругается
Цитата
error C2037: left of 'Peb' specifies undefined struct/union '_EPROCESS'

Может у кого есть описание EPROCESS (и вообще структур) для WinXP

Спасибо
« Последнее редактирование: 02-12-2007 14:54 от Алексей1153++ » Записан
zss
Участник

ru
Offline Offline

« Ответ #1 : 21-10-2004 12:22 » 

Нашел в чем проблемма Улыбаюсь

В атрибутах объекта надо было указать флаг OBJ_KERNEL_HANDLE, чтоб можно было имень к нему доступ в контексте любого процесса.
Надо внимательнее читать статьи

P.S. Только не у всех процессов получается вытащить имя  - почему ?
Как избавиться от этого бага ?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 22-10-2004 14:34 » 

Цитата

Может у кого есть описание EPROCESS (и вообще структур) для WinXP

P.S. Только не у всех процессов получается вытащить имя - почему ?
Как избавиться от этого бага ?

Описание EPROCESS и других структур легко получить из дебагера, если стоят отладочные символы, вот так
Код:
kd> dt nt!_EPROCESS 

как пример вот с моего компа
kd> dt nt!_EPROCESS
   +0x000 Pcb              : _KPROCESS
   +0x06c ProcessLock      : _EX_PUSH_LOCK
   +0x070 CreateTime       : _LARGE_INTEGER
   +0x078 ExitTime         : _LARGE_INTEGER
   +0x080 RundownProtect   : _EX_RUNDOWN_REF
   +0x084 UniqueProcessId  : Ptr32 Void
   +0x088 ActiveProcessLinks : _LIST_ENTRY
   +0x090 QuotaUsage       : [3] Uint4B
   +0x09c QuotaPeak        : [3] Uint4B
   +0x0a8 CommitCharge     : Uint4B
   +0x0ac PeakVirtualSize  : Uint4B
   +0x0b0 VirtualSize      : Uint4B
   +0x0b4 SessionProcessLinks : _LIST_ENTRY
   +0x0bc DebugPort        : Ptr32 Void
   +0x0c0 ExceptionPort    : Ptr32 Void
   +0x0c4 ObjectTable      : Ptr32 _HANDLE_TABLE
   +0x0c8 Token            : _EX_FAST_REF
   +0x0cc WorkingSetLock   : _FAST_MUTEX
   +0x0ec WorkingSetPage   : Uint4B
   +0x0f0 AddressCreationLock : _FAST_MUTEX
   +0x110 HyperSpaceLock   : Uint4B
   +0x114 ForkInProgress   : Ptr32 _ETHREAD
   +0x118 HardwareTrigger  : Uint4B
   +0x11c VadRoot          : Ptr32 Void
   +0x120 VadHint          : Ptr32 Void
   +0x124 CloneRoot        : Ptr32 Void
   +0x128 NumberOfPrivatePages : Uint4B
   +0x12c NumberOfLockedPages : Uint4B
   +0x130 Win32Process     : Ptr32 Void
   +0x134 Job              : Ptr32 _EJOB
   +0x138 SectionObject    : Ptr32 Void
   +0x13c SectionBaseAddress : Ptr32 Void
   +0x140 QuotaBlock       : Ptr32 _EPROCESS_QUOTA_BLOCK
   +0x144 WorkingSetWatch  : Ptr32 _PAGEFAULT_HISTORY
   +0x148 Win32WindowStation : Ptr32 Void
   +0x14c InheritedFromUniqueProcessId : Ptr32 Void
   +0x150 LdtInformation   : Ptr32 Void
   +0x154 VadFreeHint      : Ptr32 Void
   +0x158 VdmObjects       : Ptr32 Void
   +0x15c DeviceMap        : Ptr32 Void
   +0x160 PhysicalVadList  : _LIST_ENTRY
   +0x168 PageDirectoryPte : _HARDWARE_PTE
   +0x168 Filler           : Uint8B
   +0x170 Session          : Ptr32 Void
   +0x174 ImageFileName    : [16] UChar
   +0x184 JobLinks         : _LIST_ENTRY
   +0x18c LockedPagesList  : Ptr32 Void
   +0x190 ThreadListHead   : _LIST_ENTRY
   +0x198 SecurityPort     : Ptr32 Void
   +0x19c PaeTop           : Ptr32 Void
   +0x1a0 ActiveThreads    : Uint4B
   +0x1a4 GrantedAccess    : Uint4B
   +0x1a8 DefaultHardErrorProcessing : Uint4B
   +0x1ac LastThreadExitStatus : Int4B
   +0x1b0 Peb              : Ptr32 _PEB
   +0x1b4 PrefetchTrace    : _EX_FAST_REF
   +0x1b8 ReadOperationCount : _LARGE_INTEGER
   +0x1c0 WriteOperationCount : _LARGE_INTEGER
   +0x1c8 OtherOperationCount : _LARGE_INTEGER
   +0x1d0 ReadTransferCount : _LARGE_INTEGER
   +0x1d8 WriteTransferCount : _LARGE_INTEGER
   +0x1e0 OtherTransferCount : _LARGE_INTEGER
   +0x1e8 CommitChargeLimit : Uint4B
   +0x1ec CommitChargePeak : Uint4B
   +0x1f0 AweInfo          : Ptr32 Void
   +0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
   +0x1f8 Vm               : _MMSUPPORT
   +0x238 LastFaultCount   : Uint4B
   +0x23c ModifiedPageCount : Uint4B
   +0x240 NumberOfVads     : Uint4B
   +0x244 JobStatus        : Uint4B
   +0x248 Flags            : Uint4B
   +0x248 CreateReported   : Pos 0, 1 Bit
   +0x248 NoDebugInherit   : Pos 1, 1 Bit
   +0x248 ProcessExiting   : Pos 2, 1 Bit
   +0x248 ProcessDelete    : Pos 3, 1 Bit
   +0x248 Wow64SplitPages  : Pos 4, 1 Bit
   +0x248 VmDeleted        : Pos 5, 1 Bit
   +0x248 OutswapEnabled   : Pos 6, 1 Bit
   +0x248 Outswapped       : Pos 7, 1 Bit
   +0x248 ForkFailed       : Pos 8, 1 Bit
   +0x248 HasPhysicalVad   : Pos 9, 1 Bit
   +0x248 AddressSpaceInitialized : Pos 10, 2 Bits
   +0x248 SetTimerResolution : Pos 12, 1 Bit
   +0x248 BreakOnTermination : Pos 13, 1 Bit
   +0x248 SessionCreationUnderway : Pos 14, 1 Bit
   +0x248 WriteWatch       : Pos 15, 1 Bit
   +0x248 ProcessInSession : Pos 16, 1 Bit
   +0x248 OverrideAddressSpace : Pos 17, 1 Bit
   +0x248 HasAddressSpace  : Pos 18, 1 Bit
   +0x248 LaunchPrefetched : Pos 19, 1 Bit
   +0x248 InjectInpageErrors : Pos 20, 1 Bit
   +0x248 Unused           : Pos 21, 11 Bits
   +0x24c ExitStatus       : Int4B
   +0x250 NextPageColor    : Uint2B
   +0x252 SubSystemMinorVersion : UChar
   +0x253 SubSystemMajorVersion : UChar
   +0x252 SubSystemVersion : Uint2B
   +0x254 PriorityClass    : UChar
   +0x255 WorkingSetAcquiredUnsafe : UChar


По второму вопросу- брать из PEB не надо, во первых у системных потоков его нет, во вторых он в юзермодовском адресном пространстве, которое валидно только в контексте текущего процесса и может быть изменено юзерским кодом. Наиболее реальный способ получить имя процесса- взять SECTION_OBJECT для исполняемого файла, указатель на объект секция или хендл этого объекта есть в EPROCESS, и взять FILE_OBJECT оттуда, а через FILE_OBJECT получить имя.
Код:
EPROCESS->SectionObject->Segment->ControlArea->FileObject
« Последнее редактирование: 02-12-2007 14:56 от Алексей1153++ » Записан
zss
Участник

ru
Offline Offline

« Ответ #3 : 23-10-2004 18:22 » 

SlavaI, я вытащил структуры из ntoskrnl.pdb

к примеру
Код:
typedef struct _SECTION_OBJECT {
PVOID StartingVa;
PVOID EndingVa;
PVOID Parent;
PVOID LeftChild;
PVOID RightChild;
struct _SEGMENT_OBJECT* Segment;
}SECTION_OBJECT, *PSECTION_OBJECT, **PPSECTION_OBJECT;

Но почему-то Segment нулевой - почему ?
« Последнее редактирование: 02-12-2007 15:02 от Алексей1153++ » Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #4 : 25-10-2004 10:08 » 

Цитата

Но почему-то Segment нулевой - почему ?


Скорее всего не туда смотришь, должен быть ненулевой.
Записан
zss
Участник

ru
Offline Offline

« Ответ #5 : 25-10-2004 10:29 » 

Странно - вот основные структуры из ntoskrnl.pdb

Код:
typedef struct _SEGMENT_OBJECT {
PVOID BaseAddress;
ULONG TotalNumberOfPtes;
union _LARGE_INTEGER SizeOfSegment;
ULONG NonExtendedPtes;
ULONG ImageCommitment;
struct _CONTROL_AREA* ControlArea;
struct _SUBSECTION* Subsection;
struct _LARGE_CONTROL_AREA* LargeControlArea;
struct _MMSECTION_FLAGS* MmSectionFlags;
struct _MMSUBSECTION_FLAGS* MmSubSectionFlags;
}SEGMENT_OBJECT, *PSEGMENT_OBJECT, **PPSEGMENT_OBJECT;

typedef struct _SECTION_OBJECT {
PVOID StartingVa;
PVOID EndingVa;
PVOID Parent;
PVOID LeftChild;
PVOID RightChild;
struct _SEGMENT_OBJECT* Segment;
}SECTION_OBJECT, *PSECTION_OBJECT, **PPSECTION_OBJECT;

typedef struct _CONTROL_AREA {
struct _SEGMENT* Segment;
struct _LIST_ENTRY DereferenceList;
ULONG NumberOfSectionReferences;
ULONG NumberOfPfnReferences;
ULONG NumberOfMappedViews;
USHORT NumberOfSubsections;
USHORT FlushInProgressCount;
ULONG NumberOfUserReferences;
union __unnamed_b_ u;
struct _FILE_OBJECT* FilePointer;
struct _EVENT_COUNTER* WaitingForDeletion;
USHORT ModifiedWriteCount;
USHORT NumberOfSystemCacheViews;
}CONTROL_AREA, *PCONTROL_AREA, **PPCONTROL_AREA;

typedef struct _EPROCESS {
struct _KPROCESS Pcb;
struct _EX_PUSH_LOCK ProcessLock;
union _LARGE_INTEGER CreateTime;
union _LARGE_INTEGER ExitTime;
struct _EX_RUNDOWN_REF RundownProtect;
PVOID UniqueProcessId;
struct _LIST_ENTRY ActiveProcessLinks;
ULONG QuotaUsage[3];
ULONG QuotaPeak[3];
ULONG CommitCharge;
ULONG PeakVirtualSize;
ULONG VirtualSize;
struct _LIST_ENTRY SessionProcessLinks;
PVOID DebugPort;
PVOID ExceptionPort;
struct _HANDLE_TABLE* ObjectTable;
struct _EX_FAST_REF Token;
struct _FAST_MUTEX WorkingSetLock;
ULONG WorkingSetPage;
struct _FAST_MUTEX AddressCreationLock;
ULONG HyperSpaceLock;
struct _ETHREAD* ForkInProgress;
ULONG HardwareTrigger;
PVOID VadRoot;
PVOID VadHint;
PVOID CloneRoot;
ULONG NumberOfPrivatePages;
ULONG NumberOfLockedPages;
PVOID Win32Process;
struct _EJOB* Job;
PVOID SectionObject;
PVOID SectionBaseAddress;
struct _EPROCESS_QUOTA_BLOCK* QuotaBlock;
struct _PAGEFAULT_HISTORY* WorkingSetWatch;
PVOID Win32WindowStation;
PVOID InheritedFromUniqueProcessId;
PVOID LdtInformation;
PVOID VadFreeHint;
PVOID VdmObjects;
PVOID DeviceMap;
struct _LIST_ENTRY PhysicalVadList;
struct _HARDWARE_PTE PageDirectoryPte;
unsigned __int64 Filler;
PVOID Session;
BYTE ImageFileName[16];
struct _LIST_ENTRY JobLinks;
PVOID LockedPagesList;
struct _LIST_ENTRY ThreadListHead;
PVOID SecurityPort;
PVOID PaeTop;
ULONG ActiveThreads;
ULONG GrantedAccess;
ULONG DefaultHardErrorProcessing;
LONG LastThreadExitStatus;
struct _PEB* Peb;
struct _EX_FAST_REF PrefetchTrace;
union _LARGE_INTEGER ReadOperationCount;
union _LARGE_INTEGER WriteOperationCount;
union _LARGE_INTEGER OtherOperationCount;
union _LARGE_INTEGER ReadTransferCount;
union _LARGE_INTEGER WriteTransferCount;
union _LARGE_INTEGER OtherTransferCount;
ULONG CommitChargeLimit;
ULONG CommitChargePeak;
PVOID AweInfo;
struct _SE_AUDIT_PROCESS_CREATION_INFO SeAuditProcessCreationInfo;
struct _MMSUPPORT Vm;
ULONG LastFaultCount;
ULONG ModifiedPageCount;
ULONG NumberOfVads;
ULONG JobStatus;
ULONG Flags;
ULONG CreateReported :1;
ULONG NoDebugInherit :1;
ULONG ProcessExiting :1;
ULONG ProcessDelete :1;
ULONG Wow64SplitPages :1;
ULONG VmDeleted :1;
ULONG OutswapEnabled :1;
ULONG Outswapped :1;
ULONG ForkFailed :1;
ULONG HasPhysicalVad :1;
ULONG AddressSpaceInitialized :2;
ULONG SetTimerResolution :1;
ULONG BreakOnTermination :1;
ULONG SessionCreationUnderway :1;
ULONG WriteWatch :1;
ULONG ProcessInSession :1;
ULONG OverrideAddressSpace :1;
ULONG HasAddressSpace :1;
ULONG LaunchPrefetched :1;
ULONG InjectInpageErrors :1;
ULONG Unused :11;
LONG ExitStatus;
USHORT NextPageColor;
BYTE SubSystemMinorVersion;
BYTE SubSystemMajorVersion;
USHORT SubSystemVersion;
BYTE PriorityClass;
BYTE WorkingSetAcquiredUnsafe;
}EPROCESS, *PEPROCESS, **PPEPROCESS;

Смотрю также как ты и говорил
PEPROCESS->SectionObject->Segment->ControlArea->FilePointer;

Кстати в исходниках RegMon Руссинович использует

Код:
ULONG GetProcessNameOffset()
{
    PEPROCESS       curproc;
    int             i;

    curproc = PsGetCurrentProcess();

    //
    // Scan for 12KB, hopping the KPEB never grows that big!
    //
    for( i = 0; i < 3*PAGE_SIZE; i++ ) {
     
         if( !strncmp( SYSNAME, (PCHAR) curproc + i, strlen(SYSNAME) )) {

              return i;
         }
    }

    //
    // Name not found - oh, well
    //
    return 0;
}



//----------------------------------------------------------------------
//
// GetProcess
//
// Uses undocumented data structure offsets to obtain the name of the
// currently executing process.
//
//----------------------------------------------------------------------
PCHAR GetProcess( PCHAR Name )
{
    PEPROCESS       curproc;
    char            *nameptr;
    ULONG           i;

    //
    // We only try and get the name if we located the name offset
    //
    if( ProcessNameOffset ) {
   
         curproc = PsGetCurrentProcess();
         nameptr   = (PCHAR) curproc + ProcessNameOffset;
         strncpy( Name, nameptr, 16 );

    } else {
     
         strcpy( Name, "???");
    }
}


Так тоже можно или это чревато ?
« Последнее редактирование: 02-12-2007 15:08 от Алексей1153++ » Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #6 : 25-10-2004 13:40 » new

Цитата

Так тоже можно или это чревато ?


Чревато и имя там короткое- там только 16 байт под имя отведено, полное имя только так ка я сказал.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines