Азм дошел таки до слайсинга . Не прошло и полугода. Проработал несколько статей . Сегодня , главным образом интересует вот это место из Ms-Rem'кой (долгая ему память). "Перехват API функций в Windows NT" http://www.wasm.ru/article.php?article=apihook_1 Function InjectDll(Process: dword; ModulePath: PChar): boolean; .............. //инициализация внедряемого кода: Inject.PushCommand := $68; inject.PushArgument := code + $1E; inject.CallCommand := $15FF; inject.CallAddr := code + $16; inject.PushExitThread := $68; inject.ExitThreadArg := 0; inject.CallExitThread := $15FF; inject.CallExitThreadAddr := code + $1A; hKernel32 := GetModuleHandle('kernel32.dll'); inject.AddrLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA'); inject.AddrExitThread := GetProcAddress(hKernel32, 'ExitThread'); lstrcpy(@inject.LibraryName, ModulePath); ................... Т е в статье описывается внедрение dll . Однако , вместо самой dll , создается , инициализируется , внедряется в процесс и запускается через CreateRemoteThread сия странная структура inject . Похожая техника есм и в иной рукописи , хотя выглядит зело иначе. Что сие за чудо есть ? Сам предполагаю только , что наблюдаю технику "отображения" dll в процесс . Или я ошибаюсь? А если это так , то посредством чего можно приобщиться к этой тайне ? Иначе сделано у тов. Great. http://forum.antichat.ru/threadedpost275447.html#post275447 Модуль действительно копируется постранично в процесс . Хотя и по непонятным адресам . "...мы просто аккуратно страничку за страничкой перенем ВЕСЬ наш EXE-модуль в чужой процесс, вместе с MZ и PE-заголовками, кодом, данными, импортом и прочим. Чтобы быть уверенным, что по нашим адресам в чужом адресном пространстве ничего нет, мы поставим себе базу повыше - где-нибудь около 29A00000." Может , сам Great , либо , кто понимающий , объяснит . Зачем сначала очищать память выше 29A00000 , а потом резервировать ее там под процесс . Если можно вызвать VirtualAllocEx со вторым параметром(lpAddress) равным NULL и тогда : "If lpAddress is NULL, the function determines where to allocate the region. ". Т е не придется заботится об адресе загрузки . Грядущие вопросы опишу в последствии . Засим остаюсь с вами .
Смысл в том, что, если мы перенесёмся в адресное пространство другого процесса, то все глобальные переменные окажутся том же месте, где и были в оригинальном процессе. А если аллокировать произвольный участок памяти, то после переноса по нужным адресам уже не будут находиться наши переменные! Так что либо код должен быть либо полностью базонезависимым, либо иметь возможность перенастраиваться на другие адреса.
а это странная структура делает в другом процессе не что иное как loadlibrary(ModulePath);, что подгружает длл. насчет 29A00000. есть такая вирмейкерская тима 29А... а есле серъезно то по этому адресу может быть что угодно, мэппинг, резервированная память... поэтому лучче все освободить и занять заново. но будь осторожен. может получится что в том куске памяти чтото выполняется, тогда уронишь приложение своими попытками освободить память
Пасибствую HooBleen . Картина c адресом загрузки немного проясняется . 2 FreeManCPM . Можно подумать , если мы затрем "что угодно, мэппинг, резервированная память" .Хотя бы и не трогая кода . Тогда процесс будет дальше спокойно работать? Те как я и предполагал , посредством ст-ры inject отображается библиотека в процесс . Но главного я пока не осмыслю . Что же всетаки обозначают эти загадочные : $68,$1E,$15FF,$16,$68,15FF; ? И почему они в сумме производят Loadlibrary(ModulePath) И где про это почитать ... Абыдно ,что у самого ms-rem про это нет ни звука. Типа так и надо . P.S.: Не по теме вопрос. Что такое оверлеи ?Хитрое слово будоражит мой рассудок. Везде пишут , что это нечто живущее на задворках секций , а для чего они и почему ни слова.
Не исключено, что будет =Р Ну так переведи хекс в команды и посмотри - получится код типа Код (Text): push offset LibName call [LoadLibraryA] push ExitThreadArg call [ExitThread] LoadLibraryA dd ? ExitThread dd ? LibName db ?
Hmm это опкоды команд. введи их в hiew и увидишь что это за команды. Оверлей - Часть файла, которая не грузится в память. Происходит это когда размер секции на диске больше размера секции в памяти.
Очищается для того,чтобы гарантированно там ничего не было. Вдруг там случайно чтото окажется) Резервировать для тех же целей. Потом постранично копируем свое тело по тем же виртуальным адресам, но в другом адресном пространстве. По-хорошему, надо собирать с фиксапами и если по тому адресу что-то лежит, выделить память по другому адресу и релоцировать свое тело.
Аа .. стало быть это нечто вроде шеллкодеса . А почему там значки $ стоят спереди ? Это в delphi так hex обозначается ? Категорический вам респект .