VirtualProtect возвращает ERROR_NOACCESS

Тема в разделе "WASM.WIN32", создана пользователем nodel, 12 июл 2006.

  1. nodel

    nodel New Member

    Публикаций:
    0
    Регистрация:
    14 янв 2006
    Сообщения:
    4
    приветствую всех дзенствующих.

    есть кусок кода, работает половинчато %)
    в идеале реализует сплайсинг api функции.

    преамбула
    Код (Text):
    1. void* func
    2. void* intercept
    3. HANDLE CurrProc;
    4. typedef struct str_func_stub  // структура выравнена по 1 байту
    5. {
    6.     BYTE jmpop;
    7.     DWORD addr;
    8. } func_stub;
    9. func_stub mystub;
    10. ....
    11.     mystub.jmpop  = 0xE9;
    12.     mystub.addr = (DWORD)((void*)intercept)-(DWORD)((void*)func)-5;
    13.     CurrProc=INVALID_HANDLE_VALUE;
    14.     //сохраняем старое начало функции
    15.     if(!VirtualProtect(func, 255, PAGE_EXECUTE_READWRITE, OldProtect))
    16.     {
    17.                  // вышибает здесь
    18.         output=GetLastError();
    19.         sprintf(&info,"CurrProc =%i,VirtualProtect=%i,func=%X,intercept=%X",CurrProc,output,func,intercept);
    20.         MessageBox(0,info,"dll",0);
    21.         return FALSE;
    22.     }
    23.     ReadProcessMemory(CurrProc, func, &save, sizeof(old_bytes), output);
    24.     WriteProcessMemory(CurrProc, func, &mystub, sizeof(mystub), output);
    25.     sprintf(&info,"CurrProc =%i,output=%i,func=%X,intercept=%X",CurrProc,output,func,intercept);
    26.     MessageBox(0,info,"dll",0);
    27.     VirtualProtect(func, 255, OldProtect, OldProtect);
    28.     return TRUE;
    фабула.
    VirtualProtect выскакивает с ERROR_NOACCESS, почему? что может ей мешать?
    если убрать условие, а VirtualProtect просто вызвать, то наблюдается следующее:
    1. если писать в память с помощью WriteProcessMemory, то в иде по адрессу func видно, что записывается не все, что нужно. примерно так:
    00 00-55 8B 00, где 00 - правильно записаные данные, т.е. 55 8B никак не меняются 8(
    2. если писать в память обычным образом, то прилага наглухо виснет.

    такие дела.

    помогите, куда можно копнуть, чтобы разобраться в чем дело?
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Да скорее всего с OldProtect напутал
    Это должен быть указатель на существующую переменную DWORD - объявляешь DWORD OldProtect и передаешь в VirtualProtect по ссылке &OldProtect
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Код (Text):
    1. int WriteMemory(HANDLE hProcess, void* AddressToWrite, void* lpBytesToWrite, DWORD nSize)
    2. {
    3.     DWORD OldProtect;
    4.  
    5.     int retValue = WriteProcessMemory(hProcess,
    6.                                       AddressToWrite,
    7.                                       lpBytesToWrite,
    8.                                       nSize,
    9.                                       NULL);
    10.     if(!retValue)
    11.     {
    12.         if(VirtualProtectEx(hProcess,
    13.                             AddressToWrite,
    14.                             nSize,
    15.                             PAGE_READWRITE,
    16.                             &OldProtect))
    17.         {
    18.             retValue = WriteProcessMemory(hProcess,
    19.                                           AddressToWrite,
    20.                                           lpBytesToWrite,
    21.                                           nSize,
    22.                                           NULL);
    23.             VirtualProtectEx(hProcess,
    24.                              AddressToWrite,
    25.                              nSize,
    26.                              OldProtect,
    27.                              &OldProtect);
    28.         }
    29.     }
    30.     return retValue;
    31. }
     
  4. nodel

    nodel New Member

    Публикаций:
    0
    Регистрация:
    14 янв 2006
    Сообщения:
    4
    большое спасибо ответившим, дело было как раз в неправильных значениях для выходных параметров функций (OldProtect и output) - были обычные дворды вместо ссылок на них.

    вот, что называется свежий взгляд и внимательность, спасибо :)
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Попробуй такую штуку:

    Выделяеш память по записи и чтение и исполнению.Далее:

    push ebp
    push ebp
    mov ebp,esp
    push code1
    push code2
    ....
    xchg esp,esp
    mov [ebp], addr code1
    retn
    pop ebp