Есть вопрос по сплайсингу

Тема в разделе "WASM.BEGINNERS", создана пользователем SZ, 19 авг 2010.

Статус темы:
Закрыта.
  1. SZ

    SZ New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2010
    Сообщения:
    30
    Вобщем дело было так
    Код (Text):
    1.             if(VirtualProtect(&pFunc, 8, PAGE_READWRITE, &old))
    2.             {
    3.                 __asm
    4.                 {
    5.                
    6.                 push ecx
    7.                 push esi
    8.                 push edi
    9.  
    10.                  mov ecx, 2 ;2x4 итого 8 байт
    11.                  mov esi, [pHook] ;src
    12.                  mov edi, [pFunc]   ; dst
    13.                  rep movsd ;
    14.                
    15.                 pop edi
    16.                 pop esi
    17.                 pop ecx
    18.  
    19.                 }
    20.                 MessageBox(0,"Ok",0,0);
    21.             }
    VirtualProtect возвращает 1, т.е. всё ок, но при попытке записи по адресу в pFunc меня выносит на KiUserExceptionDispatcher. Почему исключение ? Значит запись в тот регион не была разрешена ?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
  3. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    а что сказал отладчик?
     
  4. SZ

    SZ New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2010
    Сообщения:
    30
    Clerk Пардон, в следующий раз буду внимательней.

    Clyde
    В смысле? Ничего, просто перешёл на обработку в KiUserExceptionDispatcher откуда не вернулся )

    посмотрел в стек:[esp+8]=0xC0000005
    действительно, нарушение доступа

    Я вот ещё подумал, а может это касперыч палки в калёса вставляет. дык я его перед махинациями отключаю. странно ...
     
  5. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    >>VirtualProtect(&pFunc, 8, PAGE_READWRITE, &old)
    ты разрешаешь доступ к указателю, те области памяти в которой лежит адрес функции, а не к самой функции.
    нужно так
    VirtualProtect(pFunc, 8, PAGE_READWRITE, &old)

    учите Си =)
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    izl3sa
    Вам бы самому си не помешало подучить. Эти вызовы идентичны. Мало того, более корректной записью считается та, которую привёл SZ.
     
  7. wf_

    wf_ New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2009
    Сообщения:
    40
    я не уверен, но может надо PAGE_EXECUTE_READWRITE вместо PAGE_READWRITE?
     
  8. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    2l_inc
    Протрите глаза уже

    void *pFunc = SomeFunc;

    pFunc != &pFunc

    в pFunc хранится адрес нужной функции, изменить атрибуты памяти которой нам и нужно.
    а &pFunc `вернет` всего лишь адрес переменной pFunc, а не функции. Таким образом он меняет атрибуты защиты памяти переменной, возможно стека (скорее всего переменная локальная у него).
     
  9. SZ

    SZ New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2010
    Сообщения:
    30
    izl3sa
    Я так понимаю,
    pFunc = значение в переменной pFunc
    &pFunc = адрес самой переменной pFunc
    VirtualProtect хочет получить адрес указателя на регион или адрес региона. Я так понял что адрес указателя.

    Попробовал с VirtualProtectEx. Тоже возвращает true и тоже обламывается.
    VirtualProtectEx((HANDLE)-1,&pFunc, 8, PAGE_READWRITE, &old).
    Тут возник вопрос, а имеет ли собссно дескриптор процесса права доступа PROCESS_VM_OPERATION ?
    но ведь функции возвращают тру!

    wf_
    я с этого начинал )
    безрезультатно.
     
  10. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    2SZ
    что у тебя находится в pFunc? адрес функции же перехватываемой? так какого же черта ты изменяешь атрибуты памяти в которой находится переменная, а не по тому адресу где находится перехватываемая функция?
    Она тру и правильно возвращает, тк изменила атрибуты стека, где находится переменная.
     
  11. wf_

    wf_ New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2009
    Сообщения:
    40
    да, покажите как определена pFunc
    l_inc
    эти вызовы идентичны в случае если pFunс имя функции, а тут скорей всего это переменная, которая содержит адрес, стало-быть оператор & не нужен (вероятно)
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    izl3sa
    Приношу свои извинения. Решил, что pFunc — это и есть функция.
     
  13. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    2l_inc
    да все норм =) главное разобрались =)
     
  14. SZ

    SZ New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2010
    Сообщения:
    30
    izl3sa
    Попробовал без амперсенда.
    кусок перед вызовом
    [​IMG]
    стек перед вызовом
    [​IMG]
    А адрес то NULL !

    определён так
    void *pFunc;
    pFunc=GetProcAddress(hMod,"func");
     
  15. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    2SZ
    я не гадалка. Полный код приводите.
    хотя попробую:
    Длл подгрузили? имя точно соответствует экспортам?
     
  16. SZ

    SZ New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2010
    Сообщения:
    30
    Всё определяется правильно. и модуль и функции. все адреса правильные.
    а от длл зависит ? вобщето это WS2_32.dll )
     
  17. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    SZ
    ну вы код приведете или дальше будем тыкать в небо пальцами?
     
  18. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    +значение GetLastError сразу после LoadLibrary (можно посмотреть в Olly), чтобы не гадать :).
     
  19. SZ

    SZ New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2010
    Сообщения:
    30
    ну izl3sa ну кудесник !!! )))))))
    действительно менял доступ к переменной.
    А NULL было потому что я в екзешнике функцию искал, бараааааааан

    hMod=GetModuleHandle("IEXPLORE.EXE"); Тут я определяю что попал в нужный процесс
    if(hMod)
    {
    hMod=GetModuleHandle("WS2_32.DLL");<=== а про дллку и забыл
    pHOOK_Send=&HookSend;
    __asm jmp $;бряк
    pSend=(DWORD)GetProcAddress(hMod,"send");
    DWORD old;
    if(VirtualProtect((void*)pSend, 8, PAGE_READWRITE, &old))
    {
    ..... далее сплайс


    А, вот ещё вопрос
    как правильно определить адрес моей (naked) функции ?
     
  20. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    1.
    >> hMod=GetModuleHandle("WS2_32.DLL");<=== а про дллку и забыл
    добавьте потом if(!hMod) LoadLibrary("WS2_32.DLL");
    иначе будет грустно периодически =)

    2. Просто используйте её имя.
     
Статус темы:
Закрыта.