WIN7 X64 下VirtualProtectEx失败,错误:487 (Attempt to access invalid address).

神-气 2013-03-11 02:14:11
BOOL bReturn=VirtualProtect(lpOriginFuncAddress,JUMPLEN,PAGE_EXECUTE_READWRITE,&m_dwProtect);


这段code在XP,WIN7 32位下都没有问题,修改的是本进程(被注入DLL的目标进程)。

在WIN7 64下面出错,错误:487 (Attempt to access invalid address).

#define JUMPLEN 5
lpOriginFuncAddress是:0xf126cf60
...全文
1254 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
神-气 2013-03-13
  • 打赏
  • 举报
回复
引用 10 楼 BeanJoy 的回复:
lpOriginFuncAddress这是什么,如何来的?
先运行D3D9 DLL中的一段代码,得到某个点相对DLL基址的偏移dwOffset,然后再在恰当时候得到D3D9 DLL的基址 + dwOffset ,这个计算出来的值就是lpOriginFuncAddress。
BeanJoy 2013-03-13
  • 打赏
  • 举报
回复
lpOriginFuncAddress这是什么,如何来的?
Lactoferrin 2013-03-13
  • 打赏
  • 举报
回复
你不能直接登录到那个win7?
神-气 2013-03-12
  • 打赏
  • 举报
回复
引用 7 楼 Lactoferrin 的回复:
你先用调试器看看0xf126cf60是不是有效的地址
这个地址是在WIN7 X64平台下Log出来的,我这没办法debug,这段code是一个DLL里面的代码,DLL基址差不多是0xf1xxxx.. ,地址应该没错。
Lactoferrin 2013-03-12
  • 打赏
  • 举报
回复
你先用调试器看看0xf126cf60是不是有效的地址
神-气 2013-03-11
  • 打赏
  • 举报
回复
引用 5 楼 ydfivy 的回复:
具体怎么实现,楼主可以自己决定。方法大概如此。
我知道怎么Hook,现在问题是这个函数为什么会一直执行失败、
一个傻冒 2013-03-11
  • 打赏
  • 举报
回复
具体怎么实现,楼主可以自己决定。方法大概如此。
神-气 2013-03-11
  • 打赏
  • 举报
回复
引用 3 楼 ydfivy 的回复:
那12个字节的意思就是: 一是先保存API函数入口处的12个字节,然后把API入口处改为48H B8H XX XX XX XX XX XX XX XX 50H C3H,其中XX XX XX XX XX XX XX XX为我们的处理函数的64位地址,这12个字节相当于三条指令 mov rax,XX XX XX XX XX XX XX XX PUSH RA……
嗯,谢谢。但是我不只是Hook一次,我会不断修改那几个字节,又不断还原。所以必须将那几个字节的page属性修改一下。
一个傻冒 2013-03-11
  • 打赏
  • 举报
回复
那12个字节的意思就是: 一是先保存API函数入口处的12个字节,然后把API入口处改为48H B8H XX XX XX XX XX XX XX XX 50H C3H,其中XX XX XX XX XX XX XX XX为我们的处理函数的64位地址,这12个字节相当于三条指令 mov rax,XX XX XX XX XX XX XX XX PUSH RAX RET
一个傻冒 2013-03-11
  • 打赏
  • 举报
回复
我做过64位下的inline hook 不能用jmp 地址。 #define SHELL_CODE_LENGTH 12 #define ADDRESS_LENGTH 8 BYTE g_cCodeArray[SHELL_CODE_LENGTH] = {0}; BYTE g_byteShellCode[SHELL_CODE_LENGTH] = {0x48, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xC3}; BOOL InlineHook(char* pDLLName, char* pszFuncName, PDWORD pNewAddr) { OutputDebugString(L"InlineHook start"); BYTE byteArray[SHELL_CODE_LENGTH] = {0}; SIZE_T dwSize = 0; HMODULE hWantMod = ::GetModuleHandleA(pDLLName); if(!hWantMod) { hWantMod = LoadLibraryA(pDLLName); if(!hWantMod) return NULL; } FARPROC pfnOldFunc = ::GetProcAddress(hWantMod, pszFuncName); if(!pfnOldFunc) return NULL; g_pfnOldFunc = pfnOldFunc; ReadProcessMemory(GetCurrentProcess(), pfnOldFunc, byteArray, SHELL_CODE_LENGTH, &dwSize); if(dwSize > 0) { memcpy(g_cCodeArray, byteArray, SHELL_CODE_LENGTH); SIZE_T hookAddress = (SIZE_T)StartInlineHookProc; BYTE* pOffset = (BYTE*)(&hookAddress); memcpy(g_byteShellCode + 2, pOffset, ADDRESS_LENGTH); WriteProcessMemory(GetCurrentProcess(), pfnOldFunc, g_byteShellCode, SHELL_CODE_LENGTH, NULL); } OutputDebugString(L"InlineHook end"); return TRUE; }
神-气 2013-03-11
  • 打赏
  • 举报
回复
这个DLL是64位的,注入的目标进程也是64位的。

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧