Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL Function fungiert anders als "direkte". (https://www.delphipraxis.net/121643-dll-function-fungiert-anders-als-direkte.html)

gizzy 1. Okt 2008 19:58


DLL Function fungiert anders als "direkte".
 
Hi,

ich habe grade folgendes Problem:

1. Folgende Funktion funktioniert ohne Fehler wenn Sie in der gleichen Unit steht.

Delphi-Quellcode:
function get_x(pid: Integer; offset_base: DWord; offset_xreg: Dword = $7C; offset_xpos: DWord = $78; Divider: Double = 10.0): Integer;
var
  xOffsetInt, BaseAddress : DWord;
  xRegionFloatPtr        : ^Single;
  xRegionFloat           : Single;
  xRegionBase            : Longint;
  hProcess               : THandle;
  rBytes                 : Cardinal;
  PositionInt            : Smallint;
  lowByte                : Byte;
  xreg, xpos             : Cardinal;
begin
  xreg          := offset_xreg;
  xpos          := offset_xpos;

  Try
    hProcess    := OpenProcess(PROCESS_VM_READ,False,pid);

    ReadProcessMemory(hProcess, Pointer(offset_base), @baseAddress, SizeOf(dword), rBytes);
    ReadProcessMemory(hProcess, Pointer(baseAddress + xreg), @xOffsetInt, SizeOf(xOffsetInt), rBytes);
    Move(xOffsetInt, xRegionFloatPtr, SizeOf(xOffsetInt));

    xRegionFloat := Single(xRegionFloatPtr);
    xRegionFloat := xRegionFloat / Divider;

    ReadProcessMemory(hProcess, Pointer(baseAddress + xpos), @PositionInt, SizeOf(PositionInt), rBytes);

    lowByte     := LOBYTE(PositionInt);
    xRegionBase := lowByte * 3 - $195;
    xRegionBase := xRegionBase shl 6;
    result      := Round(xRegionBase+xRegionFloat);
  except
    result:= 0;
  end;
end;
Packe ich diese in meine DLL und rufe sie ab, springt dat ding als in die Exception wegen Gleitkomma Überlauf (Except mal auskommentiert gehabt.)

Ich rufe die auch eig. ganz normal auf :/

Delphi-Quellcode:
const
  pid = 6023;
[..]
Memo1.Lines.Add(IntToStr(get_x(pid, $CF2D94, $7C, $78, 10.0)));
Was mache ich falsch, bzw. was muss ich ändern um das es auch aus der DLL heraus klappt. (Es sollte jedes mal der selbe wert rauskommen).


[edit=SirThornberry]zweite Frage entfernt - Mfg, SirThornberry[/edit]

gizzy 1. Okt 2008 20:32

Re: DLL Function fungiert anders als "direkte".
 
Ok, habe aus Single mal nen Real gemacht. Jetzt scheint es zu funktionieren.
Kann mir einer erklären warum die DLL eine größere Gleitkommazahl brauch?

2. Frage steht noch aus :)

SirThornberry 1. Okt 2008 20:58

Re: DLL Function fungiert anders als "direkte".
 
könntest du bitte für deine zweite Frage ein eigenes Thema erstellen?
Und nutze zukünftig innerhalb von 24 Stunden bitte die Edit-Funktion wenn zwischenzeitlich kein anderer etwas gepostet hat :-)

gizzy 1. Okt 2008 21:03

Re: DLL Function fungiert anders als "direkte".
 
Sorry wegen doppel post. Hatte nichtmal aktualisiert :)

Aber hab ja zur meiner Lösung noch ne frage offen :D

brechi 1. Okt 2008 22:46

Re: DLL Function fungiert anders als "direkte".
 
Der Code ist echt unsauber programmiert. WinAPIs haben doch Rückgabvewerte auf die man prüfen sollte. Eine Exception kann nur noch bei der Division (durch 0) auftreten. Und wenn du statt einem Single Real nimmst kommt ein ganz anderes ergebnis raus. Das macht absolut keinen Sinn was du da dann machst. Ich denke der Code stammt nicht von dir oder? Du liest außerdem aus einem dynamsichen Speicherbereich die Daten aus, was auch nicht wirklich "sauber" ist.

Irgendwie so würds jetzt umgewandelt aussehen (habs heir im Editor programmiert :) )

Delphi-Quellcode:
function get_x(pid: Integer; offset_base: DWord; offset: Dword = $7C; Divider: Double = 10.0): Integer;
var
  BaseAddress : DWord;
  xRegionFloat           : Single;
  hProcess               : THandle;
  rBytes                 : Cardinal;
  PositionInt            : Byte;
begin
  Result := 0;
  if Divider <> 0 then
  begin
    hProcess := OpenProcess(PROCESS_VM_READ,False,pid);
    if hProcess <> 0 then
    begin
      if ReadProcessMemory(hProcess, Pointer(offset_base), @baseAddress, SizeOf(baseAddress), rBytes) and
        (rBytes = SizeOf(baseAddress)) and
        ReadProcessMemory(hProcess, Pointer(baseAddress + offset), @xRegionFloat, SizeOf(xRegionFloat), rBytes) and
      (rBytes = SizeOf(xRegionFloat)) and
        ReadProcessMemory(hProcess, Pointer(baseAddress + offset+4), @PositionInt, SizeOf(PositionInt), rBytes) and
      (rBytes = SizeOf(PositionInt)) then
        result := Round(xRegionFloat / Divider +  (PositionInt* 3 - $195) shl 6));
    end;
  end;
end;
Edit:
Du versuchst jetzt nicht seit 7 Monaten einen Cheat/Bot für Silkroad zu erstellen oder ^^

gizzy 1. Dez 2008 08:31

Re: DLL Function fungiert anders als "direkte".
 
Nein, ich habe die nicht selbst programmiert, da ich nicht wusste wie mann die berechnung der Coordinate durchführt.

Delphi-Quellcode:
Round(xRegionFloat / Divider +  (PositionInt* 3 - $195) shl 6));
Auslesen aus dem memory hatte ich auch schon in vorherigen funktion selbst erarbeitet. Da mir die Funktion als ganzes Vorlag habe ich sie so genommen wie Sie war.
Allerdings habe ich sie einwenig geändert. Sie hat funktioniert, von daher..

Übringens, das Ding liegt nicht umsonst in nen Try block, wenn es eine exception gibt kommt eben 0 raus.
Und:
Nein, ich probiere / und habe es nie versucht einen Cheat zu schreiben, ich mache das wenn mir langweilig ist, oder mir auf der Arbeit die Pause um die Ohren zu schlagen.

Zum dynamischen auslesen: Schon klar das es nicht sauber ist, aber es ist nunmal ein Dynamischer Adressbereich vorgegeben. Nur so kann ich meine Werte auslesen die ich haben will.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:20 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