C++ - winsock-Haken
Ich versuche zu Haken winsock-send und recv " - Vorgang, um das Lesen sämtlicher traffic eines Prozesses.
Ich bin injectin den folgenden code als dll innerhalb der Ziel-Prozess
#include "dll.h"
#include <windows.h>
#include <winsock2.h>
#include <iostream>
#include <fstream>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
DllClass::DllClass()
{
}
DllClass::~DllClass ()
{
}
BYTE hook[6];
BYTE hook2[6];
BYTE jmp[6] = { 0xe9,0x00, 0x00, 0x00, 0x00 ,0xc3 };
ofstream myfile;
ofstream myfile2;
DWORD HookFunction(LPCSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction, unsigned char *lpBackup)
{
DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName);
ReadProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0);
DWORD dwCalc = ((DWORD)lpFunction - dwAddr - 5);
memcpy(&jmp[1], &dwCalc, 4);
WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, jmp, 6, 0);
return dwAddr;
}
BOOL UnHookFunction(LPCSTR lpModule, LPCSTR lpFuncName, unsigned char *lpBackup)
{
DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName);
if (WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0))
return TRUE;
return FALSE;
}
int nSend(SOCKET s, const char *buf, int len,int flags){
UnHookFunction("ws2_32.dll", "send", hook);
int result = send(s,buf,len,flags);
myfile.open ("C:\\tmp\\log.txt",ios::app | ios::binary);
myfile << buf;
myfile.close();
HookFunction("ws2_32.dll", "send", (LPVOID*) nSend, hook);
return result;
}
int nRecv(SOCKET s, char* buf, int len, int flags)
{
UnHookFunction("ws2_32.dll", "recv", hook2);
DWORD tmp;
len = recv(s, buf, len, flags);
if (len > 0)
{
myfile2.open ("C:\\tmp\\log.txt",ios::app | ios::binary);
myfile2 << buf;
myfile2.close();
}
HookFunction("ws2_32.dll", "recv", (LPVOID*) nRecv, hook2);
return len;
}
void fun(){ //<-- this is called after the DLL has been injected
HookFunction("ws2_32.dll", "send", (LPVOID*) nSend, hook);
HookFunction("ws2_32.dll", "recv", (LPVOID*) nRecv, hook2);
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Dieses funktioniert in einigen Fällen und in einigen nicht.
Wenn ich Spritzen es in filezilla ftp funktioniert es wie ein Charme und schreibt alles, was senden oder empfangen einer Datei.
Aber auf fast allen anderen Programmen (internet explorer, firefox usw.) es ist einfach schreibt einige bytes der Datei und der Prozess stürzt ab...
Hat jemand eine Idee was schief läuft?
InformationsquelleAutor incognym | 2013-03-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok. Seine arbeiten nun auch mit DataExecutionPrevention aktiviert. Im Fall, dass jemand ein ähnliches problem in der Zukunft, hier ist der funktionierende code:
dllmain.cpp:
dll.h
Getestet und funktioniert mit nahezu allen Programmen auf Win XP 32bit und einige Programme auf Win 7 x64
InformationsquelleAutor incognym
Werden, achten Sie auf die korrekte Aufrufkonvention auf Ihrem süchtig Funktionen. Die Standard-Aufrufkonvention ist in der Regel __cdecl. Aber auf 'senden' und 'empfangen' verwenden, __stdcall (
#define WINAPI __stdcall
)Der Hauptunterschied zwischen den beiden sind:
Wenn eine Funktion eine __cdecl-der Aufrufer ist verantwortlich für die stack-Bereinigung. Allerdings, wenn Sie eine Funktion mit __stdcall die Funktion ist verantwortlich für die stack-Bereinigung.
Sehen hier für weitere Informationen.
Versuchen Sie es mit FlushInstructionCache - "Anwendungen sollten aufrufen FlushInstructionCache wenn Sie erzeugen oder ändern von code im Speicher. Die CPU kann nicht erkennen, ändern und ausführen dürfen und der alte code zwischengespeichert."
Es wird immer besser... Jetzt bin ich aufrufen FlushInstructionCache am Ende HookFunction & UnHookFunction (vor der Rückkehr) Jetzt klappt es mit den InternetExplorer auf Win-XP x86, Aber es stürzt immer noch im InternetExplorer (32bit) auf Win7 x64 Und wenn ich versuche zu injizieren es in explorer.exe (unter Xp x86) das DataExecutionPrevention tötet den Prozess -.-' Irgendwelche Ideen? (BTW. vielen Dank so weit, dass Sie bereits viel geholfen)
x64 hook ist anders als x86. 0xE9 kann nur JMP 32 bits unterzeichnet. Also, wenn Ihr JMP größer ist als das, das könnte das problem sein. Versuchen Sie, ein 0xFF JMP 0x25. Auch auf x64 die ersten 5 bytes können unterschiedlich sein. (Nicht die übliche x86 (mov edi, edi), (push ebp), etc)
Mit VirtualProtect() fest der linken Seite Probleme. Vielen Dank für Eure Hilfe 🙂
InformationsquelleAutor user1052842