Gå til innhold

Hvordan gjøre om kode til kjørebare instrukser?


Anbefalte innlegg

Et program lytter på en nettverksport og får en instruks som er skrevet i f.eks C/C++.

Hvordan kan dette programmet gjøre om denne koden til kjørbar kode i runtime?

Man sender altså et script, eller kodesnutter, til programmet.

Noen som har noen tips?

Lenke til kommentar
Videoannonse
Annonse
Et program lytter på en nettverksport og får en instruks som er skrevet i f.eks C/C++.

Hvordan kan dette programmet gjøre om denne koden til kjørbar kode i runtime?

Man sender altså et script, eller kodesnutter, til programmet.

Noen som har noen tips?

 

Enkelte scriptspråk, som f.eks. Perl, har en egen eval-funksjon. Med denne kan man altså eksekvere / interprete kode man sender til funksjonen. Funksjonen er potensielt skummel, da folk med skumle hensikter kunne tenkes å sende "ondsinnet" kode, som f.eks. formaterer filsystemet eller andre uhørte ting.

 

Jeg har ikke vært borti noe til C/C++, men man burde jo kunne kompilere "instruksen" ved å spawne kompilatoren, og så la OS'et kjøre den kompilerte koden etterpå. Igjen blir det "risikosport" å ha en slik tjeneste kjørende, med tanke på misbruk.

 

Hva er det egentlig du prøver å oppnå?

 

Werner

Lenke til kommentar
Jeg har noen forslag, men etter min mening virker dette som en trojaner, og jeg er ikke interessert i å hjelpe folk med slikt.

 

Kan se at det ser slik ut, men det er ikke det jeg forsøker å lage.

Det jeg forsøker å finne ut at er hvordan kode i tekst blir omgjort til noen som prossesoren kan gjøre noe med.

 

Jeg kan jo selvsagt lage et lite "script språk" som bare mitt program forstår og har forhåndsprogrammerte funksjoner, men det blir ikke det samme.

Poenget her er å lære hvordan teskt oversettes til kjørbar kode.

Hvis jeg skulle lagd en trojaner, kunne det blitt gjort enklere ved å sende en ferdigkompilert exe fil som den kjører.

 

Har ingen interesse av å lage virus/trojaner etc.

Lenke til kommentar
Et program lytter på en nettverksport og får en instruks som er skrevet i f.eks C/C++.

Hvordan kan dette programmet gjøre om denne koden til kjørbar kode i runtime?

Man sender altså et script, eller kodesnutter, til programmet.

Noen som har noen tips?

 

Må det være C++?

 

Det aller enkleste ville ha vært å bruke et språk med støtte for evaluering av kode runtime. Common Lisp, Python, Perl, Ruby -- det finnes flere. Imidlertid bør du være klar over at evaluering av en datastrøm som kommer utenfra er en veldig farlig affære. De eksemplene jeg har hørt om hvor dette er blitt brukt begrenset klientsiden til å være localhost.

 

Hvis det absolutt må være C++ eller C, så er fremgangsmåten å lage en dårligere variant av eval. Du definerer ditt eget kommando(mini)språk, lager en parser til det, tolker den innkommende datastrømmen ihht. dette kommandospråket og utfører de nødvendige handlingene selv. En nok mer "hackish" løsning er å tolke den innkommende datastrømmen som rå maskinkode og utføre det direkte. For et utsnitt av "rå maskinkode" vil dette fungere, om enn være omtrent umulig å debugge.

Endret av zotbar1234
Lenke til kommentar

Poenget her er å lære hvordan teskt oversettes til kjørbar kode.

 

Hvis det er dette du prøver å lære deg, så hører dette inn under kompilatordesign, et ganske omfattende emne som ikke er gjort over natta å sette seg inn i.

 

Slik du i utgangspunktet framla "problemstillingen" din så skjønner jeg godt at folk reagerte og mistenkte deg for å pønske på noe skummelt. Jeg tenkte samme tanke selv, men bestemte meg likevel for å gi deg et konstruktivt svar.

 

Werner

Lenke til kommentar

Å sende over maskinkode lar seg ikke gjøre uten at programmet linkes på andre siden uansett, så det er egentlig mer fornuftig å bruke et scriptspråk allikevel. Men hvis hensikten er å lære kompilatorteknikk, så er vel deet best å holde seg på én side av nettverket.

 

Det er utrolig omfattende å gjøre om noe som helst til maskinkode (spesielt x86) men en mellomting kan jo være noe. .NET bruker noe som kalles Common Intermediate Language, som er et slags objektorientert assembly språk. Du kan jo prøve å lage noe som kompilerer til CIL for deretter å bli kompilert til .exe, eventuelt bare rett til vanlig z86 assembly og kompilere det med nasm eller lignende. Som du fort vil se, så ligger det mye jobb bak en slik compiler.

Lenke til kommentar
Å sende over maskinkode lar seg ikke gjøre uten at programmet linkes på andre siden uansett,

 

Dette er jo beviselig feil -- la oss si vi lager en funksjon som legger 10 til argumentet og returnerer resultatet. Koden for denne funksjonen kan plasseres i en char array, som typecastes til en funksjonspeker (ja, jeg vet at casting i dette tilfellet er ulovlig, men det virker på en rekke implementasjoner, og siden man sender instruksjoner spesifikke for en bestemt platform, hvem bryr seg om portabilitet) og deretter eksekveres. Hvorfor skulle denne funksjonen måtte linkes med noe som helst? Dette fungerte brillefint på MIPS R4400 for noen år tilbake.

 

(...) så det er egentlig mer fornuftig å bruke et scriptspråk allikevel.

 

Iallfall noe som har eval, slik at man slipper å lage sin egen (dårlig) kopi.

Lenke til kommentar
Dette er jo beviselig feil -- la oss si vi lager en funksjon som legger 10 til argumentet og returnerer resultatet. Koden for denne funksjonen kan plasseres i en char array, som typecastes til en funksjonspeker (ja, jeg vet at casting i dette tilfellet er ulovlig, men det virker på en rekke implementasjoner, og siden man sender instruksjoner spesifikke for en bestemt platform, hvem bryr seg om portabilitet) og deretter eksekveres. Hvorfor skulle denne funksjonen måtte linkes med noe som helst? Dette fungerte brillefint på MIPS R4400 for noen år tilbake.

 

Du har rett.

Men hva hvis du skal gjøre OS operasjoner, eller kommunisere med andre programmer?

Må ikke da jump tabellen endres?

eller lage en jump tabell da.

 

Btw, kan en bare gjøre om et minneområdet til en funksjonspeker og starte den? Vil ikke operativsystemet reagere på det?

Aldri prøvd det selv

Endret av GeirGrusom
Lenke til kommentar
Men hva hvis du skal gjøre OS operasjoner, eller kommunisere med andre programmer?

Må ikke da jump tabellen endres?

eller lage en jump tabell da.

 

Hvis man har en binær statisk linket blobb fra et likt OS, hvorfor skulle det egentlig det ikke gå, såfremt denne blobben ikke gjør noen eksterne referanser?

 

Men uansett, dette er IKKE slik OP burde gå fram :D

 

Btw, kan en bare gjøre om et minneområdet til en funksjonspeker og starte den? Vil ikke operativsystemet reagere på det?

 

Dette er C -- alt er lov :) Dette ble prøvd av en kollega av meg i undervisningsøyemed (poenget var å illustrere at en peker til et minneområde i C (void*) kunne egentlig peke på hva som helst, selv om språkdefinisjonen ikke åpnet for den type kreativ bruk).

Endret av zotbar1234
Lenke til kommentar
Btw, kan en bare gjøre om et minneområdet til en funksjonspeker og starte den? Vil ikke operativsystemet reagere på det?

 

Dette er C -- alt er lov :) Dette ble prøvd av en kollega av meg i undervisningsøyemed (poenget var å illustrere at en peker til et minneområde i C (void*) kunne egentlig peke på hva som helst, selv om språkdefinisjonen ikke åpnet for den type kreativ bruk).

Det vil vel ikke fungere om OSet implementerer stack execution protection?

 

Hvis man implementerer "remote execution" ved å gjøre dette, må man vel også huske på at server-programvaren slenge på en returpeker på bufferet iom. at det vil være umulig for klienten å vite.

Lenke til kommentar
Det vil vel ikke fungere om OSet implementerer stack execution protection?

 

Antageligvis ikke, det var heller ikke poenget :)

 

Hvis man implementerer "remote execution" ved å gjøre dette, må man vel også huske på at server-programvaren slenge på en returpeker på bufferet iom. at det vil være umulig for klienten å vite.

 

Altså, bare så det er sagt -- jeg foreslår ikke dette som en praktisk løsning, kun en teoretisk mulighet.

Lenke til kommentar
Det vil vel ikke fungere om OSet implementerer stack execution protection?

 

Antageligvis ikke, det var heller ikke poenget :)

 

Hvis man implementerer "remote execution" ved å gjøre dette, må man vel også huske på at server-programvaren slenge på en returpeker på bufferet iom. at det vil være umulig for klienten å vite.

 

Altså, bare så det er sagt -- jeg foreslår ikke dette som en praktisk løsning, kun en teoretisk mulighet.

Det er klart, det vil ikke være praktisk, men nevertheless er det litt interessant å tenke på, heh. :)

Lenke til kommentar
Ok. Ante ikke at det var en så omfattende og krevende oppgave.

Går det ann å si kort hvorfor det er så omfattende?

 

Det du spør om i første post er ikke omfattende å få til, og det de andre snakker om her behøver ikke være noe en må ta hensyn til.

 

GCC er bare et program som et hvilket som helst annet program. En server kan eksekvere GCC og angi "script-snutten" som argument for så å eksekvere resultatet og sende det som ble skrevet ut tilbake til klient.

Endret av symbolicweb2
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...