挂钩发送()recv()

时间:2015-05-29 15:00:31

标签: c++

好的,我一直在玩一些钩子。我最近从学习php到c / c ++几个月了。 所以我决定做一些关于挂钩查找来自msdn的一些事实以及其他一些事情。

我尝试将这个DLL注入到Firefox中,当我这样做时,我没有看到它打开hookFile.txt并将缓冲区保存到.txt文件中,我有什么问题吗? 我的源代码就像这样

“DLLHookSendRecv.h”

#include <windows.h>
#include <stdio.h>

void ApiHook(LPSTR Module,LPCSTR OldFunc,LPVOID NewFunc,unsigned char *backup);
extern "C" _declspec(dllexport) void newSend(SOCKET s, const char* buf, int len, int flags);
extern "C" _declspec(dllexport) void newRecv(SOCKET s, const char* buf, int len, int flags);

的main.cpp

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <Winsock.h>
#include "DLLHookSendRecv.h"

#pragma comment (lib,"ws2_32")

typedef int (*WINAPI oldsend)(SOCKET s,const char* buf,int len,int flags);
typedef int (*WINAPI oldrecv)(SOCKET s,const char* buf,int len,int flags);

BYTE hook[6];

void ApiHook(LPSTR Module,LPCSTR OldFunc,LPVOID NewFunc,unsigned char *backup)
{
  DWORD dwProtect;
  HINSTANCE hLib = LoadLibraryA(Module);
  DWORD OldFuncAddr = (DWORD)GetProcAddress(hLib,OldFunc);
  DWORD NewFuncAddr = (DWORD)NewFunc;

  BYTE jmp[6] ={0xE9,0x00,0x00,0x00,0x00,0xC3};
  DWORD  jmpAddr = (NewFuncAddr - OldFuncAddr) -5;
  memcpy(&jmp[1],&jmpAddr,4);

  VirtualProtect((LPVOID) OldFuncAddr,6,PAGE_EXECUTE_READWRITE,&dwProtect);
  WriteProcessMemory(GetCurrentProcess(),(LPVOID)OldFuncAddr,jmp,6,0);
  VirtualProtect((LPVOID)OldFuncAddr,6,dwProtect,&dwProtect);
}

extern "C" _declspec(dllexport) void newSend(SOCKET s, const char* buf, int len, int flags)
{
   FILE* logFile;
   logFile = fopen("hookFile.txt","w");
   fprintf(logFile,"%s",buf);
   fclose(logFile);
  return send(s,buf,len,flags);
}

extern "C" _declspec(dllexport) void newRecv(SOCKET s, const char* buf, int len, int flags)
{
   FILE* logFile;
   logFile = fopen("hookFile.txt","w");
   fprintf(logFile,buf);
   fclose(logFile);
  return recv(s,buf,len,flags);
}

BOOL APIENTRY DllMain(HINSTANCE hInstDLL,DWORD ul_reason_for_call,LPVOID lpReserved)
{
  switch(ul_reason_for_call)
  {
    case DLL_PROCESS_ATTACH:
      ApiHook("ws2_32.dll","send",newSend,hook);
      ApiHook("ws2_32.dll","recv",newRecv,hook);
    break;
    case DLL_PROCESS_DETACH:
    break;
    case DLL_THREAD_ATTACH:
      ApiHook("ws2_32.dll","send",newSend,hook);
      ApiHook("ws2_32.dll","recv",newRecv,hook);
    break;
    case DLL_THREAD_DETACH:
        break;
  }
    return TRUE;
}

3 个答案:

答案 0 :(得分:0)

好吧,FireFox似乎没有拨打sendreceive。你有没有理由怀疑他们应该准确地称这些功能?

答案 1 :(得分:0)

实际上,Firefox不会发送或收回任何数据包。(如果您要求申请)请使用plugin_container而不是firefox(实际上是发送和重新发送数据包)。如果你没有将你的flash播放器更新到最新状态,那么你在进程列表中寻找第二个plugin_container进程。

您可以检查通过WPErPE :)等数据包工具发送和回收数据包的过程是否有好日子

答案 2 :(得分:0)

嗯......我在firefox上玩游戏(特别是flash游戏),当我尝试通过dissambler,调试器或数据包读取工具跟踪数据包时,Firefox本身从不调用sendrecv但是当我在进程列表中使用第二个plugin-container.exe,它实际上向我显示了一些数据包。有时plugin-container.exe使用winsock 1.0,有时会使用Winsock 2.0 (WSASend,WSARecv)。这背后的原因是概率。 Firefox通过plugin-container.exe处理扩展程序,例如Flash PlayerShockwave PlayerJava等,因此firefox本身不需要调用这些函数。这些扩展中的应用程序将调用winsock而不是firefox。  这只是我的一种方法。祝你好日子

相关问题