AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Benötige Hilfe bei einer Entschlüsselung bei altem Programm

Benötige Hilfe bei einer Entschlüsselung bei altem Programm

Ein Thema von Thomas Feichtner · begonnen am 9. Feb 2012 · letzter Beitrag vom 9. Feb 2012
Antwort Antwort
Thomas Feichtner

Registriert seit: 30. Nov 2007
Ort: Rum
134 Beiträge
 
Delphi 10.4 Sydney
 
#1

Benötige Hilfe bei einer Entschlüsselung bei altem Programm

  Alt 9. Feb 2012, 00:03
Zum Entschlüsseln von Daten wurden in einem altem Pascal-Programm folgender Code verwendet. Kann mir jemand Helfen daraus eine Funktion zu basteln?
Es muss bei folgenden HEX String "82 6a 55 b0 3b 63" "THOMAS" raus kommen.

Code:
(*******************************************************************************
 PROCEDURE Crypt (dataPtr: AdsMem;           8 [bp] --> es:di 4 Byte Pointer
                  dataLen: WORD              6 [bp] --> cx   2 Byte Laenge
                  ); EXTERN;
*******************************************************************************)
Crypt PROC FAR
   push bp
   mov bp, sp

   call near TestRandom

   push cx
   mov cx, 6 [bp]                     ; cx:=   dataLen
   jcxz @crReturn

   push es
   push di
   les di, 8 [bp]                     ; es:di:= dataPtr
   shr cx, 1                           ; immer 2 Bytes werden ver/entSchlüsselt

@crLoop:
   call near NextRand;
   xor ax, Word Ptr es:[di]
   stosW                               ; es:[di]:= verschluesseltes Word
   dec cx
   jnz @crLoop

   pop di
   pop es

@crReturn:
   pop cx
   mov sp, bp
   pop bp
   retf 6                              ; dataPtr, dataLen wegwerfen
Crypt ENDP
mfg

Thomas Feichtner
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#2

AW: Benötige Hilfe bei einer Entschlüsselung bei altem Programm

  Alt 9. Feb 2012, 09:02
Die eigentliche Funktion ist doch trivial:
Delphi-Quellcode:
procedure crypt(var data: array of word; datalen: integer);
var
  i: integer;
begin
  testrandom;
  for i:=0 to datalen div 2 do data[i] := data[i] xor nextrand;
end;
Ohne die Funktionen testrandom und nextrand wird Dir das aber wahrscheinlich nicht viel weiterhelfen.
  Mit Zitat antworten Zitat
Thomas Feichtner

Registriert seit: 30. Nov 2007
Ort: Rum
134 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Benötige Hilfe bei einer Entschlüsselung bei altem Programm

  Alt 9. Feb 2012, 09:20
Ich hab mal nachgeschaut und folgendes noch gefunden. Ich hoffe es ist komplett.

Code:
TestRandom PROC NEAR
   push ds
   push si
   push es
   push di
   push cx

   push ds                              ; es:= ds
   pop es

   mov di, offSet @Gard1               ; di:= ofs @Gard1
   mov si, offSet @Gard2               ; si:= ofs @Gard2

   mov cx, 6
   cld
   repe cmpsb                         ; @Gard1 = @Gard2 ?
   je  @trReturn

   mov dx, offset @Gard1
   mov ah, 9
   int 21H

   mov dx, offset @msg
   mov ah, 9
   int 21H

   call far EndXqq

@trReturn:
   pop cx
   pop di
   pop es
   pop si
   pop ds

   ret near
TestRandom ENDP
bzw.

Code:
NextRand PROC NEAR                    ; result in ax
   push bx
   push cx

   mov ax, Word ptr zz [0];
   mov bx, Word ptr zz [2];
   mov cx, Word ptr zz [4];

   sub ax, bx;
   jnc @nrStore;
   add ax, p

@nrStore:
   mov Word ptr zz [0], bx
   mov Word ptr zz [2], cx
   mov Word ptr zz [4], ax

   pop cx
   pop bx

   ret near
NextRand ENDP
mfg

Thomas Feichtner
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#4

AW: Benötige Hilfe bei einer Entschlüsselung bei altem Programm

  Alt 9. Feb 2012, 10:16
Das is ja noch einfacher:
Delphi-Quellcode:
var
  zz: array[0..5] of byte;
var
  p: word; {??? was ist das}

function nextrand: word;
begin
  asm
   push bx
   mov ax, Word ptr zz [0];
   mov bx, Word ptr zz [2];
   mov cx, Word ptr zz [4];

   sub ax, bx;
   jnc @@nrStore;
   add ax, p

@@nrStore:
   mov Word ptr zz [0], bx
   mov Word ptr zz [2], cx
   mov Word ptr zz [4], ax
   mov @result, ax
   pop bx
  end;
end;

var
  i: integer;
begin
  randseed := 0;
  p := 42;
  for i:=0 to 5 do zz[i] := random(256);
  for i:=1 to 10 do writeln(nextrand);
end.
Gleich mit Teststub, liefert bei mir: 54350 35009 55073 19341 45514 35732 39405 9782 61905 29623.

Bleiben die Fragen: wie wird zz initialisiert?, was ist p? und wozu das Gedöns in TestRandom?.
  Mit Zitat antworten Zitat
Thomas Feichtner

Registriert seit: 30. Nov 2007
Ort: Rum
134 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Benötige Hilfe bei einer Entschlüsselung bei altem Programm

  Alt 9. Feb 2012, 10:58
Hallo Gammatester,

warum das geanze Gedöns weiß ich auch nicht. Ich habe dir per Mail den meiner Meinung nach den ganzen Source geschickt welche notwendig sein sollte.
Wir müssen hier Daten aus einem alten Programm importieren.
mfg

Thomas Feichtner

Geändert von Thomas Feichtner ( 9. Feb 2012 um 12:32 Uhr)
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

AW: Benötige Hilfe bei einer Entschlüsselung bei altem Programm

  Alt 9. Feb 2012, 11:33
Hier der schnell zusammengehackte Proof-of-Concept:
Delphi-Quellcode:
program fcrypt;

{$ifdef VER70}
  type ansichar = char;
{$else}
  {$apptype console}
{$endif}

{----------------------------------------------------}
var
  zz: array[0..5] of byte;

const
   p = 65521;

function nextrand: word;
begin
  asm
   push bx
   mov ax, Word ptr zz [0];
   mov bx, Word ptr zz [2];
   mov cx, Word ptr zz [4];

   sub ax, bx;
   jnc @@nrStore;
   add ax, p

@@nrStore:
   mov Word ptr zz [0], bx
   mov Word ptr zz [2], cx
   mov Word ptr zz [4], ax
   mov @result, ax
   pop bx
  end;
end;

{----------------------------------------------------}
procedure crypt(var bdata; datalen: integer);
var
  i: integer;
  data: array[0..32000] of word absolute bdata;
begin
  for i:=0 to datalen div 2 - 1 do data[i] := data[i] xor nextrand;
end;


{----------------------------------------------------}
const
  Initkey: array[0..5] of ansichar = 'OsyPPS';

const
  test: array[0..5] of byte = ($82, $6a, $55, $b0, $3b, $63);

var
  ct: array[0..sizeof(test)-1] of ansichar;
  i: integer;

begin
  move(initkey, zz, 6);
  move(test,ct,sizeof(ct));
  crypt(ct,6);
  write('Der entschlüsselte Text lautet: ');
  for i:=0 to 5 do write(ansichar(ct[i]));
  writeln;
end.
Kompilieren und Ausgabe:
Code:
Y:\WORK\Dev>D:\DMX\M12\DCC32 -b fcrypt.pas
CodeGear Delphi for Win32 compiler version 20.0
Copyright (c) 1983,2008 CodeGear
fcrypt.pas(67)
68 lines, 0.10 seconds, 14668 bytes code, 13068 bytes data.

Y:\WORK\Dev>FCRYPT.EXE
Der entschlüsselte Text lautet: THOMAS
Der Rest bleibt als Übungsaufgabe, hoffentlich hilft's weiter.

Gruß Gammatester
  Mit Zitat antworten Zitat
Thomas Feichtner

Registriert seit: 30. Nov 2007
Ort: Rum
134 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Benötige Hilfe bei einer Entschlüsselung bei altem Programm

  Alt 9. Feb 2012, 12:17
Hallo Gammatester,

ja vorerst hilft es weiter. Was müsste ich machen dass es außerhalb einer Konsolenanwendung läuft?
mfg

Thomas Feichtner
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#8

AW: Benötige Hilfe bei einer Entschlüsselung bei altem Programm

  Alt 9. Feb 2012, 12:26
Was müsste ich machen dass es außerhalb einer Konsolenanwendung läuft?
Na kein write/writeln verwenden.
  Mit Zitat antworten Zitat
Thomas Feichtner

Registriert seit: 30. Nov 2007
Ort: Rum
134 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Benötige Hilfe bei einer Entschlüsselung bei altem Programm

  Alt 9. Feb 2012, 12:33
Ja danke jetzt funktioniert es. Hatte eine Zeile vergessen zu übernehmen.
mfg

Thomas Feichtner
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf