приветствую всех дзенствующих. есть кусок кода, работает половинчато %) в идеале реализует сплайсинг api функции. преамбула Код (Text): void* func void* intercept HANDLE CurrProc; typedef struct str_func_stub // структура выравнена по 1 байту { BYTE jmpop; DWORD addr; } func_stub; func_stub mystub; .... mystub.jmpop = 0xE9; mystub.addr = (DWORD)((void*)intercept)-(DWORD)((void*)func)-5; CurrProc=INVALID_HANDLE_VALUE; //сохраняем старое начало функции if(!VirtualProtect(func, 255, PAGE_EXECUTE_READWRITE, OldProtect)) { // вышибает здесь output=GetLastError(); sprintf(&info,"CurrProc =%i,VirtualProtect=%i,func=%X,intercept=%X",CurrProc,output,func,intercept); MessageBox(0,info,"dll",0); return FALSE; } ReadProcessMemory(CurrProc, func, &save, sizeof(old_bytes), output); WriteProcessMemory(CurrProc, func, &mystub, sizeof(mystub), output); sprintf(&info,"CurrProc =%i,output=%i,func=%X,intercept=%X",CurrProc,output,func,intercept); MessageBox(0,info,"dll",0); VirtualProtect(func, 255, OldProtect, OldProtect); return TRUE; фабула. VirtualProtect выскакивает с ERROR_NOACCESS, почему? что может ей мешать? если убрать условие, а VirtualProtect просто вызвать, то наблюдается следующее: 1. если писать в память с помощью WriteProcessMemory, то в иде по адрессу func видно, что записывается не все, что нужно. примерно так: 00 00-55 8B 00, где 00 - правильно записаные данные, т.е. 55 8B никак не меняются 8( 2. если писать в память обычным образом, то прилага наглухо виснет. такие дела. помогите, куда можно копнуть, чтобы разобраться в чем дело?
Да скорее всего с OldProtect напутал Это должен быть указатель на существующую переменную DWORD - объявляешь DWORD OldProtect и передаешь в VirtualProtect по ссылке &OldProtect
Код (Text): int WriteMemory(HANDLE hProcess, void* AddressToWrite, void* lpBytesToWrite, DWORD nSize) { DWORD OldProtect; int retValue = WriteProcessMemory(hProcess, AddressToWrite, lpBytesToWrite, nSize, NULL); if(!retValue) { if(VirtualProtectEx(hProcess, AddressToWrite, nSize, PAGE_READWRITE, &OldProtect)) { retValue = WriteProcessMemory(hProcess, AddressToWrite, lpBytesToWrite, nSize, NULL); VirtualProtectEx(hProcess, AddressToWrite, nSize, OldProtect, &OldProtect); } } return retValue; }
большое спасибо ответившим, дело было как раз в неправильных значениях для выходных параметров функций (OldProtect и output) - были обычные дворды вместо ссылок на них. вот, что называется свежий взгляд и внимательность, спасибо
Попробуй такую штуку: Выделяеш память по записи и чтение и исполнению.Далее: push ebp push ebp mov ebp,esp push code1 push code2 .... xchg esp,esp mov [ebp], addr code1 retn pop ebp