[C#] OpenProcess gibt 0 zurück

07/05/2013 18:33 *~EliteTrader~*#1
Hi, ich hab da ein kleines Problem, was mich heute schon so manche Stunde erfolglose Recherche gekostet hat. Und zwar möchte ich unter anderem eine 32-bit DLL in einen 32-bit Prozess injecten. Dafür hab ich mir diverse C#-Injectoren angeschaut und versucht, diese in mein Projekt zu übernehmen, da ich zum selber schreiben leider zu wenig Ahnung von der Thematik habe. Bei allen Versuchen gibt die OpenProcess-Methode aber leider 0 zurück, obwohl die Prozess-ID richtig ist (im TaskManager überprüft) und ich das Ding sogar als Admin starte. Einige Auszüge davon:

Quote:
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr OpenProcess(uint dwDesiredAccess, int bInheritHandle, uint dwProcessId);

IntPtr hndProc = OpenProcess((0x2 | 0x8 | 0x10 | 0x20 | 0x400), 0, pToBeInjected);
oder mit allen Rechten
Quote:
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(
Int32 dwDesiredAccess,
Boolean bInheritHandle,
Int32 dwProcessId
);

IntPtr hProcess = OpenProcess(0x1F0FFF, false, ProcID);
In diversen Foren liest man von "Access Rights" und "SeDebugPrevilege". Im MSDN hab ich mich darüber auch schon informiert und ich denke, dass das helfen könnte. Wie man das allerdings in C# umsetzt hat niemand verraten :( Ein Anlauf war "System.Diagnostics.Process.EnterDebugMode();" , aber das feuert nur ne XamlParseException (ja, ich arbeite mit WPF aber keine Ahnung wie das nun zusammenhängen kann??). Hat jemand ne komplette Injector-Source parat oder wenigstens die Zeilen für die Zugriffsrechte? Wäre echt super!
07/05/2013 18:41 BladeTiger12#2
Was steht den in ProcID.
Bzw. wo ist der restliche code?
07/05/2013 19:01 Schlüsselbein#3
GetLastError...

Edit: Was hast du überhaupt vor? Wenn deine Anwendung großteils p/invoke benutzt wärs vielleicht ne Überlegung wert, C++ zu benutzen.
07/05/2013 21:14 *~EliteTrader~*#4
Quote:
Originally Posted by BladeTiger12 View Post
Was steht den in ProcID.
Im letzten Test 7661, die vollkommen richtige Prozess-ID (laut Win8 TaskManager).

Quote:
Originally Posted by BladeTiger12 View Post
Bzw. wo ist der restliche code?
Von dem oberen Teil hab ich den Link noch.
[Only registered and activated users can see links. Click Here To Register...]
Ich rufe da einfach die Inject-Methode auf. Die übergebenen Parameter hab ich auch geprüft.
Vom 2ten habs ichs mir nich aufgehoben. Würd ich mal raussuchen, wenns dringend ist.

Quote:
Originally Posted by Schlüsselbein View Post
GetLastError...
Verstehe leider nicht ganz, was du meinst...

Quote:
Originally Posted by Schlüsselbein View Post
Was hast du überhaupt vor?
Quote:
Originally Posted by *~EliteTrader~* View Post
Und zwar möchte ich unter anderem eine 32-bit DLL in einen 32-bit Prozess injecten.
Quote:
Originally Posted by Schlüsselbein View Post
Wenn deine Anwendung großteils p/invoke benutzt wärs vielleicht ne Überlegung wert, C++ zu benutzen.
Das wäre sicher ne Überlegung wert, aber leider behersche ich kein C++. Und gerade bin ich am Java lernen. Will mir das jetzt nicht auch noch unnötig kompliziert machen^^

Danke für die Antworten :)
07/06/2013 01:13 snow#5
GetLastError() gibt dir den Error Code des letzten Errors aus. Kannste nach OpenProcess aufrufen und du hast die Fehlermeldung.

Schau mal hier für SeDebugPrivilege:
[Only registered and activated users can see links. Click Here To Register...]
07/06/2013 14:44 *~EliteTrader~*#6
Quote:
Originally Posted by snow911 View Post
GetLastError() gibt dir den Error Code des letzten Errors aus. Kannste nach OpenProcess aufrufen und du hast die Fehlermeldung.
Hab es nicht mit GetLastError() versucht, sondern mit "Marshal.GetLastWin32Error();", da es in einem anderem Forum so empfohlen wurde. Die Methode spuckt mir den Code 5 aus, was Microsoft als "Access is denied" versteht.
Quote:
ERROR_ACCESS_DENIED

5 (0x5)

Access is denied.
Daher denke ich, dass SeDebugPrevilege mein Problem eigentlich lösen sollte.

Quote:
Originally Posted by snow911 View Post
Schau mal hier für SeDebugPrivilege:
[Only registered and activated users can see links. Click Here To Register...]
Hab das mal in meinen Code mit einer Änderung übernommen. Aus der main-Methode hab ich eine normale Methode gemacht, die ich einfach aufrufe. Diese wird selbstverständlich vor dem anderen Code ausgeführt und "Marshal.GetLastWin32Error();" hat mir danach den Code 1300 zurückgegeben.
Quote:
ERROR_NOT_ALL_ASSIGNED

1300 (0x514)

Not all privileges or groups referenced are assigned to the caller.
Habs sowohl im Debugger, als auch im Explorer getestet (natürlich als Admin). Hätte nicht gedacht, dass das so komplex ist :D