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

wxccxw
|
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
|
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
|
quelle est le meillieur moyen de faire la conversion ?
|
|
jeudi 11 février 2010 à 10:44:30 |
Re : DnsQuery, hook et detours

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

aardman
|
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
|
%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
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|