AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi erster Versuch mit CreateRemoteThread schlägt fehl :(
Thema durchsuchen
Ansicht
Themen-Optionen

erster Versuch mit CreateRemoteThread schlägt fehl :(

Ein Thema von MCQ · begonnen am 8. Feb 2006 · letzter Beitrag vom 5. Mär 2006
Antwort Antwort
MCQ

Registriert seit: 14. Jan 2004
Ort: Dessau
80 Beiträge
 
#1

erster Versuch mit CreateRemoteThread schlägt fehl :(

  Alt 8. Feb 2006, 13:02
Hi, Ich wollte mich mal näher mit der API CreateRemoteThread auseinandersetzen, allersings stürzt die zielanwendung immer ab sobald icch diese funktion aufrufe. Woran kann das liegen?

Hier mal der aktuelle Code:

Delphi-Quellcode:
procedure Thread;
var s:string;
begin
//MessageBox(0,'test','',0);
s:='test';
end;

procedure TForm1.Button1Click(Sender: TObject);
var hProcess,hRemote:THandle;
    ThreadID:DWORD;
    Flags:Pointer;
begin
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,4072);
hRemote:=CreateRemoteThread(hProcess,nil,0,@Thread,nil,0,ThreadID);
if hRemote=0 then showmessage('Error');
end;

Gruß MCQ
  Mit Zitat antworten Zitat
MCQ

Registriert seit: 14. Jan 2004
Ort: Dessau
80 Beiträge
 
#2

Re: erster Versuch mit CreateRemoteThread schlägt fehl :(

  Alt 8. Feb 2006, 17:49
Update:
Ich hab noch etwas gegooglet und herausgefunden, das ich die Thread-Prozedur erst zusammen mit den Daten in den Remote-Prozess kopieren muss. Das hab ich getan und eine kleine ASM-Prozedur entwickelt die die daten ausliest. Funktioniert auch alles wundeerbar, solange ich es in den eigenen Prozess injeziere. Das macht aber leider wenig sinn. Wenn ich es in einen anderen Prozess injeziere funktioniert der kopiervorgang auch wunderbar allerdings stürzt die Remote-Anwendung nochimmer bei dem Aufruf CreateRemoteThread ab

Hier der bisherige Code:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Sysutils;

// {$DEFINE Set_BreakPoint}

implementation

function GetProcSize(proc : Pointer) : Cardinal;
begin
  result := 1;
  while(true)do
  begin
    if(Byte((pointer(Cardinal(proc) + result - 1))^) = $C3)then
      Break;
    Inc(result);
  end;
end;

function ExpandFileName(const FileName: string): string;
var
  FName: PChar;
  Buffer: array[0..MAX_PATH - 1] of Char;
begin
  SetString(Result, Buffer, GetFullPathName(PChar(FileName), SizeOf(Buffer),
    Buffer, FName));
end;


procedure Thread(param:Pointer);stdcall;
var
  (* API-Pointer *)
  pLoadLibrary,pGetProcAddress:pointer;
  (* inkludierte API-Funktionen *)
  LoadLibrary : function(libname:PChar):THandle;stdcall;
  GetProcAddress : function(hModule:THandle;ProcName:PChar):Pointer;stdcall;
  MsgBox : function (h:THandle;Text,Caption:PChar;typ:integer):integer;stdcall;
  (* Zeichenketten *)
  user32 : PChar;
  kernel32 : PChar;
  msg_api : PChar;
  (* normale Variablen *)
  h:THandle;
begin
 asm
{$IFDEF Set_BreakPoint}
  int 3
{$ENDIF}
  mov eax,[ebp+8] // Parameter
  xor ebx,ebx
  mov bl, [eax] // Parameter - Anzahl d. Zeichenketten
  add eax, ebx
  inc eax // Springe hinter die Längenangaben der Zeichenketten
  (* LoadLibrary und GetProcAddress werden ermittelt *)
  mov ebx, [eax] // Parameter - LoadLibrary
  mov pLoadLibrary,ebx
  add eax, 4
  mov ebx, [eax] // Parameter - GetProcAddess
  mov pGetProcAddress,ebx
  (* Zeichenketten *)
  xor ecx, ecx
  xor edx, edx
  mov al,[ebp+8] // eax = Länge der Zeichenketten
  mov ebx, eax // ebx = Pointer auf Zeichenkette
  mov cl, [eax] // ecx = Anzahl d. Zeichenketten
  add ebx, ecx
  add ebx, 9
  inc eax
  mov user32, ebx // Zeichenkette 1 - user32.dll
  inc ebx
  mov dl,[eax]
  add ebx,edx
  inc eax
  mov kernel32, ebx // Zeichenkette 2 - kernel32.dll
  inc ebx
  mov dl,[eax]
  add ebx,edx
  inc eax
  mov msg_api, ebx // Zeichenkette 3 - MessageBoxA
 end;
 @LoadLibrary:=pLoadLibrary;
 @GetProcAddress:=pGetProcAddress;
 h:=LoadLibrary('user32.dll');
 @MsgBox:=GetProcAddress(h,msg_api);
 MsgBox(0,user32,kernel32,0);
end;


var param : pByteArray;
    p : Pointer;
    pAPI : Pointer;
    tmp : DWORD;
    s : PChar;
    len : byte;
    num : byte;
    hProcess : THandle;
    ThreadSize: DWORD;
    procedure AddPtr(var p:Pointer;i:integer);
     begin
      p:=ptr(DWORD(p)+i);
     end;
begin
ThreadSize:=GetProcSize(@Thread);
num:=0;
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,GetCurrentProcessID());
param:=VirtualAllocEx(hProcess, nil, 30 + threadsize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess,param,@num,SizeOf(num),tmp);
p:=param;
(* Die Länge des Strings "user32.dll" wird ermittelt und gespeichert *)
AddPtr(p,1);
len:=length('user32.dll');
inc(num);
WriteProcessMemory(hProcess,p,@len,SizeOf(len),tmp);
(* Die Länge des Strings "kernel32.dll" wird ermittelt und gespeichert *)
AddPtr(p,1);
len:=length('kernel32.dll');
inc(num);
WriteProcessMemory(hProcess,p,@len,SizeOf(len),tmp);
(* Die Länge des Strings "MessageBoxA" wird ermittelt und gespeichert *)
AddPtr(p,1);
len:=length('MessageBoxA');
inc(num);
WriteProcessMemory(hProcess,p,@len,SizeOf(len),tmp);
(* Die Anzahl der Zeichenketten wird aktuallisiert *)
WriteProcessMemory(hProcess,param,@num,SizeOf(num),tmp);
(* Die API-Adressen werden gespeichert *)
AddPtr(p,1);
pAPI:=GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA');
WriteProcessMemory(hProcess,p,@pAPI,SizeOf(pAPI),tmp);

AddPtr(p,SizeOf(pAPI));
pAPI:=GetProcAddress(GetModuleHandle('kernel32.dll'), 'GetProcAddress');
WriteProcessMemory(hProcess,p,@pAPI,SizeOf(pAPI),tmp);
(* Zeichenketten werden geschrieben *)
(* user32.dll *)
AddPtr(p,SizeOf(pAPI));
s:='user32.dll';
pAPI:=@s;
pAPI:=Pointer(DWORD(pAPI^));
WriteProcessMemory(hProcess,p,pAPI,length(s),tmp);
AddPtr(p,length(s)+1);
(* kernel32.dll *)
s:='kernel32.dll';
pAPI:=@s;
pAPI:=Pointer(DWORD(pAPI^));
WriteProcessMemory(hProcess,p,pAPI,length(s),tmp);
AddPtr(p,length(s)+1);
(* MessageBoxA *)
s:='MessageBoxA';
pAPI:=@s;
pAPI:=Pointer(DWORD(pAPI^));
WriteProcessMemory(hProcess,p,pAPI,length(s),tmp);
AddPtr(p,length(s)+1);
writeProcessMemory(hProcess,p,@Thread,1024,tmp);
CreateRemoteThread(hProcess,nil,0,p,param,0,tmp);
end.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#3

Re: erster Versuch mit CreateRemoteThread schlägt fehl :(

  Alt 5. Mär 2006, 19:32
Lad lieber eine DLL in den Speicher die den Code enthält. Dann musst du dich nicht um die Relocations / Imports usw. kümmern.
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#4

Re: erster Versuch mit CreateRemoteThread schlägt fehl :(

  Alt 5. Mär 2006, 20:28
hi, es wäre interresant zu wissen WIE das Proggie abstürtzt (AV, Einfach weg, Bleibt hängen etc.) wird die messagebox angezeigt wenn du die Kommentarstriche wegtust?
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
MCQ

Registriert seit: 14. Jan 2004
Ort: Dessau
80 Beiträge
 
#5

Re: erster Versuch mit CreateRemoteThread schlägt fehl :(

  Alt 5. Mär 2006, 20:31
Zitat von brechi:
Lad lieber eine DLL in den Speicher die den Code enthält. Dann musst du dich nicht um die Relocations / Imports usw. kümmern.
Genau so hab ich es dann auch gelöst

Zitat von ichbins:
hi, es wäre interresant zu wissen WIE das Proggie abstürtzt (AV, Einfach weg, Bleibt hängen etc.) wird die messagebox angezeigt wenn du die Kommentarstriche wegtust?
Da gib ne nette Meldung von XP in der Sinngemäß steht "Das Programm wurde aus Sicherheitsgründen beendet"
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz