c - at lave en selvstændig exe, der udpakker filer og andre kommandoer

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg laver en filtrerende sniffer i C og winPCAP, der starter på hver boot. Til dette vil jeg lave en selvstændig exe fil, der uddrages (nej, ikke komprimering!) Exe og DLLs til en ny mappe og udfører andre kommandoer (som ændrer opstartsindstillinger) lydløst uden at vise ethvert vindue/terminal.






  1. Den enkelte fil indeholder en exe og DLLs.

  2. Når den udføres, kopierer den filerne til en mappe og gør andre kommandoer

  3. Det gør det stille uden vinduer eller terminaler eller brugerintervention



Jeg understreger lydløs -delen, så jeg kan ikke vælge nogle nemme installationsprogrammer. Kan du anbefale noget, der genererer denne eksekverbare?


For de nysgerrige: det er et smidigt pakkeloggerprogram til mit college projekt. 'Stealth' -delen vil kun blive testet på xp2 virtuelle maskiner med IE6 (ja gamle ting).


REDIGER : Besvar kommentarerne: den har et malware tegn . Så jeg kører den i virtualbox, aldrig løs . Og jeg kan kun gå på kompromis med et upakket xp-system med IE6 uden antivirus, der kommer fra en gammel installationsdisk. Dvs omfanget af IE css bruger efter fri sårbarhed, er AFAIK aldrig set i det vilde. Så der er ingen uetisk adfærd involveret.

Bedste reference


Den trivielle måde at gøre det på er at skabe et meget stort array inde i dit program og gemme de data, der skal udvindes inde i det array. Når programmet udføres, tager det array og skriver det ud til en fil eller filer efter behov, og udfører derefter den fil, du vil køre, når filerne udvindes. Se for eksempel C Spørgsmål: Hvordan gemmer data inde i den eksekverbare fil.


Når programmet er udarbejdet, kan du erstatte dataene i EXE'en ved hjælp af en binær editor til at kopiere dine filer på plads uden at skulle konvertere dine filer til et C-array eller en anden datastruktur hver gang du ændrer din nyttelast.


For at holde størrelsen nede primærprogrammet dekomprimeres typisk arrayet og forventer et komprimeret array. En masse installatører bruger simpelthen zip, da dekomprimeringen tager sig af flere filer i et array, og du behøver ikke at vove med at tilføje et katalog array og reference array - det er alt indbygget, og kommandolinjekompressorer er almindelige og nem at bruge.


Om det primære program åbner en terminal afhænger af, hvordan du programmerer det. Jeg forventer, at du skal bruge det til at være et win32-program, så Windows ikke åbner en DOS-terminal, og du åbner simpelthen ingen vinduer inde i dit program. Det er et særskilt spørgsmål, så overvej det at spørge det som nyt spørgsmål.


Som David påpeger, er denne proces typisk automatiseret i linkerfasen. Hver linker er lidt anderledes, men du kan tjekke indlejring af ressourcer i .exe ved hjælp af GCC til et eksempel ved hjælp af en af ​​de mere almindelige kompilatorer.


Jeg går ud fra, at du ved hvad du gør, men husk på, at der er mange upakket stock winxp sp2-systemer derude - forudsat at du ikke vil skade nogen, fordi du ikke tror, ​​at sådanne systemer er online, er et dårligt valg. Gør visse , at dit program ikke har mulighed for at forlade de virtuelle maskiner. Der er måder at f.eks. Tilslutte deres netværk uden at tillade maskinerne adgang til internettet eller din computers netværk. Husk at Morris ormen var et kæledyrsprojekt, der ikke var meningen eller forventet at gå vildt heller.

Andre referencer 1


Du kan nemt integrere ressourcer enten ved at forbinde dem ind, med kompilatoren eller ved at bruge et særligt program og instrumentere Windows API.


Noget i tråd med:


char file\_to\_be\_altered[] = "MyInstaller.exe"

HANDLE hUpdate = BeginUpdateResource( file\_to\_be\_altered, FALSE );
UpdateResource( hUpdate, "MyResType", "MyResName1", 0, pData, data\_len );
EndUpdateResource( hUpdate, FALSE );


Så når din eksekverbare kører, opregner du dine ressourcer og vælger dem, der har typen 'MyResType'.


struct res\_entry { BYTE* pData; unsigned int len; }

BOOL CALLBACK EnumNamesCB(
    HMODULE hModule,  // module handle
    LPCTSTR lpType,   // address of resource type
    LPTSTR lpName,    // address of resource name
    LONG\_PTR lParam)      // 
{
    std::vector<res\_entry>& lst = *(reinterpret\_cast< std::vector<res\_entry>* >( lParam ));
    HRSRC hRes = FindResource( hModule, lpName, lpType );
    if( hRes == 0 )     return TRUE;
    unsigned int len = SizeofResource( hModule, hRes );

    HGLOBAL hGlob = LoadResource( hModule, hRes );
    if( hGlob == 0 )    return TRUE;

    res\_entry t;
    t.pData = LockResource( hGlob );
    t.len = len;


    lst.push\_back( t );     // this is safe, because the resources are never deallocated
    return TRUE;
}

....

void enum\_entries()
{
    std::vector<res\_entry> lst;
    ::EnumResourceNames( hFileToQuery, "MyResType", &EnumNamesCB, reinterpret\_cast<LONG\_PTR>(&lst) );
}


Du kan gøre hvad du vil med disse data, f.eks. CreateFile ... og skrive dataene ud til disken.


NB: Sådan kan installatører gøre det på windows, og dette blev udviklet til at udpakke filer til temp dir og installere derfra.