подскажите heap

Тема в разделе "WASM.WIN32", создана пользователем hawk, 15 сен 2010.

  1. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Здравствуйте.
    Вот не могу разобраться, может вы подскажите...
    В общем зада состоит в следующем-изменить адрес текущей кучи(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 ничего не изменилось.
    Подскажите пожалуйста, где ошибочка?
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    зачем ты делаешь асм-вставку?... получи адрес пеба и манипулируй структурой...
     
  3. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    А разве это повлеяет на конечный результат.
    Я и через структуру делал-результат тот же((
    Или есть еще варианты получения адреса PEB?
    В конечном итоге как бы я не манипулировал PEB ом, адрес кучи у меня все рано не изменился.
     
  4. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Конечная цель выглядит так:
    из программы загружаю DLL
    Перед вызовом ее функции я изменяю адрес кучи(что бы при вызове из DLL операторов new память выделялась из кучи отличной от основной для программы).
    После чего восстанавливаю адрес.
    В общем цель такитх действий сводиться к тому чтобы защититься от порчи кучи со стороны подгружаемой DLL.
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    hawk
    Во-первых, нужное поле находится вовсе не по тому адресу, а по fs:[18h]->[30h]->[18h] (http://wasm.ru/forum/viewtopic.php?id=23318).
    Во-вторых, по этому адресу находится хэндл кучи, а не адрес буфера. Создать кучу можно с помощью HeapCreate.
    В дополнение к Rel:
    Код (Text):
    1. TEB *pTeb = NtCurrentTeb();
    2. pPeb = *(DWORD*)((BYTE*)pTeb+0x30);
    3. hHeap = *(DWORD*)((BYTE*)pPeb+0x18);
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    hawk
    Сделать так, как это делает загрузчик в LdrpInitializeProcess():
    Код (Text):
    1.         Peb->ProcessHeap = RtlCreateHeap( ProcessHeapFlags,
    2.                                           NULL,
    3.                                           NtHeader->OptionalHeader.SizeOfHeapReserve,
    4.                                           NtHeader->OptionalHeader.SizeOfHeapCommit,
    5.                                           NULL,
    6.                                           &HeapParameters
    7.                                         );
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    зачем через структуру? так как через структуру вы не зависите от архитектуры, и для того, чтобы портировать вашу программу на x64 достаточно ее пересобрать в другой конфигурации... а в вашем случае придется менять fs на gs и хардкодить новые смещение и выносить все в отдельный асм файл... можно обойтись без вставок, есть __readfsdword... про варианты нахождения пеб - можно вызвать ZwQueryInformationProcess...

    если этот буффер на стеке и DLL переполнит его, то может получится довольно весело... я бы не стал так делать, лучше аллоцировать несколько страниц динамически...
     
  8. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Спасибо за помощь)
    Весьма благодарен.