• STATISTIQUES
  • Il y a eu un total de 1 membres et 14578 visiteurs sur le site dans les dernières 24h pour un total de 14 579 personnes!


    Membres: 2 443
    Discussions: 3 588
    Messages: 32 835
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] Defcon
    Lancé en 1992 par Dark Tangent, DEFCON est la plus ancienne et la plus grande conférence underground de...
    Hacking
    [FR] Asp-php
    Tutoriaux sur ASP, PHP, ASP.net, XML, SQL, Javascript, HTML, VML - Scripts et ressources pour webmasters - Forums d&#...
    Programmation
    [EN] Lost-chall
    Site de challenge présenté sous la forme de différente saison. Pour passer une saison vous devez avoir accumul�...
    Challenges
    [FR] Root-Me
    Notre équipe se base sur un constat : à l'heure actuelle ou l'information tend à devenir...
    Hacking
    [FR] apprendre-a-manipuler
    Site d'apprentissage de la manipulation d'autrui.
    Hacking
    [FR] Microcontest
    Cryptographie: 7, Mathématiques: 8, Image Son Vidéo: 5, Intelligence artificielle: 3, Réseau: 2, Divers: 7, Phy...
    Challenges
    [EN] Astalavista
    Un site aux ressources incontournable depuis plusieurs années, Astalavista est réellement devenue un cl...
    Hacking

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C] [Win32] Injection de DLL dans un process avant son initialisation
25-03-2013, 19h03 (Modification du message : 08-01-2025, 22h57 par supersnail.)
Message : #1
supersnail Hors ligne
Éleveur d'ornithorynques
*******



Messages : 1,614
Sujets : 72
Points: 466
Inscription : Jan 2012
[C] [Win32] Injection de DLL dans un process avant son initialisation
Bonjour all,

Comme certains le savent, je travaille (en plus de RE des malwares) sur un programme dénommé Stalker (dispo ici: http://github.com/aaSSfxxx/Stalker , qui a pour but de tracer les appels à WriteProcessMemory (une API win32 utilisé par pas mal de "crypters RunPE"). Pour ce faire, j'ai donc eu besoin d'injecter un "code" qui va charger une DLL qui place ses hooks sur certaines fonctions de kernel32 avant que le programme soit lancé (pour être certain de choper tous les appels à la fonction).
Au départ, j'utilisais une technique similaire au RunPE (ie modifier le registre eax du process cible avec SetThreadContext pour le faire pointer vers le shellcode qui charge ma DLL et laisser le loader win32 faire le reste du boulot), mais cette technique ne prenait pas en charge les exécutables "managed" (ie .NET) qui sont traités différemment.
J'ai donc 0vercl0k[] qui m'a conseillé iirc de hooker ZwCreateThread (une fonction de ntdll.dll) pour faire mes rituels vaudou, ce qui en pratique fonctionnait, mais... uniquement sous Windows XP :') (exit donc win7).
Bref déçu mais armé de mon cerveau, je me décide donc de réfléchir et il me vient l'idée (au gré de diverses lectures intéressantes que j'ai vues passer sur twitter, notamment ceci) de rediriger le registre eip du programme (qui pointe normalement vers LdrInitializeThunk) vers mon "shellcode" qui fait un appel à LdrLoadDll pour charger la lib (et donc on doit se taper d'init des structures UNICODE_STRING à la main vu que dès qu'on tripote le système/kernel win32, tout se fait avec des UNICODE_STRING :>). Bref, après avoir testé, it works, même sur des programmes .NET, et surtout... ça fonctionne aussi sous win 7 Big Grin.
Bref, venons-en au vif du sujet, le petit PoC que j'ai écrit :þ

Code :
#include <windows.h>
#include <stdio.h>

typedef struct _LSA_UNICODE_STRING {
  USHORT Length;
  USHORT MaximumLength;
  PWSTR  Buffer;
} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING;

char origBytes[5];
char bytecode[] =   "\x90" // nop for debugging purposes (replace it with 0xcc)
                    "\x60" // pushad
                    "\x68\x04\x03\x02\x01" // push module handle ret
                    "\x68\x04\x03\x02\x01" // push PUNICODE_STRING
                    "\x6a\x00" // push 0 (Flags)
                    "\x6a\x00" // push 0 (Path to file)
                    "\xb8\x04\x03\x02\x01" // mov eax,0x01020304 (to replace with our address of LdrLoadDll)
                    "\xff\xd0" // call eax
                    "\x61" // popad
                    "\x68\x04\x03\x02\x01" // push OEP
                    "\xc3";

//char name[] = "c:\\windows\\notepad.exe";
int main(int argc, char** argv) {
    PROCESS_INFORMATION PI;
    CONTEXT ctx;
    STARTUPINFO SI;
    DWORD temp;
    HANDLE memPage;
    UNICODE_STRING str;
    WCHAR tapz[] = L"tapz.dll";
    
    if(argc != 2) {
        printf ("Usage: %s <to run>", argv[0]);
        exit(-1);
    }
    RtlZeroMemory(&PI, sizeof(PI));
    RtlZeroMemory(&SI, sizeof(SI));
    RtlZeroMemory(&ctx, sizeof(ctx));
    
    // Create process
    if(!CreateProcessA(argv[1], NULL, NULL, NULL, 0, CREATE_SUSPENDED, NULL, NULL, &SI, &PI)) {
        printf("Last error is 0x%x", GetLastError());
        exit(-1);
    }
    
    // Gets thread context
    ctx.ContextFlags = CONTEXT_FULL;
    GetThreadContext(PI.hThread, &ctx);
    
    // Gets LdrLoadDll address and patch it into the shellcode
    temp = (DWORD)GetModuleHandle("ntdll.dll");
    temp = (DWORD)GetProcAddress((HANDLE)temp, "LdrLoadDll");
    *((DWORD*)((int)bytecode + 17)) = temp;
    
    // Allocates our working page
    if( !( memPage = VirtualAllocEx(PI.hProcess, NULL, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE) ) )
    {
        printf("Coudln't allocate buffer. Error code 0x%x\n", (int)GetLastError());
        exit(-1);
    }
    // Creates an unicode string
    str.Length = 18;
    str.MaximumLength = 20;
    str.Buffer = (LPVOID)(((int)memPage) + 10);
    
    // patch module handle address (returned by LdrLoadDll)
    *((DWORD*)((int)bytecode + 3)) = (DWORD)(((int)memPage) + 500);
    // patch UNICODE_STRING address
    *((DWORD*)((int)bytecode + 8)) = (DWORD)memPage;
    // Patch EIP address (used in the trick push/ret)
    *((DWORD*)((int)bytecode + 25)) = ctx.Eip;
    //Write all this sh*t
    WriteProcessMemory (PI.hProcess, (LPVOID)memPage, &str, sizeof(UNICODE_STRING), &temp);
    WriteProcessMemory (PI.hProcess, (LPVOID)(((int)memPage) + 10), (HANDLE)tapz, 20, &temp);
    WriteProcessMemory (PI.hProcess, (LPVOID)(((int)memPage) + 50), bytecode, 200, &temp);
    // Set our new eip
    ctx.Eip = (DWORD)(((int)memPage) + 50);
    
    //Set context
    SetThreadContext(PI.hThread, &ctx);
    
    // ALL YOUR BEER BELONG TO US :>
    printf("[+] ALL YOUR BEER BELONG TO US !\n");
    ResumeThread(PI.hThread);
    return 0;
}

Le code devrait être assez clair/commenté (pour tester, foutez une dll nommée "tapz.dll" qui affiche un MessageBox), m'enfin si vous avez des questions sur le code, feel free de me poser des questions Smile
Mon blog

Code :
push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp

"VIM est merveilleux" © supersnail
+1 (7) -1 (0) Répondre
25-03-2013, 19h16 (Modification du message : 25-03-2013, 19h17 par Sh4dows.)
Message : #2
Sh4dows Hors ligne
Tweetos
*



Messages : 293
Sujets : 5
Points: 49
Inscription : Dec 2012
RE: [C] [Win32] Injection de DLL dans un process avant son initialisation
Citation :m'enfin si vous avez des questions sur le code, feel free de me poser des questions
Je peux t’appeler Dieu ? Tongue

Très intéressant je dois dire, je vais analyser tout ça et si j'ai d'autres questions plus en rapport avec le sujet..
Faites ce que je dis et non ce que je fais !
+1 (0) -1 (0) Répondre
25-03-2013, 20h28
Message : #3
Doliprane Hors ligne
Newbie
*



Messages : 6
Sujets : 2
Points: 0
Inscription : Mar 2013
RE: [C] [Win32] Injection de DLL dans un process avant son initialisation
J'ai rien compris ou presque mais merci quand même, ça à l'air ... intéressant [Image: sad.gif]

(25-03-2013, 19h03)supersnail a écrit : J'ai donc 0vercl0k[] qui m'a conseillé iirc de hooker ZwCreateThread (une fonction de ntdll.dll) pour faire mes rituels vaudou
Faudrait reformuler la phrase :> !
+1 (0) -1 (0) Répondre
25-03-2013, 20h56
Message : #4
Horgh Hors ligne
Membre actif
*



Messages : 197
Sujets : 4
Points: 91
Inscription : Mar 2012
RE: [C] [Win32] Injection de DLL dans un process avant son initialisation
(25-03-2013, 20h28)Doliprane a écrit : J'ai rien compris ou presque mais merci quand même, ça à l'air ... intéressant [Image: sad.gif]

(25-03-2013, 19h03)supersnail a écrit : J'ai donc 0vercl0k[] qui m'a conseillé iirc de hooker ZwCreateThread (une fonction de ntdll.dll) pour faire mes rituels vaudou
Faudrait reformuler la phrase :> !

http://www.codeproject.com/Articles/2082...g-revealed
http://mnin.blogspot.com/2007/05/injecti...win32.html
http://msdn.microsoft.com/en-us/library/...s.85).aspx
Have fun RTFM Smile

Sinon pour en revenir au sujet, neat ton code. C'est simple finalement, et c'est bien efficace Smile
Je met de côté, ça me donne des idées tout ça.
+1 (0) -1 (0) Répondre
26-03-2013, 23h27
Message : #5
fr0g Hors ligne
NTEuNDI2MzcsLTEuNzc4NDg4
*****



Messages : 348
Sujets : 22
Points: 56
Inscription : Aug 2011
RE: [C] [Win32] Injection de DLL dans un process avant son initialisation
Bien joué, beau taf Smile
+1 (0) -1 (0) Répondre


Sujets apparemment similaires…
Sujet Auteur Réponses Affichages Dernier message
  Process windows skii 6 2,666 26-10-2016, 18h43
Dernier message: skii
  [ASM] Un jeu de la vie dans le MBR gruik 11 4,504 23-12-2013, 21h34
Dernier message: EpicOut
  [C-HELP] Malware Process Detecting sakiir 9 4,006 09-11-2013, 10h32
Dernier message: sakiir
  [MASM]Win32.Downloader EpicOut 5 2,444 02-11-2013, 17h10
Dernier message: sakiir
  [MASM] Extracteur de dll pour Backdoor.Win32.Papras Horgh 10 3,399 25-04-2013, 13h41
Dernier message: Kiwazaru
Exclamation READ-ME - Règles avant de poster Enila 0 1,071 19-11-2012, 18h22
Dernier message: Enila

Atteindre :


Utilisateur(s) parcourant ce sujet : 3 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut