![]() |
Проблема с выделением памяти в заинжекченом процессе
Есть программа, которая инжектирует свой код в svchost.exe
Выполняет в нем какой-то код, а потом выполняет действия наподобии этих: Код:
char * szData = (char *) malloc(GetFileSize(hFile, NULL)); |
>>Есть программа, которая инжектирует свой код в svchost.exe
ну да, код может и инжекцируется, но вы уверенны, что хэндл hFile имеет место быть в процессе svchost? если нет, то malloc'у передастся -1. не хочется разбираться почему, но malloc возвращает не NULL на -1, однако очевидно, что память такого размера выделиться не может и первые четыре байта до возвращаемого указателя совсем не размер содержат... |
Гыыы) Дело в CRT-шных malloc'ах и free'хах))
Код:
void *new_malloc(size_t size)а вообще, автор, отладчики ведь придумали не просто так PS HeapAlloc, HeapFree - это в NT на самом деле экспорт-форвардинг на ntdll.RtlAllocateHeap и соотв. ntdll.RtlFreeHeap. как и getlasterror=RtlGetLastWin32Error |
2KEZ а что в реализации этих crt-функций такого?)
|
Цитата:
|
Цитата:
|
спасибо за ответ )
|
Цитата:
Для чего нужна инициализация CRT? Вот оно инициализивалась, особенно куча тек. процесса получилась, и тут вдруг кусок кода идет в совсем другой процесс со своей кучей. Подробнее - см. дизасм malloc() и free(). Это примерно тоже, что получить хендлы, справедливые только в текущем процессе (открытые объекты "файл", к примеру) и инжектнуть код, с ними работающий, в другой процесс, удивляясь, почему не работает. А в crt как бы нет ориентировки на то, что её будут хакеры использовать в целях инжекта в бедный svchost |
2KEZ ну это ясно. только не понятно зачем ты щас конретизируешь кучу, ведь изначально ошибко кроется в том, что нельзя инжектить код, который использует "родные" адреса для вызова дальних jmp или call. ну в общем-то да, вот только тогда не понятно как автор решил инжектить код со своими адресами.. ахх, если бы винду собирали с crt автору при удачном стечении обстоятельств было бы попроще:)
|
Цитата:
Проблема не в jmp или call. С джампами и колами - это другая проблема, их надо релочить. А тут - косяк чисто в CRT. Достаточно посмотреть шаги работы malloc(). Помниться, когда я только узнал про инжект в процесс, у меня была точно такая же проблема. Цитата:
|
>>В svchost выделили нужные адреса
>>Так вот работает все отлично, но как только доходит до выделения памяти выкидует >>сообщение о ошибке и просьбе отослать отчет в Microsoft. не знаю, имхо код был просто скопирован :o |
Цитата:
2КЕЗ, да, вы телепат ) |
>>ничего там скопированого не было. все писал я.
я про код процесса, а не программы на C) |
> не знаю, имхо код был просто скопирован
При инжекте у ТС с текущего процесса в адресное пространство другого по _одинаковым_ адресам копируется какой-либо код/+данные/+етц иначе все слетело бы ещё задолго до вызова malloc() о чем тут спорить можно ? : DDD |
Цитата:
|
Не от EIP, а от своего месторасположения.
Цитата:
есть большой кусок кода, сгенерированый компилятором, который при перемещении в другой процесс надо либо релочить, либо перемещать на тот же VA, где он и должен быть в процессе, либо записывать его VA-независимым, например, вместо call [addr] делать mov eax,[addr]\call eax. тут, вроде как, неочем спорить больше. |
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Как видно по первому посту в топике - компилятор c/cpp. Вот он, к примеру, очень часто будет ставить свои __CRT_CheckESP и тому подобное. И ещё много чего делать будет. Про __inline - без комментариев, это явно тут "ни приштопай ни пришей". А так, если самому писать код - да без проблем, можно полно всего придумать. |
Цитата:
Кстати, чтобы call'ы имели такой вид, на сколько я понял, извращаться ненужно, я, например, смог получить call по абсолютному адресу только для 0xFF call'а при вызове функции через функциональную переменную (Borland C++), но что-то мне подсказывает что на MSVS тоже самое. |
> Этого я так и не понял, почему?
А релоки в длл придумали просто так? Проблема в том, что каким-то инструкциям нужна VA, а каким-то - смещение, относительно EIP. Поэтому - либо релочишь колы и джампы, либо mov'ы и все остальное. Как у тебя CRT инициализируется с таким кодом: Цитата:
где _osplatform == 0x42AF20 перенесешь код - будет уже совсем неправильный адрес. |
Цитата:
|
Цитата:
http://forum.antichat.ru/showpost.php?p=508892&postcount=1 Цитата:
Цитата:
|
Цитата:
|
Пример надо приводить, когда точно известно, что предполагается делать - копировать образ бинарника в другой процесс полностью, или копировать туда 1 ф-ю/какой-нибудь кусок кода неизвестно какого размера.
В первом случае - придется специально переносить каждую секцию на другой адрес. Вообще смысла в этом никакого не вижу, разве что для проверки: "а все-таки можно ли вот так сделать"? Во втором случае сказать конкретно ничего нельзя - никто не знает что будешь копировать ... Есть факт - пока jmp'ы (и тп) будут указывать в кусок кода, который двигается вместе с ними - все будет нормально. Соотв, если убрать инструкции, требующие абсолютный адрес (все остальные, грубо говоря) - работать будет. Но тогда надо будет не использовать глобальные переменные или как-то передавать их адреса в выделеной куче. И вообще извращаться. Неужели не проще скопировать все туда же, где оно и было до этого? Это универсально по крайней мере. |
Цитата:
Код:
void* __cdecl malloc(size_t n) |
2panda gorl зачем ты обзываешься? мог бы сказать хотя бы перед этим где я в этом топике не прав :(
|
Цитата:
|
ну и не говори :p
|
DuplicateHandle
|
| Время: 15:58 |