_AllocateHeap proc near arg_0 = dword ptr 4 assume fs:nothing mov eax,fs:18h push [esp+arg_0] mov eax,[eax+30h] push 0 push dword ptr [eax+18h] call RtlAllocateHeap retn 4 _AllocateHeap endp Вроди как работает у меня в ХР sp1 eng Скорей хочю знать во всех NT по fs:18h находится ProcessHeap ? Спасибо.
100% гарантии неизменности (всей) структуры PEB наверное никто дать не может, но [PEB+18h] = ProcessHeap во всех NT и даже в 9х (хотя в целом в 9х структура PEB сильно отличается от NT) PS: единственное, чего я не могу понять - почему доступ к PEB осуществляется в винде не напрямую через fs:[30h], а зачем-то сначала получают адрес TEB через fs:[18h], хотя он совпадает с базовым адресом сегмента fs. Может кто знает ?
У меня с английским плохо, но тут http://www.xfocus.net/articles/200504/793.html давольно подробно написано про peb\teb, мож найдёшь ответ там.
Flasher В этой статейке обращение к PEB как раз напрямую идет через fs:[30h]. А вот в самой винде всегда окольным путем через Teb=fs:[18h] - как и в твоем варианте А вот некоторые вещи из статьи устарели - в XP SP2 адреса TEB и PEB не фиксированы, поэтому расчитывать на константы типа 7FFDF000h уже нельзя и основанный на этом метод определения типа ОS (NT или 9x) работать не будет. (Кстати надежнее было бы использовать сравнение с 80000000h - в NT всегда ниже, а в 9х всегда выше)