DLL-Injector?!

04/13/2006 12:28 reijin#1
Hi!!
Im searchin for a DLL injector to bypass GameGuard (Lineage2).
I want to execute eg. WPE or so, u know?^^

First i wanna know if its possible to bypass GG with DLL-Injection?!

And then:
which programms do u use??(with link or uploaded file - if possible)

THX!!!

Deutsch:
Ich such nach nem DLL injector um Gameguard zu umgehen (in LIneage2), damit ich programme wie WPE starten kann, ohne dass das game abstürzt.

Zuerst hätt ich gehn gewusst, ob das überhaupt geht^^

und dann:
Welches Proggi benutzt zur DLL Injection?? (mit Link oder hier im Forum hochgeladen)

VIELEN DANK!!! :) :) :D
04/13/2006 18:14 imported__DiABOLiC_#2
[Only registered and activated users can see links. Click Here To Register...]

du sagst du hast coding kenntnisse, aber fragst nach nem "DLL Injectior"?

1.) Per DLL Injection is das denk ich mal nicht möglich
2.) Es gibt keine "DLL Injector" bei dene man einfach sagt "hier, injecte mal die DLL"

In der L2 Sektion gabs dochn bypass, oder nich?
04/13/2006 22:00 neji#3
warum sollte es keinen Geben? der Injector an sich ist sehr leicht zu schreiben.....vielleicht 10 Zeilen code + bisschen was drumzu damits schön aussieht..... der hauptteil ist ja dann immer noch die dll
04/14/2006 00:20 mr.rattlz#4
Quote:
Originally posted by neji@Apr 13 2006, 22:00
warum sollte es keinen Geben? der Injector an sich ist sehr leicht zu schreiben.....vielleicht 10 Zeilen code + bisschen was drumzu damits schön aussieht..... der hauptteil ist ja dann immer noch die dll
Hmm, 10 Zeilen Code ?
Du musst speicher im angezielten Prozess allozieren, du musst Code in diesen Speicher reinschreiben,
du musst das Programm dazu bekommen deinen code auszuführen und dann musst du den IAT umschreiben...

Und wenn du das sowohl auf win 9x als auch 2k/xp laufen lassen willst musst du natürlich jeweils unterschiedlichen code schreiben...
Ich gebe zu, ich habe es bisher noch nicht gemacht, aber ich glaube trotzdem, dass 10 Zeilen etwas arg optimistisch ist.
04/14/2006 02:47 imported__DiABOLiC_#5
Quote:
Originally posted by mr.rattlz@Apr 14 2006, 00:20
Du musst speicher im angezielten Prozess allozieren
Allein desshalb wird es keinen "universal Injector" geben
04/15/2006 14:32 rEdoX#6
Und warum nicht?
04/15/2006 16:27 imported__DiABOLiC_#7
sagte ich doch bereits?
04/18/2006 09:09 neji#8
nur rein um ne DLL in einem fremden Prozess zu laden und auszuführen braucht man nicht mehr Zeilen.

Klar, will man alles für 9x und NT lauffähig haben und wirklich Threadsicher machen , macht das natürlich etwas mehr Aufwand.

Aber wenn man sich einen universelle Library dafür schreibt, macht man sich diese Arbeit auch nur einmal und hat es zukünftig nur noch mit wenigen Zeilen Code zu tun

im Prinzip brauchst du nur etwa so etwas :

Code:
temp := VirtualAllocEX(pid,neededmemory);
if target <> nil then
begin
 temp := virtualalloc(nil,neededmemory,MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
 if temp <> nil then
 begin
  CopyMemory(.....); //halt den Call für LoadLibraryA an den allocierten Speicher kopieren
  WriteProcessMemory(......) // und anschließend in den Target Process schreiben.
 end;
end;


EDIT :

hab mal was gebastelt...könnts ja mal testen. Sollte unter 9x und NT funktionieren (kommt natürlich noch auf den Code in der DLL an, die ihr injected)

zum Testen sind 2 dll's dabei, einmal ne testdll.dll, die nach dem injecten eine messagebox aufpoppen lässt mit dem Namen des Prozesses in dem die DLL grad inejcted ist und eine textouthook.dll die, wie der Name schon sagt, die Api TextOut Hooked und die Anzeigefarbe ändert...einfach testen, ihr seht dann schon was ich mein.

Zeilen hab ich jetzt nicht gezählt, hat aber ca 20 Minuten gedauert.

[Only registered and activated users can see links. Click Here To Register...]
04/20/2006 18:31 r00kie#9
pack wenigstens den source dazu >_> 2 librarys und ne app :> das ja wie als wenn ich von myg0t nen cs bot nutze den die mir als neuling empfehlen xD
04/21/2006 04:56 crayfish001#10
Der tät mich ehrlich gesagt auch sehr interessieren...
Wär cool wenn du ihn noch dazu tun könntest
04/21/2006 08:46 neji#11
ich hab das in 1000e Units ausgelagert, hab keine Lust das alles wieder zusammen zu friemeln :)

aber hier mal die wichtigeste Funktion , was das injecten angeht

Code:
function InjectLibrary(dwProcessID: Cardinal; pLibraryName: PChar): Pointer; stdcall;

 {Temporary code which will be injected in the target process.}
 procedure AsmTempBegin; assembler;
 asm
  PUSH $12345678         // PUSH offset library name
  CALL DWORD PTR [$00000000]   // CALL LoadLibraryA
  RET
 end;
 procedure AsmTempEnd; assembler; begin end;

var
 dwProcessID2: DWord;
 dwBytesWritten: DWord;
 dwAsmSize: DWord;
 dwMemoryNeeded: DWord;

 pMemoryTarget: Pointer;
 pMemoryTemp: Pointer;
 pLoadLibraryA: Pointer;

 nChange: PDWord;

 s: String;
Begin
 Result := nil;

 pLoadLibraryA := GetProcAddress(LoadLibrary('kernel32.dll'), 'LoadLibraryA');
 if (pLoadLibraryA = nil) then
  Exit; {Cant get offset of API LoadLibraryA.}

 dwProcessID2 := OpenProcess(PROCESS_ALL_ACCESS, False, dwProcessID);
 if (dwProcessID2 = 0) then
  Exit; {Cant open the target process with all access rights.}

 s := pLibraryName;
 dwAsmSize := DWord(@AsmTempEnd) - DWord(@AsmTempBegin);
 dwMemoryNeeded := DWord(Length(s)) + 1 + dwAsmSize + 4;

 pMemoryTarget := VirtualAllocExX(dwProcessID2, dwMemoryNeeded);
 if (pMemoryTarget = nil) then
 begin
  CloseHandle(dwProcessID2);
  Exit; {Cant get memory for our injectioncode inside the target process.}
 end;

 pMemoryTemp := VirtualAlloc(nil, dwMemoryNeeded, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
 if (pMemoryTemp = nil) then
 begin
  VirtualFreeExX(dwProcessID2,pMemoryTarget,dwMemoryNeeded,MEM_RELEASE);
  CloseHandle(dwProcessID2);
  Exit; {Cant get memory in our process for temporary used memory.}
 end;

 CopyMemory(pMemoryTemp, @AsmTempBegin, dwAsmSize);

 {Setting the correct Adresses for the inject Code.}
 nchange := Pointer(DWord(pMemoryTemp) + 1);
 nchange^ := DWord(pMemoryTarget) + dwAsmSize + 4;
 nchange := Pointer(DWord(pMemoryTemp) + 7);
 nchange^ := DWord(pMemoryTarget) + dwAsmSize;
 nchange := Pointer(DWord(pMemoryTemp) + dwAsmSize);
 nchange^ := DWord(pLoadLibraryA);

 {Writing the LoadLibraryA code from temporary memory into target memory.
  If success then create a thread on target memory.
  Return the address of the target memory.}
 CopyMemory(Pointer(Cardinal(pMemoryTemp) + dwAsmSize + 4), @S[1], Length(S));
 If WriteProcessMemory(dwProcessID2, pMemoryTarget, pMemoryTemp, dwMemoryNeeded, dwBytesWritten) And
   CreateRemoteThreadX(dwProcessID, pMemoryTarget) Then
  Result := pMemoryTarget;

 VirtualFree(pMemoryTemp, dwMemoryNeeded, MEM_DECOMMIT);
 CloseHandle(dwProcessID2);
end;
04/21/2006 17:26 crush#12
danke :)
04/22/2006 02:22 crush#13
Hab mich jetzt durchgearbeitet und es halbwegs verstanden... danke nochmal :)

hast du evtl noch den dll code? wär echt super wenn du den auch noch posten könntest
04/24/2006 16:17 neji#14
hab die dll's nichtmehr, wie gesagt, hatte die noch rumliegen....aber die testdll.dll wird in etwa so ausgesehen haben :

Code:
library testdll

uses
 SysUtils,
 windows,
 Classes;

{$R *.res}

var
 cAppPath: array [0..MAX_PATH] of char;
 szAppName : String;
begin
 GetModuleFileName(0, @cAppPath, SizeOf(cAppPath));
 szAppName := ExtractFileName(cAppPath);
 MessageBoxA(0,PChar(szAppName),'',MB_OK);
end.
04/24/2006 17:14 neji#15
[Only registered and activated users can see links. Click Here To Register...] wohl eher !?