Thema: Delphi Rendering context opengl

Einzelnen Beitrag anzeigen

Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#10

Re: Rendering context opengl

  Alt 24. Apr 2005, 23:01
Naja gut daß ihr euch einig seids - oder auch nicht.

Jedenfalls ist das wirklich nicht leicht zu verstehen. - Bin hald ein anfänger in der Beziehung.

Abgesehen vom injizieren der .dll (das bring ich vielleicht mit codeschnipseln hin) ist ja das hooken von funktionen oder proceduren in der gdi32.dll das hauptproblem hier.

Leider finde ich zu dem thema nur cheats für irgendwelche spiele und damit eben für opengl32.dll.
Das interessiert mich ned besonders und hilft mir dabei auch nicht recht weiter, weil die scheinbar keinen eigenen code verwenden, sondern nur grafiken verschwinden lassen (wände oder sowas).

trotzdem frag ich mich ob das auch für gdi32.dll funktionieren würde?

jedenfalls nehm ich mal so einen cheat her und bau den für mich um.....
mal sehen ob mir dabei jemand zu meinem ziel verhelfen kann .

Delphi-Quellcode:
begin
  if getmodulehandle(pchar('gdi32.dll')) > 0 then
  begin
    @oldldrgetprocaddress := getprocaddress(getmodulehandle(pchar('gdi32.dll')),pchar('LdrGetProcedureAddress'));
    hookit(@oldldrgetprocaddress, @myldrgetprocaddress, ldrgetprocaddresssave);
  end;
end.

Delphi-Quellcode:
function myldrgetprocaddress(h: integer; f: pmychar; o: integer; var p: pointer): integer; stdcall;
var buf: array[0..255] of char;
    i: integer;
    s: string;
    sp: tspeicher;
begin
  ldrgetprocaddresssave.address^ := ldrgetprocaddresssave.save; // unhook orig function
  i := GetModuleFileName(h,@buf,sizeof(buf));
  if (i > 0) and (f <> nil) then
  begin
    s := f^.d+' ';
    if pos(uppercase('swapbuffers '),uppercase(s)) > 0 then
    begin
      p := getprocaddress(h,pchar('swapbuffers'));
      hookit(p,@myswapbuffers,sp);
      result := oldldrgetprocaddressh,f,o,@swapbuffers);
    end else result := oldldrgetprocaddress(h,f,o,p);
  ldrgetprocaddresssave.address^ := ldrgetprocaddresssave.hook; // hook orig function
end;

procedure hookit(fromfkt, tofkt: Pointer; var save: tspeicher); // hook a function
var
  old: cardinal; // old protect in memory
  NewCode: tjumpcode; // jump to my function
  jump: ^array7; // array to save
begin
  virtualprotect(Fromfkt, 7, $40, @old); // let me write in memory
  save.address := Fromfkt; // saves hooked address
  Move(Fromfkt^, save.save, 7); // saves 5 bytes of orig address
  NewCode.bla1 := $55; // asm hex code for a jump
  newcode.bla2 := $5d;
  NewCode.wo := integer(tofkt)-integer(fromfkt)-7; // calculate address
  newcode.jmp := $e9;
  jump := @newcode; // for save the jump
  save.hook := jump^; // save jump
  Move(save.hook, Fromfkt^, 7); // write jump to orig address
end;

procedure myswapbuffers();
begin
///////// mein screenshot wenn taste gedrückt oder sowas!
end;
Also das ist schon ein krasser hack oder?
Ich hab versucht das mal so halbwegs hinzubasteln - der code ist weder von mir noch sonstwas.
Der Creator ist beim originalen code nicht angegeben - hat wohl seinen grund .

Jedenfalls hoffe ich, ich habs so halbwegs kapiert worum es hier geht.
Selbst wenn ich es damit so halbwegs hinbekommen könnte, muß ich doch zugeben, daß ich nur eine ahnung hab was hier alles passiert.
Ich würde das aber gerne genau verstehen, sonst hab ich von dem ganzen nichts und hab nur code geklaut - was mir allerdings nicht besonders liegt.

Bin ich mit dem zusammengebastelten code auf der richtigen spur? oder ist das alles nur unsinn und ich hab nix verstanden lol.
Ist wirklich nicht leicht das thema - was vermutlich auch gut so ist aber trotzdem würde ich das gerne verstehen.

Und versteht mich nicht falsch - code für cheats hab ich bei meinen recherchen genug gefunden, aber leider gibts nicht viel sinnvolles zu dem thema ...

Arnulf
  Mit Zitat antworten Zitat