Autor Beitrag
xgee
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 24.08.12 18:05 
hey,

ich bin eig. c++ programmierer, habe hier allerdings einen delphi/pascal code, den ich nutzen muss/will, da ein convertieren zu lange dauern würde und der delphi code ganz nice ist, außer dass ich nur eine kleine Änderung brauche.

Es handelt sich dabei um einen Injector, der eine DLL in ein Spiel injiziert.
ES klappt auch wunderbar, dies geschieht jedoch momentan MANUELL über einen Button1 mit dem Event OnClick Button1Click.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit2: TEdit;
    Label2: TLabel;
    ComboBox1: TComboBox;
    Label5: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

function GetPID(my_name: string): Cardinal;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
 var
  sFile: dword;
  Size: dword;
  Buff: pointer;
  BytesReaded: dword;
  HProc:THandle;
  PID:Cardinal;
  ProcName,DLLName:string;
  Flag:boolean;
begin
try
   ProcName:=ComboBox1.Text;
   DLLName:=Edit2.Text;
  PID:=GetPID(ProcName);
  HProc:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_ALL_ACCESS,
                       false,PID);
  if FileExists(DLLName) then
  begin
  sFile := CreateFile(PAnsiChar(DLLName), GENERIC_READ, FILE_SHARE_READ,
                      nil, OPEN_EXISTING, 00);
  Size := GetFileSize(sFile, nil);
  GetMem(Buff, Size);
  ReadFile(sFile, Buff^, Size, BytesReaded, nil);
  CloseHandle(sFile);

  Sleep(2000);
 Flag:= InjectDllEx(HProc, Buff);
 if Flag=true then
 if InjectDllEx(HProc, Buff) then
 MessageBox(0,'Done','Injected',0)
  else   MessageBox(0,'Wrong','Error',0);
  FreeMem(Buff);
 //error:
 end else  MessageBox(0,'Not founded.','DLL doesn''t exist.',0);
 except
 MessageBox(0,'Exception.','Error',0);
 end;
end;
Mein Ziel ist jetzt, es nicht über den Button1 Injecten zu lassen, sondern AUTOMATISCH, wenn ProcName, also der Prozess gefunden/gestartet wurde.
Das klingt eig. ganz leicht, allerdings komme ich da leider nicht ganz klar mit der Sprache/Syntax.

Wenn jmd. behilflich sein könnte, wäre es sehr sehr nett!
Mir ist schon bewusst, dass "procedure TForm1.Button1Click(Sender: TObject);" irgendwie entfernt werden muss.


Falls diese beiden Dateien noch benötigt werden:
Moderiert von user profile iconNarses: Gelinkte Dateien als Anhang hochgeladen.
Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 24.08.2012 um 20:28
Moderiert von user profile iconNarses: Anhänge auf Wunsch des TE wieder gelöscht.
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 432
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Sa 25.08.12 01:01 
> Wenn jmd. behilflich sein könnte, wäre es sehr sehr nett!

Es tut mir leid wenn ich ein wenig kurz angebunden bin, aber derartige Ansinnen lese ich hier immer wieder einmal. Ich persönlich betrachte es mittlerweile als Zeitverschwendung. ("Wie überliste ich Spiel X, wie kann ich Dongle Y ausschalten") ich bekam sogar PMs mit verdeckter Bitte um Hilfe bei Virenprogrammierung).

Ich geb mal dann den Hinweis über Timer zu arbeiten. Und FindWindow. Usw.
xgee Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Sa 25.08.12 05:44 
user profile iconmandras hat folgendes geschrieben Zum zitierten Posting springen:
Ich geb mal dann den Hinweis über Timer zu arbeiten. Und FindWindow. Usw.

Ein Spiel zu modifizieren, bzw. auf der Oberfläche etwas zu zeichnen ist völlig legitim, zumal die Entwickler nicht umsonst die SDK's zur Verfügung stellen. Solange man keine betrügerische Absicht hat, wie zB ONLINE/MULTIPLAYER cheating, ist meiner Meinung nach alles OK. Ich benutze mein Projekt nur für den Singleplayer(offline) und drawe einen Schriftzug auf der Oberfläche, aber das ist hier völlig irrelevant, da es hier nur um die Methode der Injection geht & nicht um den library code ansich.
Um Virenprogrammierung handelt es sich hierbei natürlich nicht..ist ja kein hacker forum hier ist mir bewusst =)


Hm ich habe jetzt while (FindWindow("Valve001",NULL) ) folgendermaßen eingebunden..
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
.........
while (FindWindow("Valve001",NULL) ) and  FileExists(DLLName) then
  Sleep(3000);
  begin
//hier der ganze inject kram (siehe src oben)

Kriege dann natürlich einen Error für diese Zeile, da es im falschen Format ist ?!
[Error] Unit1.pas(53): Illegal character in input file: '"' ($22)

Ich denke das ist der richtige Weg oder? sodass es nur dann injected, wenn der das Window gefunden wird + die DLL existiert?
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Sa 25.08.12 10:24 
Was genau ist denn deine "Eingabe" für das Problem? Im Button-Click bekommst du den Prozessname aus der ComboBox. Wenn du nur den Button automatisch ausführen lassen willst, dann packe den identischen Code in einen Timer. Normalerweise sollte GetPID dir sagen, wenn der Prozess noch nicht gestartet wurde (finde diese Funktion in der Hilfe nicht).
Du müsstest dir dann nur noch merken, welchen Prozess du bereits bearbeitet hast.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 432
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Sa 25.08.12 12:17 
In Pascal/Delphi sind Strings in einfache Anführungszeichen zu setzen (der über der Raute), daher
die Fehlermeldung.
xgee Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Sa 25.08.12 15:35 
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Was genau ist denn deine "Eingabe" für das Problem? Im Button-Click bekommst du den Prozessname aus der ComboBox. Wenn du nur den Button automatisch ausführen lassen willst, dann packe den identischen Code in einen Timer. Normalerweise sollte GetPID dir sagen, wenn der Prozess noch nicht gestartet wurde (finde diese Funktion in der Hilfe nicht).
Du müsstest dir dann nur noch merken, welchen Prozess du bereits bearbeitet hast.


Stimmt..Wenn ich den Button-Click einfach alle X Sekunden automatisch ausführen lasse, dann löst das mein Problem.
Denn sobald dann automatisch der Button geklickt wird und der der Prozessname aus der ComboBox gefunden wird, wird er dann injecten. Aber nach dem Injecten soll er ja nicht mehr den Button klicken ^^^^

Habe mich an dieses Timer Tutorial orientiert: blubplayer.de/tutorials/TimerTutorial.pdf

Unsatisfied forward or external declaration: 'TForm1.OnTimer' obwohl es im Tutorial eig. genauso ist? Wie kann ich meinen Code noch optimieren für meinen Zweck?

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, mmsystem,
  advApiHook,
  TlHelp32;

 type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit2: TEdit;
    Label2: TLabel;
    ComboBox1: TComboBox;
    Label5: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private

  public
    FTimer: TTimer;
    Zeit: int64;
    Counter: integer; //Eine Variable zum Zählen der Timer Durchläufe
procedure OnTimer(Sender: TObject);//Event Handler
  end;

var
  Form1: TForm1;

function GetPID(my_name: string): Cardinal;

implementation

{$R *.dfm}

function Customtimegettime: int64;
var
Frequenz: int64;
Zeit: int64;
begin
if QueryPerformanceFrequency(Frequenz) = true then{ist die Funktion verfügbar}
begin
QueryPerformanceCounter(Zeit);
result := Zeit div (Frequenz div 1000); {umrechnen auf 1/1000 Sekunde}
end
else
begin
result := timegettime; {Wenn QueryPerformanceFrequency(Frequenz) nicht geht}
end;
end;



procedure TForm1.Button1Click(Sender: TObject);
 var
  sFile: dword;
  Size: dword;
  Buff: pointer;
  BytesReaded: dword;
  HProc:THandle;
  PID:Cardinal;
  ProcName,DLLName:string;
  Flag:boolean;
  //Valve001:boolean;
begin
inc(Counter); //Zähler um 1 erhöhen
if timegettime-Zeit>1000 then //Jeweils nach einer Sekunde

// alle paar sekunden versuchen zu injecten..
try
   DLLName:=Edit2.Text;
   ProcName:=ComboBox1.Text;
   PID:=GetPID(ProcName);
  HProc:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_ALL_ACCESS,
                       false,PID);
  if FileExists(DLLName) then
  begin
  sFile := CreateFile(PAnsiChar(DLLName), GENERIC_READ, FILE_SHARE_READ,
                      nil, OPEN_EXISTING, 00);
  Size := GetFileSize(sFile, nil);
  GetMem(Buff, Size);
  ReadFile(sFile, Buff^, Size, BytesReaded, nil);
  CloseHandle(sFile);
   //If FindWindow('Valve001') then
 Sleep(3000);
 Flag:= InjectDllEx(HProc, Buff);
 if Flag=true then
 if InjectDllEx(HProc, Buff) then
 MessageBox(0,'Done','Injected',0)
  else   MessageBox(0,'Wrong','Error',0);
  FreeMem(Buff);
 //error:
 end else  MessageBox(0,'Not founded.','DLL doesn''t exist.',0);
 except
 MessageBox(0,'Exception.','Error',0);


 Canvas.TextOut(10,10,inttostr(counter)); //Zähler ausgeben

// NUR versuchen zu injecten, wenn InjectDllEx(HProc, Buff) FALSE!!! hm? sonst injected er ja 1000x
zeit:= timegettime; //neue Start Zeit ermitteln
Counter := 0//und Zähler wieder auf 0 setzen.

 end;
end;

 function GetPID(my_name:string): Cardinal;

var h: Cardinal;

    p: tagPROCESSENTRY32;

    fnd: boolean;

    pr_name:string;


begin

  result := 0;

  h := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

  p.dwSize := SizeOf(tagPROCESSENTRY32);

  fnd := Process32First(h, p);


  while fnd do

  begin

      pr_name := String(p.szExeFile) ;

    if(pr_name = my_name)then

    begin

      fnd := false;
      result := p.th32ProcessID;

    end else

      fnd := Process32Next(h, p);

  end;

  CloseHandle(h);

end;

procedure TForm1.FormCreate(Sender: TObject);
var
 p: tagPROCESSENTRY32;
     h: Cardinal;
    fnd: boolean;
    index:integer;
begin
h := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

  p.dwSize := SizeOf(tagPROCESSENTRY32);

  fnd := Process32First(h, p);

  index:=0;
  while fnd do

  begin
      index:=index+1;
      Combobox1.AddItem(String(p.szExeFile),Sender) ;
      fnd := Process32Next(h, p);
      begin
     FTimer := TTimer.create(self); {Man kann auch statt self nil einsetzen
dann muss Aber auch noch Ftimer wieder freigeben.}

FTimer.Interval := 1;
FTimer.OnTimer := OnTimer; //Eventhandler wird zugewiesen
FTimer.Enabled := true;
//Der Timer wurde erstellt
Counter := 0;
Zeit := Timegettime //Die Startzeit wird ermittelt
  end;
end;
  end;
end.
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 432
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: So 26.08.12 13:25 
In Zeile 27 definierst Du eine Prozedur "OnTimer", die aber im weiteren Quelltext nicht vorkommt, daher die Fehlermeldung.