今天测试了一个IAT Hook,因为懒直接抄了一段代码,搜索DLL名称、搜索IAT地址,代码一气呵成,函数地址所在IAT位置已经找到。然后VirtualProtect修改内存属性执行替换,结果发现VirtualProtect返回值一直是FALSE,错误代码是ERROR_NOACCESS
998L。百思不得其解,最后找到了错误原因。
ERROR_NOACCESS 错误原因
lpflOldProtect参数,也就是用于保存原始的访问属性,必须要存在且有效,不能直接设置为NULL,否则VirtualProtect或者VirtualProtectEx会直接返回失败。
DWORD lpfOldProtect = 0;
//pThunk 是 PIMAGE_THUNK_DATA32
BOOL iRet =VirtualProtect( (LPVOID) ((DWORD)&pThunk->u1.Function&~0xFFF),0x1000, PAGE_READWRITE, &lpfOldProtect);