DLL装载后被映射到主进程的虚拟内存空间中;这个地址是系统决定的;没有固定规律;API hooker不应该关心这个问题;获得你的目标API地址后只管hooking 就是了;
解决方案 »
- 怎样防止自己的程序在运行时不被别的程序远程注入呢?
- MFC如何引用TFF文件
- 求一段代码或示例,可以在本地访问网络上的一个计数器
- 为什么呀不提示?
- 不行了~高手快来~不要看分阿~当做好事~要死了~
- updat语句是怎么写?小弟忘了!
- 如何让非模态对话框始终在最上层?(Up有分)
- 怎样可以控制其他EXE程序运行关闭及显示隐藏????
- 我希望创建一个类似于MFC工程一样的有窗口的ATL工程,但是用默认的ATL wizard创建的却是无窗口的控件,那我该怎么办呢?
- 如何通过WebBrower对象得到网页的html源码?
- 请教怎样通过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");
}