DLL Injection oder einfach Opcodes reinknallen?

05/09/2008 08:24 Bot_interesierter#1
Hi, ich habe vor im Adressbereich eines Programms von mir geschriebenen Code auszuführen, ich habe auch schon ne Ahnung wie ich das anstellen kann, zunächst muss mein Code natürlich in den Ziel Prozess und hier gibts nun zwei möglichkeiten:
A:
Ich schreibe meine Funktion als ASM-Opcodes an ne Speicher Stelle die ich mir in dem Zielprozess Aloziiert hab (oder wie man das schreibt ^^) und jetzt kann ich mit nem Aufruf von Create Remote Thread diesen Code ausführen lassen.
B:
Ich mache eine DLL mit allen Funktionen die ich im Adress bereich des Proggis ausführen will, und lad sie über nen LoadLibary call im Zielprozess rein, dann hab ich ein Problem, ich weiss nicht wie ich die Adressen meiner Funktionen im Zielspeicher bekomme um sie dann über nen Remote Thread auszuführen.

Jetzt will ich erstmal Wissen, welches die "bessere" Methode ist und wie eben Methode B dann Funktioniert. ^^
05/09/2008 17:43 emjay#2
du musst eh ne dll nutzen.
ka wenn ich funktionen von z.b. nem game replacen will such ich mir den function pointer im ds und ersetz ihn durch meine eigene funktion

nicht über die delphi syntax wundern, ich bin dank meiner arbeit dran gebunden :>
Code:
  //funktionspointer im datensegment durch meine eigene funktion ersetzen:
// DLL_PROCESS_ATTACH:
  lea eax, ModelCheck
  mov [$61AF50], eax

  //modelcheck sieht dann so aus:
  procedure ModelCheck;
  asm
   //wenn die originale funktion nicht mehr aufgerufen werden soll brauchst die register
   //nicht zwischenspeichern und den jmp kann man sich auch sparen
    pushad
    //do my stuff
    popad
    jmp OrgAddress
  end;
wenn kein funktionspointer vorhanden ist wird der code halt soweit ersetzt, dass er zu meinem zeug springt...wenn ich irgendwas wichtiges überschreiben musste wird der originale code ersetzt und abschließend mein zeug ausgeführt

injectkram:
hierfür krieg ich kein credit, ist komplett aus der uallhook.pas der uallcollection kopiert

Code:
function InjectLibrary(dwProcessID: DWord; pLibraryName: PChar): Boolean; stdcall;
var
  dwProcessID2 : DWord;
  dwMemSize    : DWord;
  dwWritten    : DWord;
  dwThreadID   : DWord;
  pLLA         : Pointer;
  pTargetMemory: Pointer;
begin
  Result := False;

  dwProcessID2 := OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessID);
  if (dwProcessID2 <> 0) then
    dwProcessID := dwProcessID2;

  dwMemSize := Length(pLibraryName)+1;
  pTargetMemory := VirtualAllocExX(dwProcessID,nil,dwMemSize, MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE);
  pLLA := GetProcAddress(GetModuleHandleA('kernel32.dll'),'LoadLibraryA');
  if (pLLA <> nil) and (pTargetMemory <> nil) and (pLibraryName <> nil) then
  begin
    if WriteProcessMemory(dwProcessID,pTargetMemory,pLibraryName,dwMemSize,dwWritten) and
      (dwWritten = dwMemSize) then
    Result := CreateRemoteThreadX(dwProcessID,nil,0,pLLA,pTargetMemory,0,dwThreadID) <> 0;
  end;
  if (dwProcessID2 <> 0) then
    CloseHandle(dwProcessID2);
end;

wenn du eine dll function ersetzen willst google mal nach hook IAT
05/09/2008 22:45 Bot_interesierter#3
Ich glaube ich hatte bisher den Sinn einer dll Injection gründlich Missverstanden, ich dachte man könne eine dll in einen prozess schieben und von einem 3ten programm aus controlieren welche Functionen die DLL in dem Prozess ausführt, oder geht das doch irgendwie?
Denn so kann ich ja nur eine Funktion ersetzten bzw meine DLL muss entscheiden was sie tut und ich kann nicht von aussen über eine Externe gui Befehle in dem Ziel Process ausführen, oder?
05/10/2008 00:43 emjay#4
japs in der form kannst du die dll nicht von aussen ansprechen. da musst schon vorher wissen was du machen willst (=hf in olly:P) . wie du eine dll im fremden prozess ansprechen kannst, fällt mir so auf anhieb nicht ein, ka aber ist bestimmt möglich....wenns kein eleganten weg dafür geben sollte kann man es immer noch auf ne ghettovariante ala fileparsing umsetzen. btw so ne universall dll die du injectest und zackbäm sind alle funktionen gehooked gibts net. willst du importierte funktionen ersetzen hast du leichteres spiel...aber wenn du vor hast funktionen im codesegment zu ersetzen musst du für jeden mist alles 1000 debuggen bist du weißt was du eigentlich ersetzen musst. evtl denk ich auch einfach zu sehr ans funktionen ersetzen, weil ich sehr viel damit arbeite, ka... aber wenn ich irgendwas im zielprozess ausführen will, ist das mein erster gedanke
05/10/2008 00:49 Harko#5
Quote:
Originally Posted by emjay View Post
japs in der form kannst du die dll nicht von aussen ansprechen. da musst schon vorher wissen was du machen willst (=hf in olly:P) . wie du eine dll im fremden prozess ansprechen kannst, fällt mir so auf anhieb nicht ein, ka aber ist bestimmt möglich....wenns kein eleganten weg dafür geben sollte kann man es immer noch auf ne ghettovariante ala fileparsing umsetzen.
Shared Memory, Mutex/Global Objects, SendMessage/Message Handle...
05/10/2008 12:15 mr.rattlz#6
Quote:
Originally Posted by Harko View Post
Shared Memory, Mutex/Global Objects, SendMessage/Message Handle...
Named Pipes :)
05/10/2008 12:37 rEdoX#7
WriteProcessMemory, CreateRemoteThread, SetThreadContext, send, recv ;)
05/11/2008 12:23 Bot_interesierter#8
Erstmal danke für die Antworten, ich denke ich werd mir mal das mit SendMessage näher anschauen, aber so wies aussieht mach ich das ganze wohl besser über ein ingame menue, ist sicher einfacher als die dll von aussen anzusprechen.
05/13/2008 14:00 Harko#9
Quote:
Originally Posted by Bot_interesierter View Post
Erstmal danke für die Antworten, ich denke ich werd mir mal das mit SendMessage näher anschauen, aber so wies aussieht mach ich das ganze wohl besser über ein ingame menue, ist sicher einfacher als die dll von aussen anzusprechen.
ich würde shared memory nehmen. Ok ist Geschmacksache aber ich fand es in den Situation wo ich es brauchte am Sinnvollsten. Für die Kommunikation zwischen Host und Target recht praktisch weil Veränderungen an Variablen die in der Shared Section deklariert sind global zwischen beiden Prozessen passieren. Man kann also im Source Code ganz normal mit Variablen und Arrays arbeiten und im Host Process verändern. Diese Veränderungen werden dann direkt in den Target Process "übertragen".