Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Execryptor Openprocess


Flamefire - Fr 01.02.08 15:23
Titel: Execryptor Openprocess
So mal was schweres:

Ich habe eine eigene DLL geschrieben, die ich in ein Programm injecten will.
Um diese DLL zu schützen, habe ich mir den ExeCryptor gekauft.

Funzt auch alles super.
Das Injecten machen ich über die uall-Collection (Danke dafür ^^)

Das Problem: Wenn sie einmal injected ist kann ich sie nicht wieder uninjecten, da EC alle Openprocess() Calls auf diesen ganzen prozess blockt (oder besser: nur wenn ich mehr als VM_Read haben will)
Sieht nach nem Kernel Hook aus...Will aber auch nicht auf den Schutz verzichten

Gibt es also noch eine andere Möglichkeit eine DLL zu laden und wieder zu entladen?


BenBE - Fr 01.02.08 16:29

Implementiere in deiner DLL eine Möglichkeit, die auf sichere Art und Weise eine Befehlsschnittstelle zum Unloaden implementiert.

Z.B. Ne encryptete Message mit DH-KEX und die restliche Kommunikation (z.B. Shared Memory) dann nur noch verschlüsselt\authorisiert.


Flamefire - Sa 02.02.08 18:14

ohje...
hab zwar ungefähr verstanden was du willst

(also die DLL soll sich selbst entladen)
aber wie jz genau hab ich nicht kapiert...


BenBE - Sa 02.02.08 18:17

Indem Du in der DLL und in deinem Hauptprogramm einen Shared-Memory-Bereich anlegst und über diesen Bereich mit dieser DLL kommunizierst. Such mal nach IPC.


Flamefire - Sa 02.02.08 19:57

ok...hab jz das hier gefunden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Procedure SendStringToWindow (aMessage : String; hClient : Integer);
Var
  c: TCopyDataStruct;

Begin
  c.dwData := 0;
  c.cbData := Length(aMessage);
  c.lpData := @aMessage[1];
  SendMessage(hClient, WM_COPYDATA, 0, Integer(@c));
End;


Ich denke das ist das einfachste da ich die GetMessage fkt von dem prozess eh gehookt habe
aber noch 2 Fragen:
Was muss ich als handle nehmen? des fensterhandle?
und wie les ich das nun genau aus?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function callbackGetMessageA(var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax: UINT): BOOL; stdcall;
var   P: PCopyDataStruct;
      sMessage : String;
begin
  Result:=newGetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
  p := PCopyDataStruct(lpMsg.LParam);       
  SetLength(sMessage , p^.cbData);
  Move(PChar(p^.lpData)^, sMessage [1], p^.cbData);
end;


richtig?

klappt iwei nicht...die nachricht kommt nicht an, da das fenster anscheinend kurz den focus verliert...
oder hab ich nen denkfehler?


Flamefire - Mo 04.02.08 12:18

ok...so weit so gut
ich hab jz über allocatehwnd in meiner DLL ein fenster erstellt über das ich die nachricht empfangen kann

das problem: kriegt mein programm iwie raus, welches das ist?
Kann ich z.b. eine Statische speicheradresse nehmen und diese via ReadProcessmemory auslesen?
wie kriege ich die in allen kompilierten versionen statisch? Es würde ja auch reichen wenns ein statisches offset im speicher der DLL ist

vielen dank


AHT - Mo 04.02.08 13:35

user profile iconFlamefire hat folgendes geschrieben:
kriegt mein programm iwie raus, welches das ist?
Kann ich z.b. eine Statische speicheradresse nehmen und diese via ReadProcessmemory auslesen?
wie kriege ich die in allen kompilierten versionen statisch?
vielen dank

Nimm Filemapping:
CreateFileMapping
MapViewOfFile
UnmapViewOfFile
OpenFileMapping


Flamefire - Mo 04.02.08 14:09

das geht leider nicht, da der prozess in den ich die dll injecte mehrfach vorhanden sein kann...
darum hab ich auch kein TCP genommen, weil der sich ja selbst in die quere kommt

was mich wundert: ich kann an das fenster nachrichten wie WM_MINIMIZE WM_HIDE etc schicken (also fenster modifikationen) und mit dem aktiven GetMessageA Hook kann ich key_press events abfangen
warum kriege ich dort aber die WM_COPYDATA nicht rein wenn ich die an das auptfenster schicke?
oder muss ich da was anders machen (s.obiger code)


Flamefire - Do 07.02.08 14:29

*PUSH*

Mal ne Frage. Wenn ich die Getmessage Funktion hooke, kriege ich ja alle Messages mit oder?
Wenn ich ne WM_HIDE schicke müsste ich das mitkriegen. Warum kriege ich aber die WM_COPYDATA nicht mit?
Oder funktioniert das ganze aus ner DLL heraus anders?