最近在研究如何通过DLL的注入达到截获网络包。
    目前的思路是这样的,使用一个现成的DLL文件“IPPACK.DLL”,里面的函数设计思路就是跳转“Ws2_32.dll”的recv,send,recvfrom,sendto的函数地址,转变成h_hookrecv,h_hooksend,h_hookrecvfrom,h_hooksendto,这四个函数的编程思路就是利用createfilemapping开辟一个内存映射,将原ws2_32.dll的recv,send,recvfrom,sendto函数接收和发送的数据映射到共享内存中。
    例如,h_hookrecv开辟的内存映射名为“IPPACK_RECEIV”,内存映射名为“IPPACK_RECEIV”就保存了Ws2_32.dll中recv中接收的数据。
    下面贴出部分源码://sharememory.h开辟内存映射空间类
#ifndef __SHAREMEMORY_H__
#define __SHAREMEMORY_H__class CShareMemory
{
public:
// 构造函数和析构函数
CShareMemory(const char * pszMapName, int nFileSize = 0, BOOL bServer = FALSE);
~CShareMemory();
// 属性
LPVOID GetBuffer() const { return  m_pBuffer; }
// 实现
private:
HANDLE m_hFileMap;
LPVOID m_pBuffer;
};inline CShareMemory::CShareMemory(const char * pszMapName, 
int nFileSize, BOOL bServer) : m_hFileMap(NULL), m_pBuffer(NULL)
{
if(bServer)
{
// 创建一个内存映射文件对象
m_hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, 
NULL, PAGE_READWRITE, 0, nFileSize, pszMapName);
}
else
{
// 打开一个内存映射文件对象
m_hFileMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, pszMapName);
}

// 映射它到内存,取得共享内存的首地址
m_pBuffer = (LPBYTE)MapViewOfFile(
m_hFileMap,
FILE_MAP_ALL_ACCESS,
0,
0,
0
);
}
//IPPACKLIB.CPP
int WINAPI hook_recv(SOCKET s, char FAR *buf, int len, int flags)
{
CShareMemory sm("IPPACK_RECEIVE", sizeof(CMessageData) + len, TRUE);
CMessageData *pData = (CMessageData*)sm.GetBuffer(); // 调用原来的函数,接受数据,设置参数
g_recv.Unhook();
int nRet = ::recv(s, pData->data(), len, flags);
g_recv.Rehook(); pData->dwThreadId = ::GetCurrentThreadId();
pData->socket = s;
pData->nDataLength = nRet; // 通知主窗口,进行过滤
::SendMessage(g_hWndCaller, HM_RECEIVE, 0, 0); // 返回数据
memcpy(buf, pData->data(), pData->nDataLength); return nRet;
}现在碰到的问题是,我在主函数中创建一个CShareMemory类对象sm,以“IPPACK_RECEIVE”初始化后,将IPPACK.DLL注入到进程中后,得到的sm地址是有的,但是sm中的m_hFileMap和m_pBuffer都是为全0,我想问下,这是什么原因?

解决方案 »

  1.   

    注入是成功的,因为我是在命令行方式下运行,我在想,是不是要用循环来监听recv的触发后,才创建文件映射
      

  2.   


    实验过后发现不是,我用sleep暂停了运行后,触发了recv函数后,仍然和上述情况一样
      

  3.   


    因为我用的是现成的dll,原来是窗口模式运行的,我的目的只是把它简化命令行形式,所以我只是简单地在main函数里面注入dll,请问对hook还要做什么其他工作么?
      

  4.   

    建议用XueTr.exe来查看一下注入后的HOOK是不是成功了。。
      

  5.   

    程序发个包试下就ok了啊
    其实hook网络的代码现成的有好多了
      

  6.   

    使用HOOK技术还不如使用SPI。
    系统专门提供的网络过滤接口。HOOK方式截包的,还没听说过。
      

  7.   

    RING3 下用 SPI .RING0 下用 TDI 和 NDIS吧