Vra

Hoe kan'n virtuele masjien genereer moedertaal masjien kode op die vlieg en dit uit te voer?

Die veronderstelling dat jy kan uit te vind wat is die moedertaal masjien op-kodes wat jy wil om te stoot, hoe gaan jy eintlik loop dit?

Is dit iets soos hacky as die kartering van die mnemoniese instruksies te binêre kodes, vulsel dit in'n char* pointer en giet dit as'n funksie en die uitvoering?

Of sou jy genereer'n tydelike gedeelde biblioteek (.dll of .so of wat ook al) en laai dit in die geheue met behulp van standaard funksies soos LoadLibrary ?

Was dit nuttig?

Oplossing

Jy kan net maak die program toonbank punt is om die kode wat jy wil uit te voer.Onthou dat die data kan wees data of kode.Op x86 die program toonbank is die EIP registreer.Die IP-deel van die EIP staan vir instruksies wyser.Die JMP instruksies is geroep om te spring na'n adres.Na afloop van die spring EIP sal bevat hierdie adres.

Is dit iets soos hacky as die kartering van die mnemoniese instruksies te binêre kodes, vulsel dit in'n char* pointer en giet dit as'n funksie en die uitvoering?

Ja.Dit is een manier om dit te doen.Die gevolglike kode sou gegooi word om'n wyser om te funksioneer in C.

Ander wenke

  

Is dit iets soos mag nou wel as die kartering van die mnemoniese instruksies om binêre kodes, vulsel dit in 'n kar * wyser en giet dit as 'n funksie en die uitvoering van?

Ja, as jy dit doen in C of C ++ (of iets soortgelyks), dit is presies wat jy wil doen.

Dit wil voorkom mag nou wel, maar dit is eintlik 'n juweel van die taal ontwerp. Onthou, die werklike algoritme wat jy wil gebruik is baie eenvoudig:. Bepaal watter instruksies wat jy wil gebruik, laai hulle in 'n buffer in die geheue, en spring na die begin van daardie buffer

As jy regtig probeer om dit te doen, al is, maak seker dat jy die roeping konvensie kry reg wanneer jy terugkeer na jou C program. Ek dink as ek wou kode Ek sal kyk vir 'n biblioteek te sorg van daardie aspek neem vir my op te wek. Nanojit was onlangs in die nuus; jy kan kyk na dit.

Yup. Jy bou net 'n kar * en uit te voer nie. Maar, moet jy daarop 'n paar besonderhede. Die kar * moet wees in 'n uitvoerbare artikel van geheue en moet behoorlike belyning het.

In bykomend tot nanojit jy kan ook kyk na LLVM wat ook 'n biblioteek wat in staat is om die samestelling van verskillende program vertoë neer op 'n funksie wyser. Dis koppelvlak is skoon en die gegenereerde kode geneig doeltreffend te wees.

Sover ek weet dit stel alles in die geheue, want dit het 'n paar heuristiek hardloop om na die kode te optimaliseer (dws: lining met verloop van tyd), maar jy kan 'n blik op die Gedeelde Bron Common Language Infrastructure 2.0 rotor release. Die hele kodebasis is identies NET behalwe vir die beweging en die GC.

Asook Rotor 2.0 - jy kan ook 'n blik op die HotSpot virtuele masjien in die OpenJDK.

Meer oor die opwekking van 'n DLL: die bykomende vereiste I / O vir wat, plus 'n skakel, plus die kompleksiteit van die opwekking van die DLL-formaat, sal maak dat baie meer ingewikkeld, en bo alles wil hulle prestasie doodmaak; Daarbenewens, in die einde wat jy nog bel 'n funksie wyser na die gelaaide kode, so ... Ook, kan JIT samestelling een metode gebeur op 'n tyd, en as jy wil om dit te doen wat jy baie van die klein DLLs wil genereer.

Oor die "uitvoerbare artikel" vereiste, 'n beroep mprotect () op POSIX stelsels kan die regte op te los (daar is 'n soortgelyke API op Win32). Wat jy nodig het om dit te doen vir 'n groot geheue segment plaas wat eens per metode aangesien dit sou te stadig anders wees.

Op vlakte x86 jy sal nie die probleem op te let, op x86 met PAE of 64bit AMD64 / Intel 64 bit masjiene jy 'n segfault wil kry.

  

Is dit iets soos mag nou wel as kartering   mnemoniese instruksies om binêre   kodes, vulsel dit in 'n kar *   wyser en giet dit as 'n funksie   en die uitvoering van?

Ja, dit werk.

Om dit te doen in vensters moet jy PAGE_EXECUTE_READWRITE stel om die toegekende blok:

void (*MyFunc)() = (void (*)()) VirtualAlloc(NULL, sizeofblock,  MEM_COMMIT, PAGE_EXECUTE_READWRITE);

//Now fill up the block with executable code and issue-

MyFunc();
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top