hook api DLL装载后被映射到主进程的虚拟内存空间中;这个地址是系统决定的;没有固定规律;API hooker不应该关心这个问题;获得你的目标API地址后只管hooking 就是了; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你所说的另一种方法是指IAT注入,原理是一样,jmp跳转 IAT 获得的地址 和 Getprocaddress的地址是一样的吗? GetProcAddress这个不是dll的么? 目标API的函数入口地址,用这2种方式得到的,是一样的。但是前者是用来修改IAT表,后者是为了在目标API的入口处填充上JMP指令,即修改的内存是不一样的。 使用代码改写法最有效,使用detoues吧. 应用层hook api有两个方法,你上面说的好像都是一种,不是两种!还有一种,是直接改变一个系统api的机器码,用机器码写入jmp 0x00ff00ff ,00ff00ff是你自己函数的地址,这个方法代码少,拦截PE输入表,稍微麻烦点,功能都一样 两种方法我都实现过, lz你看看代码吧 跳转(修改函数前5个字节): HANDLE user=LoadLibrary("user32.dll"); if(user==NULL) { MessageBox("1"); return; } FARPROC add=GetProcAddress((HMODULE)user, "MessageBoxA"); BYTE before[5]; ReadProcessMemory(GetCurrentProcess(), (void *)add, (void *)before, 8, NULL); BYTE FiveByte[5]; DWORD tojmp=(DWORD)NHMessageBoxA-(DWORD)add-5; FiveByte[0]=0xE9; BYTE temp; WORD wHiWord = HIWORD(tojmp); WORD wLoWord = LOWORD(tojmp); temp = LOBYTE(wLoWord); // ------------------------- FiveByte[1] = temp; temp = HIBYTE(wLoWord); FiveByte[2] = temp; temp = LOBYTE(wHiWord); FiveByte[3] = temp; temp = HIBYTE(wHiWord); FiveByte[4] = temp;修改ITA:PROC pfnCur=GetProcAddress(GetModuleHandle("user32.dll"), "SetRect"); CString temp; ULONG size; IMAGE_IMPORT_DESCRIPTOR* iid=(IMAGE_IMPORT_DESCRIPTOR*)ImageDirectoryEntryToData(m_myself, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &size); if(iid==NULL) { MessageBoxA(_T("no idd")); return; } for(;iid->Name;iid++) { char* module=(char *)((DWORD)m_myself+iid->Name); //MessageBox(module); if(lstrcmpiA(module, "user32.dll")==0) break; } if(iid->Name==0) { MessageBoxA("no mod"); return; } IMAGE_THUNK_DATA* itd=(IMAGE_THUNK_DATA*)((DWORD)m_myself+iid->FirstThunk); for(; itd->u1.Function ;itd++) { PROC ppfn=(PROC)itd->u1.Function; if(ppfn==pfnCur) MessageBoxA("same"); } apihook??我觉得 不需要发帖了 没有几个人会 回答你的 技术都是不外传的 自己研究吧 我也在找呢 两种技术,缺点都很明显,修改IAT的话,动态加载DLL的话比较难HOOK到;修改函数入口的话,存在同步问题,还是推荐微软的detours,回楼上的,技术是有人共享的 你看下操作系统中的 存储管理把 上面有详细的讲述寻址问题。 程序中的地址是偏移地址,也就是逻辑地址。在运行中,由于内存是多道的。操作系统的储存管理程序,给程序分配一个基地址B,将地址B放到寄存器中。实际物理地址=B+偏移地址~~~~~ 我最近也在研究detours,这可是好东西,只要是好东西,总会有大公无私的人。要想了解hook api, detours一定要了解。 闷Hook API还是 叫技术?Hook SSDT都太有人玩了孤陋寡闻了 detours很容易写,核心代码不超过200行 如何在edit中输入时鼠标光标(cursor)不消失 简单问题 点鼠标右键,为何老出来windows installer?? 郁闷,散分 大家帮看看这段问题为什么运行失败 如何得到网页的数据 还是参数传递问题,帮忙。 存取图像文件的问题 吐血大送分 请教:使用CGAL时出现unresolved external symbol错误 请教怎样通过vc保存asp网页图片。 GetCollect(vIndex)方面的问题
但是前者是用来修改IAT表,后者是为了在目标API的入口处填充上JMP指令,即修改的内存是不一样的。
跳转(修改函数前5个字节):
HANDLE user=LoadLibrary("user32.dll");
if(user==NULL)
{
MessageBox("1");
return;
}
FARPROC add=GetProcAddress((HMODULE)user, "MessageBoxA");
BYTE before[5];
ReadProcessMemory(GetCurrentProcess(), (void *)add, (void *)before, 8, NULL);
BYTE FiveByte[5];
DWORD tojmp=(DWORD)NHMessageBoxA-(DWORD)add-5;
FiveByte[0]=0xE9;
BYTE temp;
WORD wHiWord = HIWORD(tojmp);
WORD wLoWord = LOWORD(tojmp);
temp = LOBYTE(wLoWord); // -------------------------
FiveByte[1] = temp;
temp = HIBYTE(wLoWord);
FiveByte[2] = temp;
temp = LOBYTE(wHiWord);
FiveByte[3] = temp;
temp = HIBYTE(wHiWord);
FiveByte[4] = temp;
修改ITA:
PROC pfnCur=GetProcAddress(GetModuleHandle("user32.dll"), "SetRect");
CString temp;
ULONG size;
IMAGE_IMPORT_DESCRIPTOR* iid=(IMAGE_IMPORT_DESCRIPTOR*)ImageDirectoryEntryToData(m_myself, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &size);
if(iid==NULL)
{
MessageBoxA(_T("no idd"));
return;
} for(;iid->Name;iid++)
{
char* module=(char *)((DWORD)m_myself+iid->Name);
//MessageBox(module);
if(lstrcmpiA(module, "user32.dll")==0)
break;
} if(iid->Name==0)
{
MessageBoxA("no mod");
return;
} IMAGE_THUNK_DATA* itd=(IMAGE_THUNK_DATA*)((DWORD)m_myself+iid->FirstThunk); for(; itd->u1.Function ;itd++)
{
PROC ppfn=(PROC)itd->u1.Function;
if(ppfn==pfnCur)
MessageBoxA("same");
}