Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Проблема с выделением памяти в заинжекченом процессе (https://forum.antichat.xyz/showthread.php?t=53946)

razzzar 19.11.2007 21:10

Проблема с выделением памяти в заинжекченом процессе
 
Есть программа, которая инжектирует свой код в svchost.exe
Выполняет в нем какой-то код, а потом выполняет действия наподобии этих:
Код:

char * szData = (char *) malloc(GetFileSize(hFile, NULL));
...
free(szData);

Так вот работает все отлично, но как только доходит до выделения памяти выкидует сообщение о ошибке и просьбе отослать отчет в Microsoft. Кто знает с чем связано?

ZaCo 19.11.2007 23:01

>>Есть программа, которая инжектирует свой код в svchost.exe

ну да, код может и инжекцируется, но вы уверенны, что хэндл hFile имеет место быть в процессе svchost? если нет, то malloc'у передастся -1. не хочется разбираться почему, но malloc возвращает не NULL на -1, однако очевидно, что память такого размера выделиться не может и первые четыре байта до возвращаемого указателя совсем не размер содержат...

KEZ 19.11.2007 23:17

Гыыы) Дело в CRT-шных malloc'ах и free'хах))

Код:

void *new_malloc(size_t size)
{
  return HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,size);
}

void new_free(void *p)
{
  HeapFree(GetProcessHeap(),0,p);
}

при инжекте в процесс многие ф-ие CRT использовать не получится

а вообще, автор, отладчики ведь придумали не просто так

PS
HeapAlloc, HeapFree - это в NT на самом деле экспорт-форвардинг на ntdll.RtlAllocateHeap и соотв. ntdll.RtlFreeHeap.
как и getlasterror=RtlGetLastWin32Error

ZaCo 19.11.2007 23:39

2KEZ а что в реализации этих crt-функций такого?)

_Great_ 19.11.2007 23:41

Цитата:

Сообщение от kez
а вообще, автор, отладчики ведь придумали не просто так

Да, и очень жаль, что люди, подобные ТС, не умеют ими пользоваться.

DWORD 19.11.2007 23:52

Цитата:

Сообщение от ZaCo
2KEZ а что в реализации этих crt-функций такого?)

Их нет как я понимаю, хотя я в отладчик не заглядывал.

razzzar 20.11.2007 00:43

спасибо за ответ )

KEZ 20.11.2007 01:06

Цитата:

2KEZ а что в реализации этих crt-функций такого?)
Зако тоже не любит отладченки походу.
Для чего нужна инициализация CRT? Вот оно инициализивалась, особенно куча тек. процесса получилась, и тут вдруг кусок кода идет в совсем другой процесс со своей кучей. Подробнее - см. дизасм malloc() и free().
Это примерно тоже, что получить хендлы, справедливые только в текущем процессе (открытые объекты "файл", к примеру) и инжектнуть код, с ними работающий, в другой процесс, удивляясь, почему не работает.
А в crt как бы нет ориентировки на то, что её будут хакеры использовать в целях инжекта в бедный svchost

ZaCo 20.11.2007 03:01

2KEZ ну это ясно. только не понятно зачем ты щас конретизируешь кучу, ведь изначально ошибко кроется в том, что нельзя инжектить код, который использует "родные" адреса для вызова дальних jmp или call. ну в общем-то да, вот только тогда не понятно как автор решил инжектить код со своими адресами.. ахх, если бы винду собирали с crt автору при удачном стечении обстоятельств было бы попроще:)

KEZ 20.11.2007 12:58

Цитата:

ведь изначально ошибко кроется в том, что нельзя инжектить код, который использует "родные" адреса для вызова дальних jmp или call.
Все адреса при инжекте остались родными) В svchost выделили нужные адреса, скопировали туда свой образ целиком (автор, я телепат??) и запустили нужную ф-ию.
Проблема не в jmp или call. С джампами и колами - это другая проблема, их надо релочить. А тут - косяк чисто в CRT. Достаточно посмотреть шаги работы malloc().
Помниться, когда я только узнал про инжект в процесс, у меня была точно такая же проблема.

Цитата:

ну в общем-то да, вот только тогда не понятно как автор решил инжектить код со своими адресами..
хз почему ты так решил


Время: 17:47