Edycja exekow =P

0

Jak mozna "edytowac" albo "cos" dodac do juz skompilowanego exeka?

Slyszalem ze mozna "edytowac naglowek" albo cos takiego =P wiecie moze jak to sie robi?
I jak to zrobic aby mialo "wplyw" na dzialnie programu =] a raczej na zmienne =] jak np: haslo do mojego programu

0

Mozna mu edytować np. zasoby. Jest do tego program o nazwie ExeScope.

0

ta... nie wiem <ort>od kad </ort>to viry edytuja same siebie? =] nie liczac mutacji
albo prosza kogos o to =]

<ort>Che </ort>aby kazdy uzytkownik mogl <ort>zalorzyc </ort>wlasne haslo do programu...

0

dodać coś do skompilowanego execa można (patrz viry), ale modyfikacja jest troche trudniejsza (jeżeli nie chodzi o zasoby). Ale i tak cały czas pamiętam jak zmieniłem autora programu napisanego w TP: hexedit i mała zmiana pliczku i gotowe :)

0

Pochwalony! Edycja exe'ków... fajnie brzmi :0. Da się coś takiego robić, lecz trza znać rekordy, które są zyżyte w takim pliku. Z tego co mi się zdaje, exe'k to zbiór rekordów i zwykłych wpisów, więc jedynym rozwiązaniem jest znajomość ich właściwości (typy i długości zmiennych). A tak poza tym to można exe'ki edytować inaczej (do tematu to także należy :P:P:P).

var
TF: TextFile;
begin
AssignFile(TF, 'plik.exe');
Append(TF);
Write(TF, dopisane :)');
CloseFile(TF);

...i na końcu exe'ka będziesz miał zaskakującą wiadomość :P

0

skoro w trojanach da sie modyfikowac exeki dodawac do nich "dane" jak IP mail ICQ itd...

to i w zwyklym programie mozna!
Tylko jak =P

0

No ba! Pewnie ze mozna :) Macie cos takiego i to wykozystajcie :)

function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
aStream: TFileStream;
iSize: Integer;
begin
Result := False;
if not FileExists(AFileName) then
Exit;
try
aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite);
MemoryStream.Seek(0, soFromBeginning);
// seek to end of File
// ans Ende der Datei Seeken
aStream.Seek(0, soFromEnd);
// copy data from MemoryStream
// Daten vom MemoryStream kopieren
aStream.CopyFrom(MemoryStream, 0);
// save Stream-Size
// die Streamgröße speichern
iSize := MemoryStream.Size + SizeOf(Integer);
aStream.Write(iSize, SizeOf(iSize));
finally
aStream.Free;
end;
Result := True;
end;

function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
aStream: TFileStream;
iSize: Integer;
begin
Result := False;
if not FileExists(AFileName) then
Exit;

try
aStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
// seek to position where Stream-Size is saved
// zur Position seeken wo Streamgröße gespeichert
aStream.Seek(-SizeOf(Integer), soFromEnd);
aStream.Read(iSize, SizeOf(iSize));
if iSize > aStream.Size then
begin
aStream.Free;
Exit;
end;
// seek to position where data is saved
// zur Position seeken an der die Daten abgelegt sind
aStream.Seek(-iSize, soFromEnd);
MemoryStream.SetSize(iSize - SizeOf(Integer));
MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize));
MemoryStream.Seek(0, soFromBeginning);
finally
aStream.Free;
end;
Result := True;
end;

procedure TForm1.SaveClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
aStream := TMemoryStream.Create;
Memo1.Lines.SaveToStream(aStream);
AttachToFile('Test.exe', aStream);
aStream.Free;
end;

procedure TForm1.LoadClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
aStream := TMemoryStream.Create;
LoadFromFile('Test.exe', aStream);
Memo1.Lines.LoadFromStream(aStream);
aStream.Free;
end;

Tylko zeby ktos nie wpadl na pomysl ze to ja sam wszystko napisalem :) To jest tylko pozyczone z torry.net :)

0

o kurcze :)
podoba mi się to, ale mógłby ktoś podać konkretny przykład jak to wykorzystać?
np chciałbym dokleić do exeka wywołanie jakiegośokienka informacyjnego :)

pozdro

Dzisiaj już za późno, ale kiedyś pisałem program gdzie można było zmienic hasło w pliku EXE. Jutro ok. 19 coś napiszę. Wiec jedno, edycja gotowego pliku nie jest prosta. Na początek polecam: Andrzej Dudek "Jak pisać wirusy". Wspaniała podróż w głąb systemu i asemblera.

0

Odnalazłem na dysku dwa programiki. Jeden jest pętlą nieskończoną, którą przerywa poprawne hasło. Drugi napisany w Turbo Vision 2.0 jest przeznaczony do zmiany hasła w pliku EXE. Działanie jest następujące. Na wstępie zadeklarowałem stałą LongInt do przechowywania hasła (8520). W postaci szesnastkowej jest to (2148) natomiast w pamięci komputera przechowywanie jest w kolejności odwrotnej (4821). Podstawy asemblera i będziesz wiedział dlaczego.
Program EditPasw ma podany offset hasła (w zmiennej PasOfs w procedurze HandleEvent), który wcześniej wyszukałem programem hexWorkShop. Odczytuje on owo hasło z pliku i umożliwia podanie nowego. jeżeli hasło stare się zgadza to edycja nowego kończy się sukcesem. Poniżej źródła (miej świadomość, że jakiekolwiek zmiany w kodzie źródłowym spowodują zmianę offsetu hasła):

Hasło:

USES Crt;

CONST
 Haslo    :LongInt = 8520;
 Awaryjne :LongInt = 1111;

VAR S, H, A : STRING[20];
    C       : Char;
    I       : Integer;
    OrigMode: Integer;

BEGIN
 OrigMode := LastMode;
 WHILE (1=1) DO
  BEGIN
   CheckBreak := FALSE;
   ClrScr;
   TextBackGround(Black);
   TextColor(Green);
   GoToXY(12,10);
   WriteLn('                 ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ?  ' );
   GoToXY(12,11);
   WriteLn('                 ş   podaj haslo:       ş  ' );
   GoToXY(12,12);
   WriteLn('                 ČÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍĽ  ' );
   Str(Haslo, H);
   Str(Awaryjne, A);
   S := '';
   GoToXY(46+Length(S),11);
   TextColor(Yellow);
   FOR i:=1 TO 4 DO
    BEGIN
     C:=Readkey;
     GoToXY(46+Length(S),11);
     Write('*');
     delay(200);
     S := S + C;
    END;
  ClrScr;
  NormVideo;
  IF (S = H) OR (S = A) THEN Break;
  IF (S <> H) OR (S <> A) THEN
     BEGIN
      Clrscr;
      TextMode(CO40);
      TextColor(LightGreen);
      GoToXY(15,12);
      WriteLn('ACCESS DENIDET');
      Delay(2000);
     END;
  TextMode(OrigMode);
 END;
 CheckBreak := TRUE;
END.

Edycja hasła

USES App, Objects, Views, Drivers, Menus, Dialogs, Validate, MsgBox;

CONST
 hcOldPassword = 2000;
 hcNewPassword = 2001;
 hcOk          = 2003;
 hcAnuluj      = 2004;

 cmHaslo = 100;  hcHaslo = 1000;
 cmAutor = 110;  hcAutor = 1010;

TYPE
 PPXPValidatorPL = ^TPXPValidatorPL;
 TPXPValidatorPL = OBJECT (TPXPictureValidator)
   PROCEDURE Error; VIRTUAL;
 END;

 PPassword = ^TPassword;
 TPassword = OBJECT (TDialog)
   CONSTRUCTOR Init;
 END;

 PAutor = ^TAutor;
 TAutor = OBJECT (TDialog)
   CONSTRUCTOR Init;
 END;

 PHStatusLine = ^THStatusLine;
 THStatusLine = OBJECT (TStatusLine)
   FUNCTION Hint(AHelpCtx :Word) :STRING; VIRTUAL;
 END;

 TPasswApp = OBJECT (TApplication)
   PROCEDURE InitMenuBar; VIRTUAL;
   PROCEDURE InitStatusLine; VIRTUAL;
   PROCEDURE InitDesktop; VIRTUAL;
   PROCEDURE HandleEvent(VAR Event :TEvent); VIRTUAL;
 END;

FUNCTION S2I(s :STRING) :LongInt;
VAR i :LongInt; code :Integer;
BEGIN
 val(s, i, code);
 S2I := i;
END;

PROCEDURE TPXPValidatorPL.Error;
BEGIN
 MessageBox('Musisz podac kod czterocyfrowy', NIL, mfError OR mfOkButton);
END;

CONSTRUCTOR TPassword.Init;
VAR R     :TRect;
    Param :PInputLine;
    Button:PButton;
BEGIN
 R.Assign(0,0, 25,11);
 TDialog.Init(R, 'Haslo');
 Options := Options OR ofCentered;
 R.Assign(16,2, 22,3);
 Param := New(PInputLine, Init(R, 4));
 Param^.HelpCtx := hcOldPassword;
 Param^.SetValidator(New(PPXPValidatorPL, Init('####', TRUE)));
 Insert(Param);
 R.Assign(2,2, 15,3);
 Insert(New(PLabel, Init(R, '~S~tare haslo:', Param)));
 R.Assign(16,4, 22,5);
 Param := New(PInputLine, Init(R, 4));
 Param^.HelpCtx := hcNewPassword;
 Param^.SetValidator(New(PPXPValidatorPL, Init('####', True)));
 Insert(Param);
 R.Assign(2,4, 15,5);
 Insert(New(PLabel, Init(R, ' ~N~owe haslo:', Param)));
 R.Assign(2,6, 10,8);
 Button := New(PButton, Init(R, '~O~k', cmOk, bfDefault));
 Button^.HelpCtx := hcOk;
 Insert(Button);
 R.Assign(11,6, 22,8);
 Button := New(PButton, Init(R, '~A~nuluj', cmCancel, bfNormal));
 Button^.HelpCtx := hcAnuluj;
 Insert(Button);
 SelectNext(FALSE);
END;

CONSTRUCTOR TAutor.Init;
VAR R :TRect;
BEGIN
 R.Assign(0,0, 50,13);
 TDialog.Init(R, 'O autorze');
 Options := Options OR ofCentered;
 Flags := Flags AND NOT wfMove;
 R.Grow(-1, -1);
 Dec(R.B.Y, 3);
 Insert(New(PStaticText, Init(R,
      #13#3'PROGRAM << Edit password >>'
     +#13#3'(wersja 1.0)'
     +#13#3'Copyrigh (c) 2004 by Adam Oleksy'#13
     +#13#3'Olek International'
     +#13#3'ul. Garbarska 8/1 64-200 Wolsztyn')));
 R.Assign(20,10, 30,12);
 Insert(New(PButton, Init(R, '~O~K', cmOk, bfDefault)));
END;

FUNCTION THStatusLine.Hint(AHelpCtx :Word) :STRING;
BEGIN
 CASE AHelpCtx OF
  hcOldPassword :Hint := 'Podaj stare haslo';
  hcNewPassword :Hint := 'Podaj nowe haslo';
  hcHaslo       :Hint := 'Opcje zmiany hasla';
  hcAutor       :Hint := 'Informacje o autorze';
  hcOk          :Hint := 'Zatwierdzenie zmian';
  hcAnuluj      :Hint := 'Anulowanie zmian';
  ELSE           Hint := '';
 END;
END;

PROCEDURE TPasswApp.InitMenuBar;
VAR R :TRect;
BEGIN
 GetExtent(R);
 R.Assign(2,1, 30,5);
 MenuBar := New(PMenuBox, Init(R, NewMenu(
  NewItem('~Z~miana hasla', 'F3', kbF3, cmHaslo, hcHaslo,
  NewItem('~A~utor',        'F4', kbF4, cmAutor, hcAutor,
  NIL))),
  NIL));
END;

PROCEDURE TPasswApp.InitStatusLine;
VAR R :TRect;
BEGIN
 GetExtent(R);
 R.A.Y := R.B.Y-1;
 StatusLine := New(PHStatusLine, Init(R,
  NewStatusDef(0, hcHaslo-1,
   NewStatusKey('~Alt-X~ Wyjscie', kbAltX, cmQuit,
   NewStatusKey('~F3~ Haslo', kbF3, cmHaslo,
   NewStatusKey('~F10~ Menu', kbF10, cmMenu, StdStatusKeys(NIL)))),
  NewStatusDef(hcHaslo, hcAutor,
   NewStatusKey('~Alt-X~ Wyjscie', kbAltX, cmQuit, StdStatusKeys(NIL)),
  NewStatusDef(hcAutor+1, $FFFF,
   NewStatusKey('~Alt-X~ Wyjscie', kbAltX, cmQuit,
   NewStatusKey('~F3~ Haslo', kbF3, cmHaslo,
   NewStatusKey('~F10~ Menu', kbF10, cmMenu, StdStatusKeys(NIL)))),
  NIL)))));
END;

PROCEDURE TPasswApp.InitDesktop;
VAR R :TRect;
BEGIN
 GetExtent(R);
 Dec(R.B.Y);
 Desktop := New(PDesktop, Init(R));
END;

PROCEDURE TPasswApp.HandleEvent(VAR Event :TEvent);

PROCEDURE WMHaslo;
CONST PasOfs :LongInt = $15A2;
VAR Password :PPassword;
    Wyk      :Word;
    Dane     :RECORD  OldPas, NewPas :STRING[4];  END;
    F        :FILE;
    OP, NP   :LongInt;
BEGIN
 Password := New(PPassword, Init);
 IF ValidView(Password) <> NIL THEN
    BEGIN
     Dane.OldPas := '';
     Dane.NewPas := '';
     Password^.SetData(Dane);
     Wyk := Desktop^.ExecView(Password);
     IF Wyk = cmOk THEN
        BEGIN
         Password^.GetData(Dane);
         System.Assign(F, 'PASSW.EXE');
         {$I-}
         System.Reset(F, 1);
         {$I+}
         IF IOResult <> 0 THEN
            BEGIN
             MessageBox('Nie znalazlem pliku PASSW.EXE',
                        NIL, mfError OR mfOkButton);
             Exit;
            END;
         Seek(F, PasOfs);
         BlockRead(F, OP, 4);
         IF OP = S2I(Dane.OldPas) THEN
            BEGIN
             NP := S2I(Dane.NewPas);
             Seek(F, PasOfs);
             BlockWrite(F, NP, 4);
             MessageBox('Haslo zostalo zmienione',
                       NIL, mfInformation OR mfOkButton);
            END ELSE MessageBox('Stare haslo jest niepoprawne',
                                 NIL, mfError OR mfOkButton);
         System.Close(F);
       END;
    END;
END;

PROCEDURE WMAutor;
VAR Autor :PAutor;
BEGIN
 Autor := New(PAutor, Init);
 IF ValidView(Autor) <> NIL THEN
    BEGIN
     Desktop^.ExecView(Autor);
     Dispose(Autor, Done);
    END;
END;

BEGIN
 TApplication.HandleEvent(Event);
 IF Event.What = evCommand THEN
    BEGIN
     CASE Event.Command OF
      cmHaslo :WMHaslo;
      cmAutor :WMAutor;
      ELSE Exit;
     END;
     ClearEvent(Event);
    END;
END;

VAR PasswApp :TPasswApp;

BEGIN
 PasswApp.Init;
 PasswApp.Run;
 PasswApp.Done;
END.
0

Z tego co wiem, można chyba dokleić na bezczela część skompilowanego kodu, np. Notatnikiem i on się wykona przy odpaleniu exeka. Np. W taki sposób dokonuje się nadpis plików przez wirusy - dokleja się sam w nagłówku pliku i uruchamia za każdym razem, kiedy exek jest odpalany.

1 użytkowników online, w tym zalogowanych: 0, gości: 1