Vra

Is daar iets soos 'n x86 assembler wat ek deur C# kan oproep?Ek wil in staat wees om x86-instruksies as 'n string deur te gee en 'n byte-skikking terug te kry.As een nie bestaan ​​nie, hoe kan ek my eie maak?

Om duidelik te wees - ek wil nie bel samestelling kode van C# - Ek wil net in staat wees om kode saam te stel uit instruksies en kry die masjien kode in 'n greep skikking.Ek sal hierdie kode (wat dadelik gegenereer sal word) inspuit om heeltemal in 'n ander proses in te spuit.

Was dit nuttig?

Oplossing

As deel van 'n paar vroeë prototipering wat ek op 'n persoonlike projek gedoen het, het ek 'n hele paar kode geskryf om so iets te doen.Dit neem nie snare nie -- x86-opkodes is metodes op 'n X86Writer-klas.Dit is glad nie gedokumenteer nie, en het nêrens naastenby volledige dekking nie, maar as dit van belang sou wees, sou ek bereid wees om dit oopbron te maak onder die Nuwe BSD-lisensie.

OPDATEER:Goed, ek het daardie projek geskep -- Bestuur.X86

Ander wenke

Sien hierdie projek:

https://github.com/ZenLulz/MemorySharp

Hierdie projek omvou die FASM-samesteller, wat in samestelling geskryf is en as 'n saamgestel as Microsoft coff-objek, toegedraai deur 'n C++-projek, en dan weer in C# toegedraai.Dit kan presies doen wat jy wil:gegewe 'n string van x86/x64-samestelling, sal dit die benodigde grepe produseer.

As jy die teenoorgestelde benodig, is daar 'n poort van die Udis86-demonteerder, volledig oorgeplaas na C#, hier:

https://github.com/spazzarama/SharpDisasm

Dit sal 'n verskeidenheid grepe omskakel na die instruksiestringe vir x86/x64

Gaan kyk na Phoenix van Microsoft Research.

Cosmos het ook 'n paar interessante ondersteuning vir die generering van x86-kode:

http://www.gocosmos.org/blog/20080428.en.aspx

Nie direk vanaf C# kan jy nie.U kan egter moontlik u eie omhulklas skryf wat 'n eksterne samesteller gebruik om kode saam te stel.So, jy sal moontlik die samestelling na 'n lêer uitskryf, die .NET Framework gebruik om 'n nuwe proses op te stel wat die samestellerprogram uitvoer, en dan System.IO gebruik om die gegenereerde lêer deur die samesteller oop te maak om die greep uit te trek stroom.

Selfs as jy dit alles doen, sal ek egter baie verbaas wees as jy dan nie sekuriteitskwessies ondervind nie.Die inspuiting van uitvoerbare kode in 'n heeltemal ander proses word al hoe minder moontlik met elke nuwe bedryfstelsel.Met Vista glo ek jy sal beslis geweier word.En selfs in XP, dink ek jy sal 'n toegang geweier uitsondering kry wanneer jy probeer om te skryf in die geheue van 'n ander proses.

Natuurlik laat dit die vraag ontstaan ​​waarom jy dit moet doen.Daar moet sekerlik 'n beter manier wees :).

Ek dink jy sal die beste daarvan wees om 'n inheemse Win32 dll te skryf.U kan dan 'n funksie in assembler skryf wat vanaf die dll uitgevoer word.U kan dan C# gebruik om dinamies na die dll te koppel.

Dit is nie heeltemal dieselfde as om in 'n string te slaag en 'n greepskikking terug te gee nie.Om dit te doen sal jy 'n x86 assembler komponent nodig hê, of 'n omhulsel rondom masm.exe.

Ek weet nie of dit is hoe dit werk nie, maar jy kan net 'n eksterne samesteller uitvoer en dan die voorwerp wat in jou byte-skikking gegenereer word, laai.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top