Kérdés:
Nyomkövetési módszer hívások .NET / C # bináris fájlban
DucatiNerd
2019-10-22 20:48:34 UTC
view on stackexchange narkive permalink

Van egy erősen elhomályosított Windows szolgáltatás bináris fájlom. A mezőket, típusokat és módszereket átnevezik. Bár lehetséges a bináris fájl dekompilálása a dnSpy használatával, mégis nagyon nehézkes a fontos / érdekes helyeket statikusan azonosítani. ? Nem tudok sokat a CLR belső részeiről, de megértésem szerint a műszerezés nem könnyen lehetséges az IL utasítások JIT általi összeállítása miatt.

Ha bárkinek vannak javaslatai a végrehajtási útvonalak binárisban történő követésére, nagyra értékelem a közreműködését. Továbbá, ha bárki látott már hasonló obfusciós sémát, kérjük, tudassa velem:

enter image description here

Szerkesztés: A minta letölthető innen: https://gofile.io/?c=qrNky4 (nem rosszindulatú; egy VPN-szoftver része)

Lehetséges megosztani a bináris dokumentumot, így könnyebb bemutatni a lehetséges megoldást ezen a valós példán?
A bináris fájlt feltöltöttem a https://gofile.io/?c=qrNky4 oldalra - Nyilvános és nem rosszindulatú; valójában egy VPN szolgáltatás része.
Kis megjegyzés: Az alkalmazott obfuscator (valószínűleg) .NET Reactor, vannak nyilvános eszközök az objektumok eltávolításához, de előfordulhat, hogy nem működnek újabb verziókon.
Kettő válaszokat:
Paweł Łukasik
2019-10-26 00:58:26 UTC
view on stackexchange narkive permalink

hogy a műszerezés nem könnyen lehetséges az IL utasítások JIT általi összeállítása miatt.

Nos, valójában éppen ellenkezőleg. A nyomkövetési módszerek meglehetősen egyszerűek - nehéz lenne, ha szeretnénk nyomon követni a mezők használatát. A .NET-összeállítások gazdag típusú / módszer információkat tartalmaznak, amelyek felhasználhatók ellenőrzésükre / módosításukra. Van egy remek könyvtár is, amely ezt teszi, plusz még sok más - Mono.Cecil.

Azzal a segítséggel, hogy ez a könyvtár elérhesse azt, amit szeretne ( lényeg ).

  a System használatával; a System.IO használatával; a System.Linq használatával; a Mono.Cecil használatával; a Mono.Cecil.Cil használatával; TraceIL osztály if (args.Length! = 1) {Console.WriteLine ("TraceIL.exe <assembly>"); Visszatérés; } string fileName = args [0]; ModuleDefinition module = ModuleDefinition.ReadModule (fileName); MethodReference consoleWriteLine = module.ImportReference (typeof (Console) .GetMethod ("WriteLine", új Type [] {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, $ "- A {methodDefinition.Name}" megadása); ilProcessor.InsertBefore (firstOp, ldstrEntering); var call = Instruction.Create (OpCodes.Call, consoleWriteLine); ilProcessor.InsertBefore (firstOp, call); var ldstrLeaving = Instruction.Create (OpCodes.Ldstr, $ "- {methodDefinition.Name}" elhagyása); var lastOp = methodDefinition.Body.Instructions.Last (); ilProcessor.InsertBefore (lastOp, ldstrLeaving); ilProcessor.InsertBefore (lastOp, call); }}
module.Write (Path.GetFileNameWithoutExtension (fileName) + ". módosított" + Path.GetExtension (fileName)); }}  

Csak azért, hogy egy kicsit elmagyarázzam, mi történik. Az összeállításban megtalálható minden típusú módszerhez megkapjuk az ILProcessor -ot, amely lehetővé teszi számunkra a kód módosítását. Ennek meglétével csak be kell illesztenünk egy karakterláncot és egy hívást a Console.WriteLine -be, közvetlenül az első létező opcode és hasonló kód elé, közvetlenül a módszer vége előtt. A legvégén ugyanazon a néven mentjük az új bináris fájlt, a .modified hozzáadásával.

A példa futtatása:

λ TestApp.exe
Inside Run
Inside Inside
MoreInside
OtherProgramRun

λ TraceIL.exe TestApp.exe

λ TestApp.modified. exe
- A fő bevitele
- A .ctor bevitele
- A .ctor elhagyása
- A futás megadása
Belső futás
- A belső beírása Inside Inside
- MoreInside bevitele
MoreInside
--Beírása .ctor
--Leaving .ctor
--EgyébProgramFuttatás
OtherProgramRun - Leave OtherProgramRun
- Leave MoreInside
- Leave Inside
- Leave Run
- Leave Main

Természetesen az űrlapból meg lehet csinálni őrült dolgokat, például hozzáadni az időbélyegzőt és / vagy az átadott argumentumokat stb. módosítani kell szükséges.

Nagyon köszönöm az egyértelmű magyarázatot. Ezt mindenképpen megvizsgálom!
@DucatiNerd Kipróbáltam ezt a fájlt, és látom, hogy vannak olyan trükkök, amelyeket el kell távolítani a hangszereléshez. Például átugorhat néhány érvénytelen hívást, amelyek lehetetlenné teszik a modul mentését a műszerezés után
oridamari
2019-10-26 03:55:31 UTC
view on stackexchange narkive permalink

A de4dot ( https://github.com/0xd4d/de4dot) segítségével eltávolíthatja a bináris fájlt. A dotnet bináris fájlok statikus elemzése könnyen elvégezhető a de4dot használatával, majd az ILSpy segítségével egy vizuális stúdió projekt létrehozásához, majd elemezheti a forrásstúdiót a visual studio-ban. Használhatja a dnSpy-t is, amely lehetővé teszi a bináris hibakeresését.

A műszerezésről egy dotnet bináris futás közben is fut natív kódot, az összes normál Win32 könyvtárral együtt. Az Api Monitor ( http://www.rohitab.com/downloads) segítségével figyelheti az os api hívásokat futás közben, ez egy fantasztikus eszköz, amely könyvtárak összekapcsolásával és paraméterek dekódolásával működik.

Ezenkívül a procmon segítségével egyszerű információkat jeleníthet meg, például a fájlrendszer működését, a nyilvántartást stb.

Sok szerencsét

A d4dot valójában az egyik első eszköz volt, amit kipróbáltam. Meglepő, hogy ebben az esetben nem fedezte fel az obfuscation sémát, és nem volt képes a bináris dezfúzióját sem.
Megoszthatja a mintát? :)
Ellenőrizze a fenti kérdésemre adott válaszomat. Összekapcsoltam a fájlt :)
Ez lehet .NET reaktor, azt hiszem, felismerem a vezérlőáramlást egy korábbi mintából, ahol a de4dot kimutatta.


Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 4.0 licencért, amely alatt terjesztik.
Loading...