CreateRemoteThread создаёт поток тольо в секции кода или в .data тоже?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 26 мар 2009.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья!
    Здравствуйте все!
    Вот, занялся перехватом api-функций, придумал свой способ, изгаляюсь над *.dll как могу (шутка)

    В обoем, всё нормально, функцию перехватываю. А вот чтобы вернуть на неё управление, необходимо использовать CreateRemoteThread таким образом:

    CreateRemoteThread (hProcess, 0, 0, (unsigned long (__stdcall *)(void *))0x<адрес в секции данных *.dll>, 0, 0, 0);

    Что-то не получается в секции данных создать поток. В секциии кода создаётся, я проверял.
    Есть какие-нибудь советы?
     
  2. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    CreateRemoteThread - не по-дзенски, юзай дизасм и WriteProcessMemory.
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Что значит не по-дзенски?
    И у меня нет проблем с записью в память процесса.
    (Пока нет)

    Мне необходимо создать поток в удалённом процессе. Код- в секции данных *.dll Получилось уж так...
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    аттрибуты исполнения есть на этом участке? ДЕП ведь никто еще не отменял
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Страницы памяти в секции .data по умолчанию не помечены как исполнимые же. Для починки один может использовать VirtualProtect(Ex).
     
  6. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Право слово не знаю, о чём Вы.
    Извините.
    ...Поледнее сообщение не заметил. Сейчас позанимаюсь.
    Ремарка небольшая.

    Дело в том, что у меня в секции данных создаётся код и он прекрасно работает, но!
    Если на это код осуществить прыжок. Такой, допустим


    адрес в секции кода | jmp <адрес в секции данных>

    Ясно? Вот так код будет работать
    А поток не создаётся.
     
  7. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    эхх, ну чтож всё так сложно то? Ну раз нет проблем с записью в память, то VirtualAllocEx > WriteProcessMemory > CreateRemoteThread
     
  8. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Стоп.
    Не надо мне WriteProcessMemory!
    Я записал в секцию данных код (память сам выделил, руками. Просто посмотрел в отладчике, где там байты свободные и всё.). Без проблем.
    Но поток создать не могу.
    То, что надо CreateRemoteThread, я и так знаю.

    ...Если без вариантов, толгда буду думать, как код создать поток в секции кода.
    Просто мне удобно- у меня вся структура для перехвата api- функции (название проги, на которую над прыгнуть, код для сохранения esp и так далее, массив для ханения первых пяти байт перхватываемо функции)- всё идёт одно за другим в секции данных.

    Теперь придётся эту структуру разбивать на 2 части, как минимум.
    Часть будет храниться в секции кода, часть- в секции данных. Неудобно.
     
  9. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    amvoz, эхх..., вам Sol_Ksacap же объяснил уже
     
  10. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Да я понял, просто ребята разговор продолжают.
     
  11. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Нет, парни, не подойдёт здесь VirtualProtectEx
    Ибо код

    VirtualProtectEx (hProcess, (void*)0X77d90ae8, 0X140, PAGE_EXECUTE_READWRITE, &old );
    printf ("%d", old);

    выдаёт 40 (PAGE_EXECUTE_READWRITE== 40)
    Этот диапазон памяти УЖЕ доступен и для чтения, и для записи и для выполнения кода. Я же говорю- код выполняется, если на него прыгнуть. Поток не создаётся!
    Тут что-то другое...
     
  12. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    ага, РОБОТЫ... ЗАПОЛОНИЛИ... ) пипетс
     
  13. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Окей, отлично. Сделай это ясно нам: CreateRemoteThread возвращает хендл? Если нет, то что возвращает GetLastError?
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Дурацкие на первый взгляд вопросы
    1) а проецируется ли вообще длл в контексте процесса назначения?
    2) а валиден ли хендл процесса?
    3) а по тому же ли адресу проецируется длл?
    4) а ты уверен что CreateRemoteThread возвращается с ошибкой?
    5) что по-твоему означает, что поток "не создается" ?
    потому что, как говорит мой любимый герой, "все врут", а большинство спрашивающих на форуме порой обламываются еще на совсем очевидных этапах (например длл проецируют в свой процесс и ждут пока в другом будет работать)