DnsQuery, hook et detours [Résolu]

wxccxw 759 Messages postés samedi 15 mai 2004Date d'inscription 30 janvier 2011 Dernière intervention - 11 févr. 2010 à 02:12 - Dernière réponse : wxccxw 759 Messages postés samedi 15 mai 2004Date d'inscription 30 janvier 2011 Dernière intervention
- 11 févr. 2010 à 12:44
Bonjour,
j'ai ecrit une dll que j'injecte dans IE ou firefox pour savoir l'host qu'il demande a charger afin de filtrer.
voici donc le code
#include <windows.h>
#include <fstream>
#include <stdio.h>
#include <winDNS.h>
using namespace std;
#pragma comment(lib,"dnsapi.lib")
#include "main.h"

ofstream ofile;	
char dlldir[320];
HANDLE oDnsQuery;
BYTE *cDnsQuery;
FARPROC fpDnsQuery;

DNS_STATUS WINAPI hkDnsQuery(PCTSTR lpstrName,WORD wType, DWORD Options, PIP4_ARRAY pExtra, PDNS_RECORD *ppQueryResultsSet, PVOID *pReserved)
{
RetourFunc((BYTE*)fpDnsQuery,(BYTE*)oDnsQuery,5);
char * temp = new char[strlen(lpstrName)+1];
strcpy(temp,lpstrName);
add_log("Called: Option : %x, Type : %x (%s)", Options,wType, temp);
DNS_STATUS out = DnsQuery_W((PCWSTR)lpstrName, wType, Options, pExtra, ppQueryResultsSet, pReserved);
CustomDetourFunc((BYTE*)fpDnsQuery,(BYTE*)&hkDnsQuery,5,(BYTE*)cDnsQuery);
return out;
}


bool WINAPI DllMain(HMODULE hDll, DWORD dwReason, PVOID pvReserved)
{
if(dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hDll);

GetModuleFileName(hDll, dlldir, 512);
for(int i strlen(dlldir); i > 0; i--) { if(dlldir[i] '\\') { dlldir[i+1] = 0; break; } }
ofile.open(GetDirectoryFile("ttnlog.txt"), ios::app);

add_log("\n---------------------\nBig Brother Loaded...\n---------------------");

HMODULE hMod = LoadLibrary("Dnsapi.dll");
fpDnsQuery = GetProcAddress(hMod,"DnsQuery_W");
if(hMod!=NULL && fpDnsQuery!=NULL)
add_log("hMod and Farproc Found !\n");
cDnsQuery = (BYTE*)malloc(5+5);
oDnsQuery = CustomDetourFunc((BYTE*)fpDnsQuery,(BYTE*)&hkDnsQuery,5,(BYTE*)cDnsQuery);

return true;
}

else if(dwReason == DLL_PROCESS_DETACH)
{
add_log("---------------------\nBig Brother Exiting...\n---------------------\n");
if(ofile) { ofile.close(); }
}

    return false;
}

char *GetDirectoryFile(char *filename)
{
static char path[320];
strcpy(path, dlldir);
strcat(path, filename);
return path;
}

void *DetourFunc(BYTE *src, const BYTE *dst, const int len)
{
BYTE *jmp = (BYTE*)malloc(len+5);
DWORD dwback;

VirtualProtect(src, len, PAGE_READWRITE, &dwback);

memcpy(jmp, src, len);	jmp += len;

jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;

src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;

VirtualProtect(src, len, dwback, &dwback);

return (jmp-len);
}

void *CustomDetourFunc(BYTE *src, BYTE *dst, const int len, BYTE *jmp)
{
DWORD dwback;

VirtualProtect(src, len, PAGE_READWRITE, &dwback);

memcpy(jmp, src, len);	jmp += len;

jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;

src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;

VirtualProtect(src, len, dwback, &dwback);

return (jmp-len);
}

bool RetourFunc(BYTE *src, BYTE *restore, const int len)
{
DWORD dwback;

if(!VirtualProtect(src, len, PAGE_READWRITE, &dwback))	{ return false; }
if(!memcpy(src, restore, len))							{ return false; }

restore[0] = 0xE9;
*(DWORD*)(restore+1) = (DWORD)(src - restore) - 5;

if(!VirtualProtect(src, len, dwback, &dwback))			{ return false; }

return true;
}	

void __cdecl add_log (const char *fmt, ...)
{
if(ofile != NULL)
{
if(!fmt) { return; }

va_list va_alist;
char logbuf[256] = {0};

va_start (va_alist, fmt);
_vsnprintf (logbuf+strlen(logbuf), sizeof(logbuf) - strlen(logbuf), fmt, va_alist);
va_end (va_alist);

ofile << logbuf << endl;
}
}

l'injection se passe tres bien.
j'espere donc que le lpstrName que je vais logger ressemblera a "google.fr" ou un truc dans le genre, mais le probleme c'est que je ne recupere que sa :
Called: Option : 0, Type : 1 (w)
Called: Option : 0, Type : 1 (i)
Called: Option : 0, Type : 1 (p)
Called: Option : 0, Type : 1 (g)
Called: Option : 0, Type : 1 (r)
Called: Option : 0, Type : 1 (r)
Called: Option : 0, Type : 1 (b)
Called: Option : 0, Type : 1 (m)

donc le lpstrName de DnsQuery appelé par l'application n'aurait qu'une lettre ?
Je n'utilise pas la bonne fonction ? ou j'ai une erreur dans le code ?

Merci d'avance de m'éclairer
Afficher la suite 

Votre réponse

5 réponses

cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 11 févr. 2010 à 12:08
+3
Utile
Salut,
si c'est juste pour afficher dans ta fonction add_log, tu dois pouvoir faire %S.
sinon, tu as WideCharToMultiByte().
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_aardman
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 11 févr. 2010 à 07:02
0
Utile
Salut,
on dirait que c'est la version unicode de l'api que tu hook, la chaine passée doit donc etre une chaine unicode: ça expliquerait pourquoi tu obtiens qu'un char dans le log vu que tu manipules des char*.
Commenter la réponse de cs_aardman
wxccxw 759 Messages postés samedi 15 mai 2004Date d'inscription 30 janvier 2011 Dernière intervention - 11 févr. 2010 à 09:59
0
Utile
quelle est le meillieur moyen de faire la conversion ?
Commenter la réponse de wxccxw
wxccxw 759 Messages postés samedi 15 mai 2004Date d'inscription 30 janvier 2011 Dernière intervention - 11 févr. 2010 à 10:44
0
Utile
help ! j'ai tester plein de trucs, rien ne marche !
Commenter la réponse de wxccxw
wxccxw 759 Messages postés samedi 15 mai 2004Date d'inscription 30 janvier 2011 Dernière intervention - 11 févr. 2010 à 12:44
0
Utile
%S marche tres tres bien !
Merci
Commenter la réponse de wxccxw

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.