Avatar billede nak-m Nybegynder
23. august 2002 - 16:47 Der er 29 kommentarer og
1 løsning

maskinkode m.m!

to spørgsmål:

1.)
En der kan komme med et eksempel på en kode der kan lave en exe fil?

det jeg havde tænkt på var at hvis man nu havde "maskinkoden" til et program kunne man så ikke skrive en exefil ud fra den? eller skal man gøre noget andet måske?

2.)
Er der en måde hvorpå man kan gemme en exefils maskinkode i en txtfil? (eller noget i den stil!)
Hvordan
Avatar billede djones Nybegynder
23. august 2002 - 16:53 #1
Ja ser du... det du skal er nok

1) Have fat i en compiler såsom nasm og så compile maskinkoden.

2) Have fat i en decompiler og så gemme det decompilede programs kode.
Avatar billede chries Nybegynder
23. august 2002 - 16:53 #2
Jeg er ikke helt med, er det en disassembler du tænker på ?

http://www.datarescue.com/idabase/ida.htm

( http://www.azillionmonkeys.com/qed/asm.html )
Avatar billede nak-m Nybegynder
23. august 2002 - 17:00 #3
øhm nej det jeg mente var:

1.)Hvis man nu har en maskinkode(et og nultaller) hvordan får man så sit program til at gemme det som en exefil? hvis dette ikke er muligt hvad er så muligt?

2.)Hvordan får man sit program til at gemme maskinkoden(et og nultaller) fra en exefil ned i en txtfil?

djones: jeg vil have mine egne programmer til at gøre det!
Avatar billede nak-m Nybegynder
23. august 2002 - 17:27 #4
nogen der?
Avatar billede chries Nybegynder
23. august 2002 - 17:33 #5
vil du have source kode eller en generel beskrivelse ?
Avatar billede nak-m Nybegynder
23. august 2002 - 19:03 #6
source kode tak!

men da også gerne lidt generel beskrivelse :)
Avatar billede nak-m Nybegynder
23. august 2002 - 19:19 #7
...
Avatar billede krismort Nybegynder
23. august 2002 - 23:28 #8
okay det kan jeg da nemt hjælpe dig med
du laver et program der omdøber din exe fil til en txt fil ... vola og du har gemt dit programs kode i en tekstfil... hvis du vil lave dit program om til en executeable igen laver du bare et program der omdøber din tekstfil til en exec. Så nemt skal det være!
Avatar billede nak-m Nybegynder
24. august 2002 - 03:11 #9
krismort: har du en smart kode eller noget der viser et eksempel?
Avatar billede nak-m Nybegynder
25. august 2002 - 00:45 #10
er der nogen eller skal jeg lukke?
Avatar billede reficul Nybegynder
26. august 2002 - 01:53 #11
Helt så simpelt er det nu ikke - ved en com-fil ja, så er det bare kode fra byte 0. EXE-filer har en såkaldt 'MZ'-header og EXE-filer til nyere operativsystemer har en ekstra 'PE'-header (Portable Executeable). Headeren indeholder informationer om entry-point (Hvor i koden programmet starter) og sektioner som programmet deles op i (.text til kode, .data til writeable data og .rdata til read-only data osv.).
MSDN til Visual Studio 6 har en detaljeret beskrivelse af EXE-filens opbygning, men deres online-version er desværre ikke hvad det har været.
Jeg foreslår at du søger på noget alla "exe mz pe header" på www.google.com og så finder du sikker noget godt...
Avatar billede nak-m Nybegynder
26. august 2002 - 06:43 #12
jeg kan kun bruge kode :)
Avatar billede soepro Nybegynder
26. august 2002 - 08:42 #13
nak-m >> Er dette et C/C++ spørgsmål ?

Du kan bruge den gode gamle debug.exe kommando til både at assemble og disassemble kode - inkl. at lave exe og com filer.

Det korteste .com program jeg kender er:

205 25  (Decimalt.)
INT 19h (Assembler.)

Programmet laver en warmboot af din maskine.
Avatar billede nak-m Nybegynder
26. august 2002 - 12:44 #14
soepro:
ja det er et C/C++ spørgsmål! :)

jeg vil gerne lave et program der kan ovenstående ting! bare kode eller noget!
Avatar billede soepro Nybegynder
26. august 2002 - 13:22 #15
Nåh - du vil lave en compiler ? Det er ikke nogen let opgave - men det er du vel klar over.

Ovenstående program kan dannes vha. følgende:

#include <stdio.h>
int main(void)
{
  FILE *pgmFile;
  if ((pgmFile = fopen("C:\\temp\\boot.com", "wb")) != NULL)
  {
    fprintf(pgmFile, "%c%c", 205, 25);
    fclose(pgmFile);
  };
  return 0;
}

I dit \TEMP bibliotek på C: drevet har du nu en boot.com kommando, der laver warmboot af din PC'er.
Avatar billede nak-m Nybegynder
26. august 2002 - 13:27 #16
soepro:

for det første hva er en warmboot?

for det andet skal der altså ikke til at blandes alle mulige filer ind i det!

det jeg gerne vil ha koden til er et program der kan skrive maskinkoden(et og nultallene) ned i en tekstfil og derefter også kunne lave en exefil udfra tekstfilen! :)
Avatar billede nak-m Nybegynder
26. august 2002 - 13:28 #17
(og det må gerne være i C++)
Avatar billede soepro Nybegynder
26. august 2002 - 13:31 #18
Hvis du skal lave en "rigtig" assembler compiler, skal du jo definere alle assembler kommandoer (f.eks. som navn og antal parametre) i en intern tabel (eller endnu bedre - en du læser ind ved opstart) og så "oversætte" en ASM kildefil til de tilsvarende assembler koder.

typedef asmInst struct
{
  char inst[4];
  int  parms;
};
asmInst instSet[256]; // Max 256 instructions.

:
  strcpy(instSet[205].inst, "INT");
  instSet[205].parms = 1;

:
  FILE *sourceFile;
  int  found;
 
  if ((fopen(sourceFile, argv[1], "rt")) != NULL)
  {
    while (fgets(sourceFile, buffer, sizeof(buffer)-1) != NULL)
    {
      found = 0;
      for (idx = 0; idx < 256; idx++)
      {
        if (strpos(buffer, instSet[idx]) == 1)
        { // ASM instruktion nr. idx
          fprintf(pgmFile, "%c", idx);
          for (idy = 0; idy < instSet[idx].parms; idy++)
            fprintf(pgmFile, "%c", buffer + strlength(instSet[idx] + idy);
          found = 1;
          break;
        };
      };
      // Ukendt instruktion her.
      if (!found)
        /* Giv fejl */;
    };
    fclose(sourceFile);
    fclose(pgmFile);
  };
:
Avatar billede nak-m Nybegynder
26. august 2002 - 13:33 #19
hvorfor nu assembler? kan du lige forklare? :)

den skal jo ikke oversætte noget kode? skal den?
Avatar billede soepro Nybegynder
26. august 2002 - 15:06 #20
nak-m >> Det er det jeg har lavet til dig - Der kommer nuller og ettaler ned vha. fprintf(pgmFile, "%c%c", 205, 25);
Avatar billede soepro Nybegynder
26. august 2002 - 15:07 #21
nak-m >> warmboot er det din maskine gør, når du trykker på Ctrl+Alt+Delete. (Coldboot er sluk for maskinen, vent lidt og tændt igen.)
Avatar billede chries Nybegynder
26. august 2002 - 15:17 #22
tror han mener man kan læse 101011111010 i txt filen.
Avatar billede nak-m Nybegynder
26. august 2002 - 15:26 #23
chries: ja sådan skal det komme til at stå :) og så bagefter skal man kunne lave det til en exefil igen :)
Avatar billede soepro Nybegynder
26. august 2002 - 15:42 #24
Til at lave en int om til bits:

char * intToBits(int number)
{
  static char bits[9] = { "00000000" };
  static int div, rest;
  div  = 0xFF;
  rest = number;
  for (int idx = 7; idx >= 0; idx--)
  {
    if (rest / div == 1)
      bits[idx] = '1';
    else
      bits[idx] = '0';
    rest %= div;
    div  /= 2;
  };
  return bits;
}
int bitsToInt(char *bit)
{
  int intNum;
  mult  = 0xFF;
  intNum = 0;
  for (int idx = 0; idx < 8; idx++)
  {
    if (bits[idx] == '1')
      intNum += mult;
    mult /= 2;
  }
  return intNum;
}

:
fprintf(pgmFile, "%.8s\r\n", intToBits(205));
fprintf(pgmFile, "%.8s\r\n", intToBits(25));
:
fgets(pgmFile, buffer, sizeof(buffer)-1);
printf("%d", bitsToInt(buffer));
Avatar billede nak-m Nybegynder
26. august 2002 - 16:01 #25
...kan du ikke lave et program det laver udskriver et andet programs maskinkode?

(hvad skal ovenstående kode bruges til?)
Avatar billede chries Nybegynder
26. august 2002 - 16:33 #26
noget ala det her ?

.exe -> .txt

#include <fstream.h>
#include <iostream.h>


int main(int argc, char* argv[])
{
    if( argc != 2 )
    {
        cout << "app.exe file_to_convert.exe" << endl;
        return 0;
    }
    else
    {
        cout << "processing " << argv[1] << "!" << endl;
    }

    fstream fileIn;
    fstream fileOut;

    fileIn.open( argv[1], ios::in|ios::binary|ios::nocreate|ios::noreplace);
    fileOut.open( "out.txt", ios::out);
   
    if( !fileIn )
    {
        cout << "could not open input file" << endl;
        return 0;       
    }

    if( !fileOut )
    {
        cout << "could not open output file" << endl;
        return 0;       
    }

    unsigned char input;

    while( !fileIn.eof() )
    {

        fileIn.read( &input, 1 );

        for( int i=7; i>=0; i-- )
        {
            if( input & (1<<i) )
            {
                fileOut << "1";
            }
            else
            {
                fileOut << "0";
            }
        }
    }

    return 0;
}
Avatar billede chries Nybegynder
26. august 2002 - 16:33 #27
.txt -> .exe

#include <fstream.h>
#include <iostream.h>


int main(int argc, char* argv[])
{
    if( argc != 2 )
    {
        cout << "reapp.exe file_to_convert.txt" << endl;
        return 0;
    }
    else
    {
        cout << "processing " << argv[1] << "!" << endl;
    }

    fstream fileIn;
    fstream fileOut;

    fileIn.open( argv[1], ios::in|ios::nocreate|ios::noreplace);
    fileOut.open( "out.exe", ios::out|ios::binary);
   
    if( !fileIn )
    {
        cout << "could not open input file" << endl;
        return 0;       
    }

    if( !fileOut )
    {
        cout << "could not open output file" << endl;
        return 0;       
    }

    unsigned char input[8];
    unsigned char result;

    while( !fileIn.eof() )
    {

        fileIn.read( input, 8 ); // read 8 bytes (1 byte = 1 bit)

        result = 0;
        for( int i=0; i<8; i++ )
        {
            result += ( input[i] == '0' ? 0 : (1<<(7-i)) ); // if 0, add value 0, else add value 1<<(7-i)
        }

        fileOut.write( &result, 1 );
    }

    return 0;
}
Avatar billede nak-m Nybegynder
26. august 2002 - 16:48 #28
YES SIR! :o)

kom med svar chries!!!!!!
Avatar billede chries Nybegynder
26. august 2002 - 16:50 #29
Der er ikke bygget meget beskyttelse ind og koden er ikke særlig køn, burde nok forbedres :-)
Avatar billede nak-m Nybegynder
26. august 2002 - 16:55 #30
hehe men smukt er det nu alligevel!!! ;o)

(og hvad skal man med beskyttelse?)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester