Друзья! Здравствуйте все! Вот, занялся перехватом api-функций, придумал свой способ, изгаляюсь над *.dll как могу (шутка) В обoем, всё нормально, функцию перехватываю. А вот чтобы вернуть на неё управление, необходимо использовать CreateRemoteThread таким образом: CreateRemoteThread (hProcess, 0, 0, (unsigned long (__stdcall *)(void *))0x<адрес в секции данных *.dll>, 0, 0, 0); Что-то не получается в секции данных создать поток. В секциии кода создаётся, я проверял. Есть какие-нибудь советы?
Что значит не по-дзенски? И у меня нет проблем с записью в память процесса. (Пока нет) Мне необходимо создать поток в удалённом процессе. Код- в секции данных *.dll Получилось уж так...
Страницы памяти в секции .data по умолчанию не помечены как исполнимые же. Для починки один может использовать VirtualProtect(Ex).
Право слово не знаю, о чём Вы. Извините. ...Поледнее сообщение не заметил. Сейчас позанимаюсь. Ремарка небольшая. Дело в том, что у меня в секции данных создаётся код и он прекрасно работает, но! Если на это код осуществить прыжок. Такой, допустим адрес в секции кода | jmp <адрес в секции данных> Ясно? Вот так код будет работать А поток не создаётся.
эхх, ну чтож всё так сложно то? Ну раз нет проблем с записью в память, то VirtualAllocEx > WriteProcessMemory > CreateRemoteThread
Стоп. Не надо мне WriteProcessMemory! Я записал в секцию данных код (память сам выделил, руками. Просто посмотрел в отладчике, где там байты свободные и всё.). Без проблем. Но поток создать не могу. То, что надо CreateRemoteThread, я и так знаю. ...Если без вариантов, толгда буду думать, как код создать поток в секции кода. Просто мне удобно- у меня вся структура для перехвата api- функции (название проги, на которую над прыгнуть, код для сохранения esp и так далее, массив для ханения первых пяти байт перхватываемо функции)- всё идёт одно за другим в секции данных. Теперь придётся эту структуру разбивать на 2 части, как минимум. Часть будет храниться в секции кода, часть- в секции данных. Неудобно.
Нет, парни, не подойдёт здесь VirtualProtectEx Ибо код VirtualProtectEx (hProcess, (void*)0X77d90ae8, 0X140, PAGE_EXECUTE_READWRITE, &old ); printf ("%d", old); выдаёт 40 (PAGE_EXECUTE_READWRITE== 40) Этот диапазон памяти УЖЕ доступен и для чтения, и для записи и для выполнения кода. Я же говорю- код выполняется, если на него прыгнуть. Поток не создаётся! Тут что-то другое...
Окей, отлично. Сделай это ясно нам: CreateRemoteThread возвращает хендл? Если нет, то что возвращает GetLastError?
Дурацкие на первый взгляд вопросы 1) а проецируется ли вообще длл в контексте процесса назначения? 2) а валиден ли хендл процесса? 3) а по тому же ли адресу проецируется длл? 4) а ты уверен что CreateRemoteThread возвращается с ошибкой? 5) что по-твоему означает, что поток "не создается" ? потому что, как говорит мой любимый герой, "все врут", а большинство спрашивающих на форуме порой обламываются еще на совсем очевидных этапах (например длл проецируют в свой процесс и ждут пока в другом будет работать)