Kysymys:
Jäljitysmenetelmä kutsuu .NET / C # -binaariksi
DucatiNerd
2019-10-22 20:48:34 UTC
view on stackexchange narkive permalink

Minulla on voimakkaasti hämmentynyt Windows-palvelun binääri. Kentät, tyypit ja menetelmät nimetään uudelleen. Vaikka binääriä on mahdollista purkaa dnSpy: n avulla, on silti erittäin hankalaa tunnistaa tärkeät / mielenkiintoiset sijainnit staattisesti.

Onko binääriä mahdollista instrumentoida dynaamisesti, jotta tietyt toteutuspolut ymmärretään paremmin ? En tiedä paljoakaan CLR-sisäisistä, mutta ymmärrän, että instrumentointi ei ole helposti mahdollista IL-ohjeiden JIT-kokoamisen vuoksi.

Jos jollakin on ehdotuksia suorituspolkujen jäljittämiseksi binaarissa, haluaisin arvostan erittäin paljon panostustasi. Jos joku on aiemmin nähnyt samanlaisen hämärtymisohjelman, ilmoita siitä minulle:

enter image description here

Muokkaa: Näyte voidaan ladata osoitteesta: https://gofile.io/?c=qrNky4 (ei haitallinen; osa VPN-ohjelmistoa)

Onko mahdollista jakaa binääri, joten on helpompaa esitellä potentiaalinen ratkaisu tässä todellisessa esimerkissä?
Olen ladannut binaarin osoitteeseen https://gofile.io/?c=qrNky4 - Se on julkinen eikä haitallinen; se on itse asiassa osa VPN-palvelua.
Pieni huomautus: Käytetty obfuskaattori on (todennäköisesti) .NET Reactor, sen julkistamiseen on olemassa julkisia työkaluja, mutta ne eivät välttämättä toimi uudemmissa versioissa.
Kaksi vastused:
Paweł Łukasik
2019-10-26 00:58:26 UTC
view on stackexchange narkive permalink

että instrumentointi ei ole helposti mahdollista, koska JIT on laatinut IL-ohjeet.

No, se on itse asiassa päinvastoin. Jäljitysmenetelmät ovat melko helppoja - olisi vaikeaa, jos haluaisimme jäljittää kenttien käyttötarkoitukset. .NET-kokoonpanot sisältävät runsaasti tyyppiä / menetelmää koskevia tietoja, joita voidaan käyttää niiden tarkastamiseen / muokkaamiseen. Siellä on myös upea kirjasto, joka tekee sen ja paljon muuta - Mono.Cecil.

Tämän kirjaston avulla voimme saavuttaa haluamasi ( pääsisältö) ).

  käyttäen System; käyttämällä System.IO; käyttäen System.Linq; käyttämällä Mono.Cecil; käyttämällä Mono.Cecil.Cil; class TraceIL {static void Main (string [] args) { if (args.Pituus! = 1) {Console.WriteLine ("TraceIL.exe <assembly>"); palata; } merkkijonon tiedostonimi = args [0]; ModuleDefinition module = ModuleDefinition.ReadModule (fileName); MethodReference consoleWriteLine = module.ImportReference (typeof (Console) .GetMethod ("WriteLine", uusi tyyppi [] {typeof (object)})); foreach (TypeDefinition type in module.Types) {foreach (var methodDefinition in type.Methods) {var ilBody = methodDefinition.Body; var ilProcessor = ilBody.GetILProcessor (); var firstOp = methodDefinition.Body.Instructions.First (); var ldstrEntering = Instruction.Create (OpCodes.Ldstr, $ "- syötetään {methodDefinition.Name}"); ilProcessor.InsertBefore (firstOp, ldstrEntering); var call = Instruction.Create (OpCodes.Call, consoleWriteLine); ilProcessor.InsertBefore (firstOp, kutsu); var ldstrLeaving = Instruction.Create (OpCodes.Ldstr, $ "- Leaving {methodDefinition.Name}"); var lastOp = methodDefinition.Body.Instructions.Last (); ilProcessor.InsertBefore (lastOp, ldstrLeaving); ilProcessor.InsertBefore (lastOp, puhelu); }}
module.Write (Path.GetFileNameWithoutExtension (fileName) + ". muokattu" + Path.GetExtension (fileName)); }}  

Vain selittääkseen vähän mitä tapahtuu. Jokaisesta kokoonpanossa löydetystä tyypistä jokaiselle menetelmälle saadaan ILProcessor , jonka avulla voimme muokata koodia. Tämän jälkeen lisäämme vain merkkijonon ja kutsun Console.WriteLine -tilaan juuri ennen ensimmäistä olemassa olevaa opcode-koodia ja vastaavaa koodia juuri ennen menetelmän loppua. Lopussa tallennamme uuden binaarin samalla nimellä, johon on lisätty .modified .

Esimerkki:

λ TestApp.exe
Inside Run
Inside Inside
MoreInside
OtherProgramRun

λ TraceIL.exe TestApp.exe

λ TestApp.modified. exe
- Pääsivun syöttäminen
- Sisäänsyöttö .ctor
- Lähtö .ctor
- Sisäänajo
Sisäajo
- Sisäänkäynti Inside Inside
--Entering MoreInside
MoreInside
--Ecting .ctor
--Leaving .ctor
--Entering OtherProgramRun
OtherProgramRun --Leaving OtherProgramRun
--Leaving MoreInside
--Leaving Inside
--Leaving Run
--Leaving Main

Tietysti siellä voit tehdä hulluja juttuja, kuten lisätä aikaleiman ja / tai luettelon hyväksytyistä argumenteista jne. Koska näytteesi on hämärtynyt, se ei ehkä toimi alusta, mutta luulen, että tätä koodia ei ole niin vaikea muutetaan muodossa tarvitaan.

Paljon kiitoksia selkeästä selityksestäsi. Se on ehdottomasti jotain, mitä aion tutkia!
@DucatiNerd Olen kokeillut tämän tiedoston kanssa ja näen joitain temppuja, jotka olisi poistettava instrumentointityön kannalta. Siellä on esimerkiksi hyppy joidenkin kelpaamattomien puheluiden yli, jotka tekevät tämän moduulin mahdottomaksi tallentaa instrumentoinnin jälkeen
oridamari
2019-10-26 03:55:31 UTC
view on stackexchange narkive permalink

Voit käyttää de4dot-tiedostoa ( https://github.com/0xd4d/de4dot) binaarin hajottamiseen. Staattinen analyysi dotnet-binaareista voidaan tehdä helposti käyttämällä de4dotia ja sitten ILSpy: tä luodaksesi visuaalisen studio-projektin, sitten voit analysoida lähdekoodia visuaalisessa studiossa. Voit myös käyttää dnSpy: tä, jonka avulla voit helposti korjata binaarin.

Tietoja instrumentoinnista, dotnet-binaari suorittaa edelleen natiivikoodin ajon aikana kaikkien normaalien Win32-kirjastojen kanssa. Voit käyttää Api Monitoria ( http://www.rohitab.com/downloads) os api-puheluiden seuraamiseen ajon aikana, se on mahtava työkalu, joka toimii kytkemällä kirjastoja ja purkamalla parametreja.

Lisäksi voit käyttää procmonia yksinkertaisten tietojen, kuten tiedostojärjestelmän toimintojen, rekisterin jne., näyttämiseen.

Onnea

d4dot oli itse asiassa yksi ensimmäisistä kokeilemastani työkaluista. Yllättäen tässä tapauksessa se ei havainnut hämärtymisjärjestelmää eikä pystynyt hajottamaan binääriä.
Voitko jakaa näytteen? :)
Tarkista vastaukseni kysymykseeni yllä. Olen linkittänyt tiedoston :)
Tämä voi olla .NET-reaktori, luulen tunnistavan ohjausvirtauksen litistyneen edellisestä näytteestä, jossa de4dot havaitsi sen.


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 4.0-lisenssistä, jolla sitä jaetaan.
Loading...