Здравствуйте. Вот не могу разобраться, может вы подскажите... В общем зада состоит в следующем-изменить адрес текущей кучи(heap). Пробовал изменить через параметры PEB-но не вышло. делал примерно так: char TEST[900]; __asm { lea ecx,TEST mov eax,fs:[30h];;;;;ProcessHeap mov [eax+18h],ecx } но применив после этого оператор new:char *P=new char[40];memset(P,7,40); в самом массиве TEST ничего не изменилось. Подскажите пожалуйста, где ошибочка?
А разве это повлеяет на конечный результат. Я и через структуру делал-результат тот же(( Или есть еще варианты получения адреса PEB? В конечном итоге как бы я не манипулировал PEB ом, адрес кучи у меня все рано не изменился.
Конечная цель выглядит так: из программы загружаю DLL Перед вызовом ее функции я изменяю адрес кучи(что бы при вызове из DLL операторов new память выделялась из кучи отличной от основной для программы). После чего восстанавливаю адрес. В общем цель такитх действий сводиться к тому чтобы защититься от порчи кучи со стороны подгружаемой DLL.
hawk Во-первых, нужное поле находится вовсе не по тому адресу, а по fs:[18h]->[30h]->[18h] (http://wasm.ru/forum/viewtopic.php?id=23318). Во-вторых, по этому адресу находится хэндл кучи, а не адрес буфера. Создать кучу можно с помощью HeapCreate. В дополнение к Rel: Код (Text): TEB *pTeb = NtCurrentTeb(); pPeb = *(DWORD*)((BYTE*)pTeb+0x30); hHeap = *(DWORD*)((BYTE*)pPeb+0x18);
hawk Сделать так, как это делает загрузчик в LdrpInitializeProcess(): Код (Text): Peb->ProcessHeap = RtlCreateHeap( ProcessHeapFlags, NULL, NtHeader->OptionalHeader.SizeOfHeapReserve, NtHeader->OptionalHeader.SizeOfHeapCommit, NULL, &HeapParameters );
зачем через структуру? так как через структуру вы не зависите от архитектуры, и для того, чтобы портировать вашу программу на x64 достаточно ее пересобрать в другой конфигурации... а в вашем случае придется менять fs на gs и хардкодить новые смещение и выносить все в отдельный асм файл... можно обойтись без вставок, есть __readfsdword... про варианты нахождения пеб - можно вызвать ZwQueryInformationProcess... если этот буффер на стеке и DLL переполнит его, то может получится довольно весело... я бы не стал так делать, лучше аллоцировать несколько страниц динамически...