По тому что нагуглил попробывал код написать,в котором ищется информация по PEB в вирт. АП(пока только в своем). В связи с этим возникли вопросы 1.С каждым разом адрес этой стуктуры меняется(7FFDFxxx).Причем только последнии 3 символа в цифре.Почему? 2.В RTL_USER_PROCESS_PARAMETERS.CommandLine и ImagePathName,одно и то же.Только в 1м оно с кавычками а во 2м без.Так и должно быть? 3.Почему то работает не всегда и везде.Иногда в PEB.RTL_USER_PROCESS_PARAMETERS находится какая то левая пурга. Код (Text): typedef struct _LSA_UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING; typedef struct _PEB_LDR_DATA { BYTE Reserved1[8]; PVOID Reserved2[3]; LIST_ENTRY InMemoryOrderModuleList; } PEB_LDR_DATA, *PPEB_LDR_DATA; 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; typedef struct _PEB { BYTE Reserved1[2]; BYTE BeingDebugged; BYTE Reserved2[1]; PVOID Reserved3[2]; PPEB_LDR_DATA Ldr; PRTL_USER_PROCESS_PARAMETERS ProcessParameters; BYTE Reserved4[104]; PVOID Reserved5[52]; /* PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;*/ BYTE Reserved6[128]; PVOID Reserved7[1]; ULONG SessionId; } PEB, *PPEB; struct PROCESS_BASIC_INFORMATION { PVOID Reserved1; PPEB PebBaseAddress; PVOID Reserved2[2]; ULONG_PTR UniqueProcessId; PVOID Reserved3; }; typedef NTSTATUS (NTAPI *ZWQUERYINFORMATIONPROCESS)(HANDLE, ULONG, PVOID, ULONG, PULONG); int _tmain(int argc, _TCHAR* argv[]) { HMODULE nt=LoadLibraryA("Ntdll.dll"); PROCESS_BASIC_INFORMATION pbi={0}; ZWQUERYINFORMATIONPROCESS _ZwQueryInformationProcess; _ZwQueryInformationProcess = (ZWQUERYINFORMATIONPROCESS)GetProcAddress(nt, "ZwQueryInformationProcess"); DWORD rlg=0; _ZwQueryInformationProcess(GetCurrentProcess(),0,&pbi,sizeof(pbi),&rlg); PEB *peb={0}; printf("PEB: %X\n",pbi.PebBaseAddress); peb=((PEB*)pbi.PebBaseAddress); RTL_USER_PROCESS_PARAMETERS *up; up=( (RTL_USER_PROCESS_PARAMETERS *) peb->ProcessParameters); char buf[1024]; CharToOem(up->CommandLine.Buffer,buf); printf("CommandLine: %s\n",buf); memset(buf,NULL,1024); CharToOem(up->ImagePathName.Buffer,buf); printf("ImagePathName: %s\n",buf); FreeLibrary(nt); getch(); return 0; }
1. ASLR in action 2. Попробуйте запустить с параметрами командной строки, думаю разница будет очевидна
>> А как можно узнать или где то посмотреть,работа каких ф-ций зависит от этих структур? От каких, от RTL_USER_PROCESS_PARAMETERS? Ну например GetStdHandle нужна отттуда инфа (StandardInput/StandardOutput), Environment тоже юзается функциями работы с переменными окружения и тд. Код (Text): ntdll!_RTL_USER_PROCESS_PARAMETERS +0x000 MaximumLength : Uint4B +0x004 Length : Uint4B +0x008 Flags : Uint4B +0x00c DebugFlags : Uint4B +0x010 ConsoleHandle : Ptr64 Void +0x018 ConsoleFlags : Uint4B +0x020 StandardInput : Ptr64 Void +0x028 StandardOutput : Ptr64 Void +0x030 StandardError : Ptr64 Void +0x038 CurrentDirectory : _CURDIR +0x050 DllPath : _UNICODE_STRING +0x060 ImagePathName : _UNICODE_STRING +0x070 CommandLine : _UNICODE_STRING +0x080 Environment : Ptr64 Void +0x088 StartingX : Uint4B ... Это для примера. А вообще смотрите сорс винды, поиск по нужной структуре