VirtualAlloc и Vista

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

  1. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Rustem
    это тоже не обязательно. нет никаких противопоказаний компонентам аллоцировать свободную память. пусть и по 400000. потому и желательно как можно меньше вызовов сделать до того, как вы захватите нужный вам регион. а вы еще и положили вверх образ. что теперь делать бедным длл-ям?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Обычно это делают крипторы и используются авторами софта для защиты своих модулей. А если автор приложения решил его накрыть криптором то должен позаботится о совместимости. Пусть переносят код в длл. Иначе незачем криптовать чужие экзешники. Длл всегда имеют релоки. Освобождать память под не перемещаемый модуль это ошибка, иначе не назвать.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Rustem
    Посмотрите карту памяти процесса System. Такой она должна быть перед загрузкой экзе ядром ;)
     
  4. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    qqwe
    >ну кто ж такой рос на цпп пишет?
    Существует мнение, что С++ – это просто такой удобный Си. И, до тех пор пока не используется стрёмных конструкций вроде бросания приплюснутых исключений из конструкторов, или, например, множественного наследования с применением кучи тонких темплейтных параметров – до этих пор сохраняется полный контроль. Нет, понятно, что тут всё зависит как от человека, так и от компилятора, и, отложив возможный свящебой в сторону, хотелось бы сказать, что мы озвучили лишь одно из мнений, не обязательно верное.

    Rustem
    >Можешете подробнее расказать про метод?
    Задаёмся вопросом, если это случайное расхождение или же умышленный подкол ;p
    Код (Text):
    1. //
    2. // псевдокод
    3. //
    4. HANDLE ChildProcess = CreateProcess(PathToSelf, OriginalParameters + " -LaunchedAsChild", CREATE_SUSPENDED);
    5. // ^У дочернего процесса сейчас практически пустое адресное пространство (только self, ntdll, SharedUserData?),
    6. // можно зарезервировать нужный регион.
    7. VirtualAllocEx(ChildProcess, RequiredRegion, RegionSize, MEM_RESERVE | MEM_COMMIT);
    8. // Теперь всё будет происходить в дочернем процессе, где нужный регион уже выделен нами.
    9. ResumeProcess(ChildProcess);
    10. WaitForSingleObject(ChildProcess);  // or whatever
    11. ExitProcess(GetExitCode(ChildProcess));
    На самом деле, нам нравится вариант с bss, предложенный qqwe. Жёстко зафиксировать свою базу на 0x10000 (ниже уже не получится), +большой массив (резервации в страничном файле не жалко) — отличная гарантия отсутствия необходимости лишних телодвижений для загрузки подавляющего большинства экзешников.
     
  5. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Sol_Ksacap
    вопрос не в свящебое. во всяком случае не от меня. тк веселюсь только с рогатыми.
    вопрос в возможной теневой работе с кучей, совершенно нормальной для цпп, но крайне нежелательной для данного момента. а пуре-ц не предполагает теневого автоума, те в тут оно будет предскауемее.
     
  6. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Sol_Ksacap
    >HANDLE ChildProcess = CreateProcess(PathToSelf, OriginalParameters + " -LaunchedAsChild", CREATE_SUSPENDED);
    > ^У дочернего процесса сейчас практически пустое адресное пространство (только self, ntdll, SharedUserData?)

    Неверно. Вот карта сразу после отработки NtCreateUserProcess для w7 (notepad.exe):
    Код (Text):
    1. lkd> !vad fffffa8004882b80
    2. VAD             level      start      end    commit
    3. fffffa8003fe8710 ( 2)         10       2f        32 Private      READWRITE
    4. fffffa8004af7500 ( 3)         30       af        20 Private      READWRITE
    5. fffffa80020214b0 ( 1)      77640    777ea        12 Mapped  Exe  EXECUTE_WRITECOPY
    6. fffffa8001f80b20 ( 2)      7efe0    7ffdf         0 Private      READONLY
    7. fffffa8004882b80 ( 0)      7ffe0    7ffef        -1 Private      READONLY
    8. fffffa8001ec1dc0 ( 2)      ff8e0    ff914         3 Mapped  Exe  EXECUTE_WRITECOPY
    9. fffffa800211a490 ( 3)   7feff960 7feff960         0 Mapped  Exe  EXECUTE_WRITECOPY
    10. fffffa8001c5ef80 ( 1)   7fffffb0 7fffffd2         0 Mapped       READONLY
    11. fffffa80020bee10 ( 2)   7fffffd9 7fffffd9         1 Private      READWRITE
    12. fffffa8001bd2310 ( 3)   7fffffde 7fffffdf         2 Private      READWRITE
    13.  
    14. Total VADs:    10  average level:    2  maximum depth: 3
    Первый exe – это ntdll, второй – образ блокнота, третий – "apisetschema.dll".
    Можно видеть и другие занятые регионы, как то параметры процесса, кодовые таблицы & Co, данные активационных контекстов(?) и ещё непонятно что. Так что всё несколько сложнее, чем хотелось бы.
     
  7. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Так, план меняется)

    Буду делать через bss, как наименее трудозатратный

    Sol_Ksacap спасибо за объяснение,
    qqwe спасибо за метод