实现HOOK其他进程的Messagebox(1)-创新互联
HOOK --实现HOOK其他进程的Messagebox、、
创新互联建站服务项目包括浦口网站建设、浦口网站制作、浦口网页制作以及浦口网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,浦口网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到浦口省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!思路方法如下:
1 DLL的编写(实现IAT hook)、
2 DLL注入工具(远程线程技术和简单的MFC控件知识)、
3简单的测试程序、
1编写dll、
之前有篇文章HOOK -- IAT HOOK本进程MessageBox、这里部分代码是相同的、毕竟均为IAT HOOK嘛、、
DLL与跟exe有个main或者WinMain入口函数一样也有一个入口函数DllMain、不过很多仅仅包含资源信息的DLL是没有DllMain函数的、其原型如下
BOOL WINAPI DllMain( HINSTANCE hInstance, ULONG ulReason, LPVOID Reserved);
何时调用Dllmain、
DllMain的第二个参数fdwReason指明了系统调用Dll的原因、
DLL_PROCESS_ATTACH、当一个DLL文件被映射到进程的地址空间时、用此参数掉dllmain
当同一DLL再次映射时不会再调DllMain函数只增加dll次数、
DLL_PROCESS_DETACH、当DLL被从进程的地址空间解除映射时FreeLibrary
进程结束而解除DLL映射(若是使用的TerminateProcess则不调)
DLL_THREAD_ATTACH、当进程创建一线程时,跟DLL_PROCESS_ATTACH区别
无论何时创建线程均会用此参数调用Dllmain
DLL_THREAD_DETACH 如果线程调用了ExitThread来结束线程(线程函数返回时,系统也会自动调用ExitThread),若是TerminateThread也不会调用DllMain.
这里选择如下方式编写DllMain函数
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
If ( fdwReason= =DLL_PROCESS_ATTACH) //加载dll时候调用DllMain
_beginthread(ThreadProc,0,NULL); //创建线程
return TRUE;
}
就是说当dll被加载的时候(LoadLirary)、在DllMain中实现创建ThreadProc线程函数、、而ThreadProc函数里边是我们IAT HOOK的核心代码、、
ThreadProc函数: 功能是 一个应用程序定义的函数作为一个线程的起始地址服务、
要Hook Messagebox需写一个自己的Messagebox如下:
int __stdcall HookMBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,UINT uType)
{
return MessageBox(NULL,"哈哈! HOOK到MessageBox了","HOOK",MB_OK); //证明一下Hook成功
}
在线程函数中完成我们的ITA HOOK的代码:
1 获取本进程的模块基址 HANDLE pBegin = GetModuleHandle(NULL);
2 初始化PE结构得到IAT的地址
PBYTE pBegin2 = (PBYTE)pBegin;
PIMAGE_DOS_HEADER DOS = PIMAGE_DOS_HEADER(pBegin2);
PIMAGE_NT_HEADERS NT = PIMAGE_NT_HEADERS(pBegin2+DOS->e_lfanew);
PIMAGE_OPTIONAL_HEADER OPTION = &(NT->OptionalHeader);
PIMAGE_IMPORT_DESCRIPTOR IMPORT =PIMAGE_IMPORT_DESCRIPTOR(OPTION->DataDirectory[1].VirtualAddress + pBegin2);
3 遍历寻找IMPORT->FirstThunk的内容当其与真正的MessageBox的地址相等时即可
真正的MessageBoxA的地址在程序之前得到即 DWORD RealBox = (DWORD)MessageBox、
while (pOriginalThunk->u1.Function) //记住是Function
{
PDWORD lpAddr = (DWORD *)( pBegin2+ (DWORD)IMPORT->FirstThunk);
if (*lpAddr = = RealBox)
{
找到后即找到了此PE的MessageBox在其IAT中的位置、接下来就是改之、
修改的内存的话首先内存的保护属性必须可读可写所以使用以下几个API
DWORD dwOLD;
MEMORY_BASIC_INFORMATION mbi;
//获取需要修改的内存的信息存放于MEMORY_BASIC_INFORMATION结构
VirtualQuery (lpAddr, &mbi, sizeof(mbi));
//修改此内存保护属性为并将原有的保护属性存放于&dwOLD中
VirtualProtect (lpAddr, sizeof(DWORD), PAGE_READWRITE, &dwOLD);
//将咱自己的HookMBox函数的地址写到此内存、
WriteProcessMemory (GetCurrentProcess(), lpAddr, &ADD, sizeof(DWORD), NULL);
//将保存的原有的内存保护属性写回去、、
VirtualProtect (lpAddr, sizeof(DWORD), dwOLD, 0 );
break;
}
pOriginalThunk++;
}
IMPORT++;
}
到此DLL文件编写完毕、、后边继续记录注入DLL(远程线程技术、、)
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章标题:实现HOOK其他进程的Messagebox(1)-创新互联
转载来源:http://myzitong.com/article/dcephc.html