begin process at 2012 05 29 11:18:04
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Système

 > 

Autre

 > 

DnsQuery, hook et detours


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

DnsQuery, hook et detours

jeudi 11 février 2010 à 02:12:50 | DnsQuery, hook et detours

wxccxw

Membre Club




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
Code C/C++ :
#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
jeudi 11 février 2010 à 07:02:10 | Re : DnsQuery, hook et detours

aardman

Membre Club
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*.
jeudi 11 février 2010 à 09:59:13 | Re : DnsQuery, hook et detours

wxccxw

Membre Club
quelle est le meillieur moyen de faire la conversion ?



jeudi 11 février 2010 à 10:44:30 | Re : DnsQuery, hook et detours

wxccxw

Membre Club




help ! j'ai tester plein de trucs, rien ne marche !
jeudi 11 février 2010 à 12:08:49 | Re : DnsQuery, hook et detours

aardman

Membre Club
Réponse acceptée !
Salut,
si c'est juste pour afficher dans ta fonction add_log, tu dois pouvoir faire %S.
sinon, tu as WideCharToMultiByte().
jeudi 11 février 2010 à 12:44:29 | Re : DnsQuery, hook et detours

wxccxw

Membre Club


%S marche tres tres bien !
Merci



Cette discussion est classée dans : byte, dword, src, len, jmp


Répondre à ce message

Sujets en rapport avec ce message

compréhension d'un bout de code [ par albert0 ] Bonsoir, voila, j'essai de comprendre a quoi sert une fonction..... sans succes! voila la fonction: void *DetourFunc( BYTE *src, const BYTE *dst, HOOK PROBLEME DLL [ par wxccxw ] hello, je vais une dll de hook et j'obtient sa :MON CODE :#include FARPROC fpRegQueryValueEx; // Buffer de l'adresse de la fonctionFARPROC fpRegOpenKe REG_DWORD [ par Xentor609 ] Lorsque je recupere la valeur d'une clé avec RegEnumValue,celle-ci doit etre stockée dans un BYTE. Quand le type de la valeur recupérée est un REG_SZ, AutoSuppression et .bat [ par phantom_2005 ] Bonjour,j'ai un problème de suppression de répertoire dans un fichier .bat.Je créée dans mon appli un fichier .bat d'autodestruction que j'appelle ava WORD, DWORD et BYTE en langage C ? [ par Cako19 ] Bonjour,Les types de données WORD, DWORD et BYTE sont-ils utilisables en langage C ?Ca refuse de compiler chez moi. Ils ne sont pas reconnus.Faut-il i Ajout d'une ressource partagée [ par sam2004 ] Bonjout tous,mon pb est le suivant : j'ai suivit toutes les etapes necessaire afin de mettre en marche un programme qui permettre l'ajout d'un part determination de permission associé a unpartage [ par sam2004 ] Bonjour tous, pour enummerer le partage sur un hôte vous utilisez la fonction NetShareEnum de la librairie netapi32.dll et pour avoir plus information RegSetValueEX > REG_DWORD [ par Roudy ] salut j'aimerais ecrire le chiffre 10 dans mon REG_DWORD mais il me le converti toujours en A et je ne my connait pas vraiement dans les types variabl CRC32 qui ne correspond pas [ par CyberP ] J'ai testé ce code que j'ai trouvé sur le net :const DWORD crc32_table[] = { 0UL, 16777216UL, 33554432UL, 50331648UL, 67108864UL, 83886080UL, 10066329 Conversion struct en char* [ par lastpixl ] Comment convertir une structure en char* ? C-à-d en fait comment avoir dans un char* le contenu de la struct, comme si on lisait un fichier dans leque


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,229 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales