Гость Gabriel Опубликовано 10 февраля, 2016 Поделиться Опубликовано 10 февраля, 2016 *(int*)0x02F4B641 = 0x90909090; memcpy((void*)(0x02F4B641), (char*)("\x90\x90\x90\x90"), 4); Здравствуйте, я хочу заменить ассемблерную инструкцию на свою (на NOP) но у меня вылетает игра. Делаю так: (инструкция имеет размер 4 байта) Помогите плиз что я делаю не так. Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 10 февраля, 2016 Поделиться Опубликовано 10 февраля, 2016 (изменено) 1 час назад, Gabriel сказал: *(int*)0x02F4B641 = 0x90909090; Вот тут не понятно, зачем ты получаешь указатель на адрес 0x02F4B641 возвращающий значение типа int и присваиваешь ему 0x90909090. Почему для записи байт не использовать WriteProcessMemory? BYTE buffer[] = {0x90,0x90,0x90,0x90}; memcpy((void*)0x2F4B641, &buffer, 4); Изменено 10 февраля, 2016 пользователем partoftheworlD 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Gabriel Опубликовано 10 февраля, 2016 Поделиться Опубликовано 10 февраля, 2016 7 минут назад, partoftheworlD сказал: Вот тут не понятно, зачем ты получаешь указатель на адрес 0x02F4B641 возвращающий int и присваиваешь ему DWord значение 0x90909090. Почему для записи байт не использовать WriteProcessMemory? Какая разница DWORD этот тот же самый int только unsigned размер все равно 4 байта. WriteProcessMemory я еще не знаю как работать с процессами да и какая разница. Вообще я пишу DLL. Ссылка на комментарий Поделиться на другие сайты Поделиться
uhx Опубликовано 10 февраля, 2016 Поделиться Опубликовано 10 февраля, 2016 Если пишешь DLL - то еще проще В таком случае используй memset( void *dstAddress, int value, size_t size ); Но дело в том, что и твой код выглядит верно, соответственно вполне может быть, что ты NOP'ишь важный участок кода, который отвечает за дальнейшее выполнение. Попробуй сначала сделать это в отладчике. Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 11 февраля, 2016 Поделиться Опубликовано 11 февраля, 2016 например так: DWORD OldProtect; DWORD_PTR Base = (DWORD_PTR)GetModuleHandle(L"user32.dll"); DWORD_PTR Address1 = Base+0x1000; VirtualProtect((LPVOID)Address1,4,PAGE_EXECUTE_READWRITE,&OldProtect); memcpy((void*)Address1,(char*)("\x90\x90\x90\x90"),4); VirtualProtect((LPVOID)Address1,4,OldProtect,&OldProtect); 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения