好的,我一直在玩一些钩子。我最近从学习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;
}
答案 0 :(得分:0)
好吧,FireFox似乎没有拨打send
或receive
。你有没有理由怀疑他们应该准确地称这些功能?
答案 1 :(得分:0)
实际上,Firefox不会发送或收回任何数据包。(如果您要求申请)请使用plugin_container
而不是firefox(实际上是发送和重新发送数据包)。如果你没有将你的flash播放器更新到最新状态,那么你在进程列表中寻找第二个plugin_container
进程。
您可以检查通过WPE
或rPE
:)等数据包工具发送和回收数据包的过程是否有好日子
答案 2 :(得分:0)
send
和recv
但是当我在进程列表中使用第二个plugin-container.exe
,它实际上向我显示了一些数据包。有时plugin-container.exe
使用winsock 1.0
,有时会使用Winsock 2.0 (WSASend,WSARecv)
。这背后的原因是概率。 Firefox通过plugin-container.exe
处理扩展程序,例如Flash Player
,Shockwave Player
或Java
等,因此firefox本身不需要调用这些函数。这些扩展中的应用程序将调用winsock而不是firefox。
这只是我的一种方法。祝你好日子