Autor |
Beitrag |
xgee
Hält's aus hier
Beiträge: 3
|
Verfasst: 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.
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 public 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, 0, 0); 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); 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 Narses: Gelinkte Dateien als Anhang hochgeladen.
Moderiert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 24.08.2012 um 20:28
Moderiert von Narses: Anhänge auf Wunsch des TE wieder gelöscht.
|
|
mandras
      
Beiträge: 432
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: 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 
Hält's aus hier
Beiträge: 3
|
Verfasst: Sa 25.08.12 05:44
mandras hat folgendes geschrieben : | 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..
Delphi-Quelltext 1: 2: 3: 4: 5:
| ......... while (FindWindow("Valve001",NULL) ) and FileExists(DLLName) then Sleep(3000); begin |
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
      

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)
|
Verfasst: 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
      
Beiträge: 432
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: 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 
Hält's aus hier
Beiträge: 3
|
Verfasst: Sa 25.08.12 15:35
Xion hat folgendes geschrieben : | 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?
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; procedure OnTimer(Sender: TObject); 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 begin QueryPerformanceCounter(Zeit); result := Zeit div (Frequenz div 1000); end else begin result := timegettime; 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; begin inc(Counter); if timegettime-Zeit>1000 then 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, 0, 0); Size := GetFileSize(sFile, nil); GetMem(Buff, Size); ReadFile(sFile, Buff^, Size, BytesReaded, nil); CloseHandle(sFile); 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); end else MessageBox(0,'Not founded.','DLL doesn''t exist.',0); except MessageBox(0,'Exception.','Error',0);
Canvas.TextOut(10,10,inttostr(counter)); zeit:= timegettime; Counter := 0; 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); FTimer.Interval := 1; FTimer.OnTimer := OnTimer; FTimer.Enabled := true; Counter := 0; Zeit := Timegettime end; end; end; end. |
|
|
mandras
      
Beiträge: 432
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: So 26.08.12 13:25
In Zeile 27 definierst Du eine Prozedur "OnTimer", die aber im weiteren Quelltext nicht vorkommt, daher die Fehlermeldung.
|
|
|