关于HOOK gethostbyname的问题

tushu 2012-10-24 03:26:20
大家好,我最近在研究怎样HOOK到gethostbyname被进程调用的情况,现在初步是想做到当该函数被调用时,记录调用的时间。
使用的方法是通过修改IAT表,并用远程线程注入的办法。
注入程序很简单,没有问题;现在不知道HOOK那一块儿出了什么问题。把代码贴出来,恳请高手指点!!!
HookIAT.cpp:使用IAT法挂钩.
//
#include "stdafx.h"
#include <afxdllx.h>
#include "HookApi_IAT.h"
#include <windows.h>
#include <time.h>
#include <winsock2.h>
#include<iostream>
#include<fstream>
using namespace std;

void WINAPI ExampleIAT();
void WINAPI ExampleIAT_OFF();

static AFX_EXTENSION_MODULE HookIATDLL = { NULL, NULL };

//extern "C" int APIENTRY
extern "C" __declspec(dllexport) struct hostent* FAR IATgethostbyname(const char* name );


int DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);

if (dwReason == DLL_PROCESS_ATTACH)
{
ExampleIAT();
}
else if (dwReason == DLL_PROCESS_DETACH)
{
ExampleIAT_OFF();
TRACE0("HOOKIAT.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(HookIATDLL);
}
return 1;
}

//---------------------------------------------------------------------------
CHookApi_IAT myIAT;
struct hostent* FAR IATgethostbyname( const char* name ) {
struct hostent* tmp = NULL;

CStdioFile file;
__time32_t nNow = 0;
tm stNow = {0};
_time32(&nNow);
_localtime32_s(&stNow,&nNow);
char buff[255] = {0};
_snprintf(buff,sizeof(buff)-1,"%d.%d.%d.%d.%d.%d",
stNow.tm_year + 1900,
stNow.tm_mon + 1,
stNow.tm_mday,
stNow.tm_hour,
stNow.tm_min,
stNow.tm_sec);
ofstream outfile("gethostbyname.txt",ios::app); //写入文件
for(int i=0;i<255;i++)
outfile<<buff[i];
tmp = gethostbyname(name);
return tmp;
}

//---------------------------------------------------------------------------
// 通过IAT挂钩API
void WINAPI ExampleIAT()
{
PROC HookAPIAddr =(FARPROC)
GetProcAddress(GetModuleHandle("wsock32.dll"), "gethostbyname");
HMODULE hModule= GetModuleHandle(NULL);

// 挂钩所有模块,备用调用.
// myIAT.HookAllAPI("user32.dll",HookAPIAddr,(PROC)IATMessageBoxA);

// 挂钩单个模块.
myIAT.HookOneAPI("wsock32.dll",HookAPIAddr,(PROC)IATgethostbyname,hModule);
}

//---------------------------------------------------------------------------
// 卸载IAT挂钩API
void WINAPI ExampleIAT_OFF()
{
HMODULE hModule= GetModuleHandle(NULL);
myIAT.HookOneAPI_OFF("wsock32.dll",hModule);
}


// HookApi_IAT.cpp:实现CHookApi_IAT类.
//
#include "stdafx.h"
#include "HookApi_IAT.h"
#include <tlhelp32.h>
#include <imagehlp.h>
#pragma comment (lib,"imagehlp.lib")

//---------------------------------------------------------------------------
CHookApi_IAT::CHookApi_IAT()
{
}

//---------------------------------------------------------------------------
CHookApi_IAT::~CHookApi_IAT()
{
}

//---------------------------------------------------------------------------
BOOL CHookApi_IAT::HookAllAPI(LPCTSTR ModuleName, PROC HookAPIAddr, PROC lpNewFunc)
{
if (ModuleName == NULL||HookAPIAddr == NULL)
return FALSE;

HANDLE hSnapshot;
MODULEENTRY32 hMod = {sizeof(hMod)};
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,NULL);

// 取得所有模块列表中的指定的模块.
BOOL bMoreMods = Module32First(hSnapshot, &hMod);
if (bMoreMods == FALSE) return FALSE;

// 循环取得想要的模块.
for (;bMoreMods; bMoreMods = Module32Next(hSnapshot, &hMod))
{
MEMORY_BASIC_INFORMATION mbi;
// 获取本模块信息.
VirtualQuery(this,&mbi,sizeof(mbi));
// 不在自己的模块中挂钩函数.
if (hMod.hModule != (HMODULE)mbi.AllocationBase)
{
//hMod.hModule:指向当前被挂钩进程的每一个模块.
HookOneAPI( ModuleName,HookAPIAddr,
lpNewFunc,hMod.hModule);
}
}

return TRUE;
}

//---------------------------------------------------------------------------
BOOL CHookApi_IAT::HookOneAPI(PCSTR ModuleName, PROC HookAPIAddr,
PROC lpNewFunc, HMODULE hmodCaller)
{
DWORD size;

PIMAGE_IMPORT_DESCRIPTOR pImportDesc =
(PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(
hmodCaller,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);

if(pImportDesc == NULL) return FALSE;

for (;pImportDesc->Name;pImportDesc++)
{
LPSTR pszDllName = (LPSTR)((PBYTE)hmodCaller + pImportDesc->Name);
if(lstrcmpiA(pszDllName,ModuleName) == 0) break;
}

if(pImportDesc->Name == NULL) return FALSE;
PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)
((PBYTE)hmodCaller + pImportDesc->FirstThunk);//IAT

for(;pThunk->u1.Function;pThunk++)
{
PROC * ppfn= (PROC *)&pThunk->u1.Function;

m_lpOldFunc = (PROC)pThunk->u1.Function;
m_lpNewFunc =lpNewFunc;

if (*ppfn == HookAPIAddr)
{
MEMORY_BASIC_INFORMATION mbi;
ZeroMemory(&mbi, sizeof(MEMORY_BASIC_INFORMATION));
VirtualQuery(ppfn,&mbi,sizeof(MEMORY_BASIC_INFORMATION));
VirtualProtect(mbi.BaseAddress,mbi.RegionSize,
PAGE_READWRITE,&mbi.Protect);
*ppfn = *lpNewFunc;
DWORD dwOldProtect;
VirtualProtect(mbi.BaseAddress,mbi.RegionSize,
mbi.Protect,&dwOldProtect);
return TRUE;
}
}

return FALSE;
}

//---------------------------------------------------------------------------
BOOL CHookApi_IAT::HookOneAPI_OFF(PCSTR ModuleName, HMODULE hmodCaller)
{
return HookOneAPI(ModuleName, m_lpNewFunc,m_lpOldFunc,hmodCaller);
}
...全文
319 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tushu 2012-10-24
  • 打赏
  • 举报
回复
这个代码是我根据《Windows核心编程》随书源码改的,本来是HOOK MessageBox的,当时也调试成功了。现在改成gethostbyname,结果不尽人意,急!!!!求帮助!!!!
赵4老师 2012-10-24
  • 打赏
  • 举报
回复
换非IE浏览器试试。
tushu 2012-10-24
  • 打赏
  • 举报
回复
这会儿居然无法访问http://www.codeproject.com,天啊,这是什么情况啊
tushu 2012-10-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
在http://www.codeproject.com搜Hook
[/Quote]
高手帮忙看看吧,小弟是新手,还请多多指教!
赵4老师 2012-10-24
  • 打赏
  • 举报
回复
前言最近随着计算机的发展,软件日益更新,有很多公司发布的产品遭到篡改和破解,在总众多年的历史种逐渐形成了软件保护与软件破解之间的对抗产生了软件逆向工程这本门技术将在如下的课程讲解各种软件逆向知识,软件保护知识,已经破解脱壳反调试知识,为初期学软件逆向不懂而又迷茫的同学门指明一条道路此套课堂能有效帮助同学们解决软件逆向中所遇到的大部分问题大纲软件逆向工程高级班分为反调试篇汇编篇算法篇补丁篇HOOK篇将在如上这几篇对软件逆向的各个方面进行详解,包括网络验证的分析思路,封包算法的提取,以及各种软件保护技术,无论哪一篇都会从诸多个方面的细节进行详解反调试篇:分为PEB,时间校验,CRC,NtQuery函数,内核过渡等知识要领与诸多方面的综合性详解,细节分为每一节课,每一节课目标清晰无比,每一节深入精髓进行讲解!汇编篇:一个程序编译完成之后是如何通过在计算机运行起来的,其中少不了底层知识的汇编指令,汇编篇中将深入浅出的带领同学们对MASM32SDK的一套汇编库中开发程序,熟悉汇编的原理,如何运用汇编写出一套花指令,并且去除指令,方便以后的算法学习以及为今后的学习打下坚实的基础算法篇:随着编程语言的发展,编程语言的标准也在发展,一些编译器善于运用数学的手法,对程序进行各种优化,然后我们进行分析,我们得需要一步步还原这个优化或清晰了解这个优化才有可能掌握这个数学模型优化,进一步还原代码,算法篇知识要领将在优化,技巧这方面表现的玲离尽致!此篇会带领同学们分析多个语言的算法,包括C/C++算法还原代码还原易语言代码还原 算分开库的实现,制作自己的第一个注册机等!补丁篇:说到补丁,同学们可能第一个想到的就是对方一些网络验证所用到的技巧,我的课程这一方面虽有涉及,但是补丁技术远远不止这一点,我的课程会详解更多的补丁知识原理,包括什么是补丁,补丁的真正概念,前辈们是如何善用补丁对程序的漏洞进行修补损坏的程序。将在此篇一一介绍HOOK篇:详细详解了各种HOOK的原理以及实现代码,包括网上流行所说的超级HOOK,COMHOOK,协议HOOK,代理中转等方法,怎么定位关键位置,环境的保存知识要领,hook关键的注意事项,为自己以后做hook行业打下坚实的基础课程每一个细节讲究的深入骨髓,通俗易懂的学习方式,全程贯彻原理,软件逆向中必不可少少的教程!

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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