• XSS.stack #1 – первый литературный журнал от юзеров форума

После отключения CRT при выделении памяти перестал видится void* в C++?

Alexey18

(L3) cache
Пользователь
Регистрация
11.06.2023
Сообщения
163
Реакции
30
Пишу скрытие импортов и всё такое. Решил отключить CRT - успешно. Но мне надо (для опред. задач) выделять память через malloc и при использовании void* не компилируется("неразрешенный внешний символ void* "). Приведение типов в unsigned char* не помогает. Подскажите, что делать? Если я использую void* для других дел- тоже не работает. Тригерит

1706380153089.png
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Оператор new у тебя не определенный, а не void*, определи его через malloc:
C:
void* operator new(size_t size) {
    return malloc(size);
}
 
Оператор new у тебя не определенный, а не void*, определи его через malloc:
C:
void* operator new(size_t size) {
    return malloc(size);
}
спасибо, но хотел подметить что всё же надо new[]
 
Оператор new у тебя не определенный, а не void*, определи его через malloc:
C:
void* operator new(size_t size) {
    return malloc(size);
}
Подскажи пожалуйста, столкнулся еще с такой проблемой, что malloc перестал тоже видеться. Я решил вызвать по хешам его, а не на прямки. Вроде всё норм(на обычном проекте). Но с CRT тоже работать не хочет. С чем это мб связано? WriteProcessMemory и тд при вызовах по хешам видны

1706438189527.png



1706438427739.png
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Подскажи пожалуйста, столкнулся еще с такой проблемой, что malloc перестал тоже видеться. Я решил вызвать по хешам его, а не на прямки. Вроде всё норм(на обычном проекте). Но с CRT тоже работать не хочет. С чем это мб связано? WriteProcessMemory и тд при вызовах по хешам видны
Не понял, ты же отключил стандартные библиотеки, откуда у тебя malloc должен быть? И что значит перестал видеться по хешам? Функцию malloc ты можешь взять из msvcrt.dll, она там есть, ну или использовать вместо нее HeapAlloc из kernel32.dll. Оператор new - это прослойка над malloc, которая - прослойка над HeapAlloc, которая - прослойка над RtlAllocateHeap (или прям форвардинг импорта, я не помню)... ну а что, абстракции над абстракциями, почему бы нет.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
(или прям форвардинг импорта, я не помню)
форвардинг. Насколько я помню по хэшу от HeapAlloc оно не найдет. Нужно искать RtlAllocateHeap. Хотя могу ошибаться
 
форвардинг. Насколько я помню по хэшу от HeapAlloc оно не найдет. Нужно искать RtlAllocateHeap. Хотя могу ошибаться
Всё верно, HeapAlloc - форвард на ntdll.RtlAllocateHeap.
Алгоритм примерно такой:
1) Ищем HeapAlloc в экспорте kernel32
2) Находим, проверяем что это форвард: if (func_va_addr > export_addr && func_va_addr < export_addr + export_size) { // forward } else { // direct }
3) Если форвард - читаем по найденному адресу до завершащего нуля, данные будут в формате dll_name.FunctionName
Ну и далее уже просто ищем в соответствующей длл по хэшу от полученного имени.

Но если длл в процесс загружаются способом, отличным от обычного вызова LoadLibrary() - далее ждёт сюрприз - api sets: https://xss.pro/threads/26447/post-737323
 
Последнее редактирование:
Касательно работы с malloc. Функция форвордится корректно. И работает без CRT корректно, но только если выделять под void* . Поч конфликты с unsigned char* пока хз
 
Касательно работы с malloc. Функция форвордится корректно. И работает без CRT корректно, но только если выделять под void* . Поч конфликты с unsigned char* пока хз
Без разницы к какому типу данных ты кастуешь указатель который возвращает malloc, это никак не влияет на работоспособность программы. Если так и не вышло решить проблему, дай минимальный код для воспроизведения ошибки, я посмотрю. VirtualAlloc непрактично использовать для выделения чанков памяти маленького размера, для таких вещей реализована куча (Heap). Если ты выделишь 20 байт через VirtualAlloc, из-за выравнивания функция выделит не 20 а намного больше и так будет каждый раз, когда ты аллоцируешь память.
 
Последнее редактирование:
VirtualAlloc - выделяет новую страницу(ы) памяти (по гранулярности), которую сначала резервирует, - накладно.
RtlHeapAlloc и его надстройки LocalAlloc, GlobalAlloc, CoTaskMemAlloc - из уже существующей кучи процесса.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх