Author Topic: Uvolnění části paměti PE souboru  (Read 1445 times)

Kockatá hlava

  • Junior Member
  • ***
  • Posts: 134
  • n00b
    • x86asm.net
Uvolnění části paměti PE souboru
« on: January 03, 2019, 01:27:00 PM »
Při startu Win64 programu potřebuju namapovat do paměti datový soubor (který je součást distribuce aplikace a nikdy se nemění), přečíst z něho data a soubor zase zavřít (a tím uvolnit paměť).

Chtěl bych ty data z toho souboru ale přesunout přímo někam do PE exe, kde mám možnost je trochu líp ochránit, než když jsou v externím souboru. Nevím ale, jak potom vyřešit uvolnění paměti. PE specifikaci trochu znám, ale nevím o tom, že by se dala nějaká část načteného PE souboru dodatečně uvolnit. Neexistuje nějaká možnost?

DARKER

  • [SCF]
  • Administrator
  • Senior Member
  • *****
  • Posts: 336
Re: Uvolnění části paměti PE souboru
« Reply #1 on: January 03, 2019, 01:43:06 PM »
podla mna mas 2 moznosti:

1) bud to budes mat priamo ako resource v exe (mozes to mat napr cryptovane) ale tam neviem ci vies uvolnit pamat kedze system si tak ci tak nacita cele exe do pamati a ked to napr budes decryptovat tak si zase vyhradi na to dalsie nove miesto... Mohol by si to dat aj ako externe dll, ale tam sa potom dostavame k bodu 2:

2) externy subor (cryptovany) kde si riesis vsetko vo vlastnej rezii (nacitanie, decrypt, release, uvolnis pamat)

ak sa nejedna o velke data (do 50MB) chod cestou 1) inac 2). Dnesne systemy to zvladnu. Velakrat ma samotna aplikacia: exe + externe dll aj cez 100mb a "bezi to" :-)

Kockatá hlava

  • Junior Member
  • ***
  • Posts: 134
  • n00b
    • x86asm.net
Re: Uvolnění části paměti PE souboru
« Reply #2 on: January 03, 2019, 04:38:24 PM »
Jak jsem četl ten tvůj komentář, napadla mě ještě další možnost - dát ty data do DLL (kde bych je mohl "ochránit"), načíst je, kam potřebuju, a potom je uvolnit přes FreeLibrary.

DARKER

  • [SCF]
  • Administrator
  • Senior Member
  • *****
  • Posts: 336
Re: Uvolnění části paměti PE souboru
« Reply #3 on: January 03, 2019, 05:03:28 PM »
Ved tak som myslel, otazka je ze o ake data sa konkretne jedna, ako sa budu vyuzivat dalej, podla toho sa bude odvijat aj riesenie :-)

RubberDuck

  • Trial Member
  • **
  • Posts: 74
    • sec-cave.cz
Re: Uvolnění části paměti PE souboru
« Reply #4 on: January 04, 2019, 03:23:39 AM »
Můžeš ty data hodit do nové sekce souboru a tu sekci po použití normálně odmapovat (API funkce NtUnmapViewOfSection), čímž by mělo dojít k uvolnění paměti. Další možností je připojit ty data za reálný konec (koukni na PE hlavičky a konkrétně na IMAGE_OPTIONAL_HEADER) souboru a pak si to z něj jen načíst. Tohle je technika, kterou dost často používají packery.

Kockatá hlava

  • Junior Member
  • ***
  • Posts: 134
  • n00b
    • x86asm.net
Re: Uvolnění části paměti PE souboru
« Reply #5 on: January 04, 2019, 10:58:51 AM »
O téhle možnosti jsem nevěděl, pokud by to fungovalo, tak by to bylo super. Taky jsem našel linuxový munmap, ten by mohl fungovat na Androidu.

Nechce se někomu napsat proof of concept? :)

RubberDuck

  • Trial Member
  • **
  • Posts: 74
    • sec-cave.cz
Re: Uvolnění části paměti PE souboru
« Reply #6 on: January 04, 2019, 12:45:35 PM »
Pro Windows ti to napsat můžu. Tam je to easy.

Kockatá hlava

  • Junior Member
  • ***
  • Posts: 134
  • n00b
    • x86asm.net
Re: Uvolnění části paměti PE souboru
« Reply #7 on: January 04, 2019, 02:57:37 PM »
Pro Windows ti to napsat můžu. Tam je to easy.
To by mi pomohlo. Bylo by potřeba ověřit, že to fakt unmapne jenom tu jednu sekci a ne třeba ještě něco jinýho :)

Kockatá hlava

  • Junior Member
  • ***
  • Posts: 134
  • n00b
    • x86asm.net
Re: Uvolnění části paměti PE souboru
« Reply #8 on: January 04, 2019, 03:09:02 PM »
pr0p4g4nd4: hmm, na overlay jsme si nikdo nevzpomněli :) popřemýšlím, jestli by to bylo použitelný.

pr0p4g4nd4

  • [SCF]
  • Senior Member
  • ****
  • Posts: 429
Re: Uvolnění části paměti PE souboru
« Reply #9 on: January 04, 2019, 03:25:03 PM »
overlay je ta najjednoduchsia moznost, len tam naprcas co chces (kludne aj kryptovane data, hociake). data nacistas TROMA apickami CreateFileA/W (dostanes handle) -> CreateFileMapping (dostanes handle) -> MapViewOfFile. dostanes to v alokovanej pamati - ked ti nebude vyhovovat adresa, tak si skratka naalokujes taku aku budes chciet (VirtualAlloc tusim ma aj parameter, ktory umoznuje alokovat na adresu, ktora ti vyhovuje.. samozrejme ak je volna) a data si tam skopirujes (bud rucne svojim kodom, alebo pomocou nejakej api).
Aký je rozdiel medzi mladým a starým chlapom?
Mladému behá piča po rozume, starému po byte...

Kto robí je robot, kto koktá je.. koktavý!

RubberDuck

  • Trial Member
  • **
  • Posts: 74
    • sec-cave.cz
Re: Uvolnění části paměti PE souboru
« Reply #10 on: January 04, 2019, 07:41:13 PM »
Pro Windows ti to napsat můžu. Tam je to easy.
To by mi pomohlo. Bylo by potřeba ověřit, že to fakt unmapne jenom tu jednu sekci a ne třeba ještě něco jinýho :)

Hned teď ti to neudělám. Buď si ohni kód na základě mého článku https://web.archive.org/web/20150403162935/https://bflow.security-portal.cz/spousteni-binarky-z-pameti-bez-nutnosti-ulozeni-na-disk/ nebo si budeš muset pár dnů počkat, než si na to udělám čas. Volba je na tobě  8)

Kockatá hlava

  • Junior Member
  • ***
  • Posts: 134
  • n00b
    • x86asm.net
Re: Uvolnění části paměti PE souboru
« Reply #11 on: January 05, 2019, 01:50:22 PM »
Pokud se ti to chce udelat, rad pockam :)

pr0p4g4nd4

  • [SCF]
  • Senior Member
  • ****
  • Posts: 429
Re: Uvolnění části paměti PE souboru
« Reply #12 on: January 07, 2019, 01:24:31 PM »
inac, skusal som jednu vec, ci je mozne uvolnit cast pamate procesu, ktora patri nejakej konkretnej sekcii PE. do PE sa da pridat pomocou dajme tomu lordpe nova sekcia - pridat akykolvek subor a urobit z neho sekciu PEcka. vyskusal som to (pridal som nahodny subor ako PE sekciu), a nasledne som sa pokusal uvolnit danu cast PE (pridanu sekciu zo suboru). prisiel som na to, ze klasicky pomocou VirtualFree to nejde. nechytali sa ani rozne pluginy do olly, ktore umoznuju uvolnit nejaku cast pamate (ktore to ale asi tiez robia cez VirtualFree(Ex)). cize, pravdepodobne su api windows urobene, tak aby neuvolnovali tu pamat, patriacu nejakej PE sekcii. asi jedina moznost bude uvolnovat PE sekcie pomocou driveru.
Aký je rozdiel medzi mladým a starým chlapom?
Mladému behá piča po rozume, starému po byte...

Kto robí je robot, kto koktá je.. koktavý!

Kockatá hlava

  • Junior Member
  • ***
  • Posts: 134
  • n00b
    • x86asm.net
Re: Uvolnění části paměti PE souboru
« Reply #13 on: January 07, 2019, 02:25:49 PM »
Zkus importovat ntdll.dll a zavolat NtUnmapViewOfSection.

RubberDuck

  • Trial Member
  • **
  • Posts: 74
    • sec-cave.cz
Re: Uvolnění části paměti PE souboru
« Reply #14 on: January 07, 2019, 10:56:50 PM »
Beru zpět. Nezkoušel jsem, ale vypadá to, že Nt/ZwUnmapViewOfSection odmapuje naráz celou paměť. To mě přivedlo na myšlenku, že si můžeš napsat vlastní PE loader (jako shellcode to mělo kolem 1k2 bajtů) a prostě si postupně namapovat, co potřebuješ ;)