Program pisany w delphi 7 nie działa na vista/7 :(

0

Witam napisałem pewien program wysyla on dane do bazy mysql <czyta dane z adresów i wysyła> i problem tkwi w tym iż na windows 7 i vista wysyła on dane ale nie te co powinien dodam że na windows xp smiga u wszystkich proszę o jakieś podpowiedzi co robić z góry dziękuję.

4

masz błąd w 85 linii

2

Witam napisałem pewien program wysyla on dane do bazy mysql <czyta dane z adresów i wysyła>

Kod...

problem tkwi w tym iż na windows 7 i vista wysyła on dane ale nie te co powinien

kod......

dodam że na windows xp smiga u wszystkich

KOD!!! Jak mamy Ci pomóc, skoro nie dajesz nam żadnych podstaw?!

0

niżej przedstawiam funkcje które istnieją w programie :

 function GetModuleBaseAddress(ProcessID: Cardinal; MName: String): Pointer;
 var
   Modules         : Array of HMODULE;
   cbNeeded, i     : Cardinal;
   ModuleInfo      : TModuleInfo;
   ModuleName      : Array[0..MAX_PATH] of Char;
   PHandle         : THandle;
 begin
   Result := nil;
   SetLength(Modules, 1024);
   PHandle := OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, False, ProcessID);
   if (PHandle <> 0) then
   begin
     EnumProcessModules(PHandle, @Modules[0], 1024 * SizeOf(HMODULE), cbNeeded);
     SetLength(Modules, cbNeeded div SizeOf(HMODULE)); 
     for i := 0 to Length(Modules) - 1 do 
     begin
       GetModuleBaseName(PHandle, Modules[i], ModuleName, SizeOf(ModuleName)); 
       if AnsiCompareText(MName, ModuleName) = 0 then 
       begin
         GetModuleInformation(PHandle, Modules[i], @ModuleInfo, SizeOf(ModuleInfo)); 
         Result := ModuleInfo.lpBaseOfDll;
         CloseHandle(PHandle);
         Exit;
       end;
     end;
   end;
 end;
var
  Form1: TForm1;
  XXX : string;
  const
dany1 = $949CFC;
dany 2 = $949D18;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
edit1.text := MemReadString(dany1);
edit2.text := MemReadString(dany2);
end;
0

Sorry za post pod postem ale nie moge edytować, program ma za zadanie czytanie adresu +adres_bazowy i wysyłanie go na serwer na windows vista/7 program sie niby uruchamia ale wysyła różne dziwne rzeczy np. krzaki na xp wszystko chodzi jak powinno.

0

Jesteś normalnie pr0 7r4in3r0r h4x0r. Fajnie, że pokazałeś nam kod funkcji MemReadString. Ja bym odczytanie stringa z danego adresu zrobił raczej tak jak poniżej. Wprawdzie string do 260 znaków, ale po co dłuższy. W ogóle po co czytać string w trainerze. Jeżeli trzeba znaleźć w pamięci jakiś ciąg bajtów to ja bym to zrobił kolejną funkcją, jak pokazałem poniżej.

function MemReadString(ProcessId, Address : DWORD) : string;
var
  I : integer;
  NB : LongWord;
  HProcess : Cardinal;
  Temp : array[1..MAX_PATH] of Byte;
begin
  Result := '';
  HProcess := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
  if HProcess > 0 then
  begin
    ReadProcessMemory(HProcess, Ptr(Address), @Temp[1], Length(Temp), NB);
    CloseHandle(HProcess);
    for I := Low(Temp) to High(Temp) do
    begin
      if (Temp[I] < 32) then
      begin
        Break;
      end;
      Result := Result + Chr(Temp[i]);
    end;
  end;
end;

Wyszukiwanie tablicy bajtów w pamięci procesu:

type
  TOnFindProc = procedure(FindedAddress : Cardinal);
//...
function FindBytesInMemory(APid : DWORD; RangeFrom, RangeTo : Cardinal;
  ArrayOfBytes : array of Byte; OnFindProc : TOnFindProc;
  StopAfterFirstFinding : boolean) : Cardinal;
const
  BufferSize = 65535;
var
  Found : boolean;
  SizeOfArr : Byte;
  HProcess : THandle;
  X, Y, Addr : Cardinal;
  BytesRead, BytesToRead : DWORD;
  Buffer : array[0..BufferSize - 1] of Byte;
begin
  Result := 0;
  Found := False;
  SizeOfArr := Length(ArrayOfBytes);
  HProcess := OpenProcess(PROCESS_ALL_ACCESS, False, APid);
  if (HProcess > 0) and (RangeFrom < RangeTo) then
  begin
    Addr := RangeFrom;
    while Addr < RangeTo do
    begin
      BytesToRead := BufferSize;
      if (RangeTo - Addr) < BytesToRead then
      begin
        BytesToRead := RangeTo - Addr;
      end;
      ReadProcessMemory(HProcess, Pointer(Addr), @Buffer[0], BytesToRead, BytesRead);
      if BytesRead > 0 then
      begin
        for X := 0 to BytesRead - 1 do
        begin
          Found := True;
          for Y := Low(ArrayOfBytes) to High(ArrayOfBytes) do
          begin
            if Buffer[X + Y] <> ArrayOfBytes[Y] then
            begin
              Found := False;
              Break;
            end;
          end;
          if Found then
          begin
            Result := Addr + X + Y - SizeOfArr;
            if @OnFindProc <> nil then
            begin
              OnFindProc(Result);
            end;
            Break;
          end;
        end;
      end;
      Addr := Addr + BytesToRead;
      if (Found) and (StopAfterFirstFinding) then
      begin
        Break;
      end;
    end;
    CloseHandle(HProcess);
  end;
end;

I nie raz pisałem trainery pod Windows 7, jeżeli wszystko jest napisane z głową oraz prawidłowo to nie ma znaczenia raczej czy trainer uruchamiany pod systemem XP czy nowszym (mogą być cyrki pod ósemką, bo tego nie mam jak sprawdzić). Wszystko powinno działać. Poza tym po co nam pokazać kluczowy kod do wysyłania danych na serwer. Według mnie masz taki błąd: Error #-69: TBrain not installed.. I niewiele na to poradzimy.

0

Dobrze przedstawię dokładnie kod programu niżej ale pierw opisze jak on działa ... program ma za zadanie odczytywać stringi z gry z adresów podanych w moim programie do nich jest potrzebna funkcja base_adress i niżej podaje dokładnie jak to wykonuję :

w głównym var daję coś takiego :

var
  Form1: TForm1;
  SSS : string;
  const
test = $949CFC;
test1 = $949D18;

Teraz funkcja która odpowiada za adresy bazowe :

function GetModuleBaseAddress(ProcessID: Cardinal; MName: String): Pointer;
 var
   Modules         : Array of HMODULE;
   cbNeeded, i     : Cardinal;
   ModuleInfo      : TModuleInfo;
   ModuleName      : Array[0..MAX_PATH] of Char;
   PHandle         : THandle;
 begin
   Result := nil;
   SetLength(Modules, 1024);
   PHandle := OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, False, ProcessID);
   if (PHandle <> 0) then
   begin
     EnumProcessModules(PHandle, @Modules[0], 1024 * SizeOf(HMODULE), cbNeeded); //Getting the enumeration of modules
     SetLength(Modules, cbNeeded div SizeOf(HMODULE)); //Setting the number of modules
     for i := 0 to Length(Modules) - 1 do //Start the loop
     begin
       GetModuleBaseName(PHandle, Modules[i], ModuleName, SizeOf(ModuleName)); //Getting the name of module
       if AnsiCompareText(MName, ModuleName) = 0 then //If the module name match with the name of module we are looking for...
       begin
         GetModuleInformation(PHandle, Modules[i], @ModuleInfo, SizeOf(ModuleInfo)); //Get the information of module
         Result := ModuleInfo.lpBaseOfDll; //Return the information we want (The image base address)
         CloseHandle(PHandle);
         Exit;
       end;
     end;
   end;
 end;

tutaj funkcja do czytania tych adresów

function MemReadString(Address: Integer): String;
var
NB : LongWord;
Temp : ARRAY [1..255] OF Byte;
I : Byte;
IDProcess, proc_ID : Cardinal;
begin
GetWindowThreadProcessID(FindWindow('TibiaClient', nil), @proc_ID);
IDProcess := OpenProcess(PROCESS_ALL_ACCESS, false, proc_ID);
ReadProcessMemory(IDProcess, Ptr(Address), @Temp[1], 255, NB);
for I := 1 to 255 do
begin
if ((Temp[i] = 0) or (Temp[i] = $0F)) then
Break;
Result := Result + Chr(Temp[i]);
end;
end;
function ReadMemInteger(Address: Cardinal): Cardinal; //Read adress:value
var
ProcId: Cardinal;
tProc: THandle;
NBR: Cardinal;
value:integer;
begin
GetWindowThreadProcessId(FindWindow('TibiaClient',Nil), @ProcId);
tProc:= OpenProcess(PROCESS_ALL_ACCESS, False, ProcId);
ReadProcessMemory(tProc, Ptr(Address), @value, 4, NBR);
CloseHandle(tProc);
Result:=value;
end;

i button odpowiadający za działanie całej aplikacji :

edit2.text := MemReadString(test);
edit3.text := MemReadString(test1);

Czyli co bym musiał tutaj zmodyfikować aby chodziło pod nowszymi systemami ? ten kod co podał olesio ? chodzi mi o to abym nie robił bałaganu tylko wkleił funkcję która jest tataj najbardziej potrzebna.

0

Nie gram w gimbusowe lame rpgi, więc nie mam pojęcia czy coś konkretnego pod tymi adresami jest. Sprawdziłeś to pod Cheat Engine wcześniej? Pod tymi adresami na pewno są stringi jakich oczekujesz? Kod niesformatowany i nie ma sprawdzania błędów. Sprawdź kod pod debuggerem albo od biedy zrób sobie MessageBoxa, który pokaże Ci co zwraca funkcja GetLastError. Opis jej wyniku sprawdzisz na MSDNie. I będziesz wiedział czy nie ma żadnych błędów. Bo nie skąd mamy mieć jakieś pojęcie, czy takie okno istnieje i czy można się dostać do procesu. A i ja podałem Tobie gotową funkcję, której przekazujesz tylko PID procesu. Poza tym nigdzie nie widzę wykorzystania funkcj GetModuleBaseAddress, którą nam wkleasz. I wypadało by według mnie najpierw ogarnąć podstawy języka tak w ogóle, a później brać się za zaawansowane rzeczy jak robienie trainerów i tym podobne.

0

Dobrze ale tutaj chodziło mi tylko o działanie aplikacji na windows vista i windows 7 :)

0

Mógłby ktoś pomóc ponieważ bardzo mi na tym zależy :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1