<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[NtOpenProcess und NtTerminateProcess direkt über SYSENTER aufrufen]]></title><description><![CDATA[<p>Hi Zusammen,</p>
<p>ich versuche gerade die Native API (also die Ntxxx-Funktionen) direkt in meinem Programm aufzurufen. Mich würde nämlich mal interessieren, ob ich das auch ohne kernel32.dll und die Sprung-Stubs in ntdll.dll schaffe.<br />
Sieht aber nicht so aus ...^^<br />
Liegt warscheinlich daran, dass ich das erste mal Inline Assembler in Verbindung mit C++ verwende, aber wer weiß - vielleicht liegt der Fehler auch woanders.</p>
<p>Mein Code sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">int main(int argc, char *argv[])
{    
	PCLIENT_ID ClientId = (PCLIENT_ID) malloc (sizeof (CLIENT_ID));
	POBJECT_ATTRIBUTES obj = (POBJECT_ATTRIBUTES) malloc (sizeof (OBJECT_ATTRIBUTES));
	DWORD dwAccess = 0x01;
	PHANDLE phProcess = (PHANDLE) malloc (sizeof (HANDLE));

	ClientId-&gt;UniqueProcess = ID_OF_PROCESS;
	ClientId-&gt;UniqueThread = 0;

	obj-&gt;Length = sizeof (OBJECT_ATTRIBUTES);
	obj-&gt;Attributes = 0;
	obj-&gt;ObjectName = NULL;
	obj-&gt;RootDirectory = 0;
	obj-&gt;SecurityDescriptor = 0;
	obj-&gt;SecurityQualityOfService = 0;

	__asm 
	{
		push [ClientId];
		push [obj];
		push [dwAccess];
		push [phProcess];

		mov eax, 7Ah; //Index für NtOpenProcess in der SSDT
		mov edx, esp; 

		sysenter;     //Call NtOpenProcess via KiFastCallEntry
	}     
	DWORD dwExitStatus = 0;
	HANDLE hTerminate = *phProcess;

	__asm 
	{
		push [dwExitStatus];
		push [hTerminate];

		mov eax, 101h; //Index für NtTerminateProcess in der SSDT
		mov edx, esp;

		sysenter;    //Call NtTerminateProcess via KiFastCallEntry
	}

    system(&quot;PAUSE&quot;);          
    return (0);         
}
</code></pre>
<p>Der Code kompiliert einwandfrei. Nur bei der Ausführung schmiert mir das Programm ab, aka. ich bekomme einen Fehlerbericht. Dieses Fenster mit 'Senden' und 'Nicht Senden'- ich denke ihr kennt das auch schon. XD</p>
<p>By the way, sollte sich jemand wundern, warum der Befehl 'sysenter' in den beiden inline assembly bei mir kompiliert wurde (der inline Asssembler von VC++ kennt den Befehl normalerweise nicht)- das habe ich anfangs als int 2eh kompilieren lassen und später mit einem Disassembler nachträglich in ein sysenter umgeändert. Die Anweisungslängen sind ja auf Assemblerebene gleich (2 Byte).</p>
<p>Es wäre sehr freundlich von euch, wenn ihr mir dabei weiterhelfen könntet.</p>
<p>Greetings, Xzi-bit</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/185068/ntopenprocess-und-ntterminateprocess-direkt-über-sysenter-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 05 Jul 2026 16:08:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/185068.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 21 Jun 2007 15:13:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to NtOpenProcess und NtTerminateProcess direkt über SYSENTER aufrufen on Thu, 21 Jun 2007 15:13:50 GMT]]></title><description><![CDATA[<p>Hi Zusammen,</p>
<p>ich versuche gerade die Native API (also die Ntxxx-Funktionen) direkt in meinem Programm aufzurufen. Mich würde nämlich mal interessieren, ob ich das auch ohne kernel32.dll und die Sprung-Stubs in ntdll.dll schaffe.<br />
Sieht aber nicht so aus ...^^<br />
Liegt warscheinlich daran, dass ich das erste mal Inline Assembler in Verbindung mit C++ verwende, aber wer weiß - vielleicht liegt der Fehler auch woanders.</p>
<p>Mein Code sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">int main(int argc, char *argv[])
{    
	PCLIENT_ID ClientId = (PCLIENT_ID) malloc (sizeof (CLIENT_ID));
	POBJECT_ATTRIBUTES obj = (POBJECT_ATTRIBUTES) malloc (sizeof (OBJECT_ATTRIBUTES));
	DWORD dwAccess = 0x01;
	PHANDLE phProcess = (PHANDLE) malloc (sizeof (HANDLE));

	ClientId-&gt;UniqueProcess = ID_OF_PROCESS;
	ClientId-&gt;UniqueThread = 0;

	obj-&gt;Length = sizeof (OBJECT_ATTRIBUTES);
	obj-&gt;Attributes = 0;
	obj-&gt;ObjectName = NULL;
	obj-&gt;RootDirectory = 0;
	obj-&gt;SecurityDescriptor = 0;
	obj-&gt;SecurityQualityOfService = 0;

	__asm 
	{
		push [ClientId];
		push [obj];
		push [dwAccess];
		push [phProcess];

		mov eax, 7Ah; //Index für NtOpenProcess in der SSDT
		mov edx, esp; 

		sysenter;     //Call NtOpenProcess via KiFastCallEntry
	}     
	DWORD dwExitStatus = 0;
	HANDLE hTerminate = *phProcess;

	__asm 
	{
		push [dwExitStatus];
		push [hTerminate];

		mov eax, 101h; //Index für NtTerminateProcess in der SSDT
		mov edx, esp;

		sysenter;    //Call NtTerminateProcess via KiFastCallEntry
	}

    system(&quot;PAUSE&quot;);          
    return (0);         
}
</code></pre>
<p>Der Code kompiliert einwandfrei. Nur bei der Ausführung schmiert mir das Programm ab, aka. ich bekomme einen Fehlerbericht. Dieses Fenster mit 'Senden' und 'Nicht Senden'- ich denke ihr kennt das auch schon. XD</p>
<p>By the way, sollte sich jemand wundern, warum der Befehl 'sysenter' in den beiden inline assembly bei mir kompiliert wurde (der inline Asssembler von VC++ kennt den Befehl normalerweise nicht)- das habe ich anfangs als int 2eh kompilieren lassen und später mit einem Disassembler nachträglich in ein sysenter umgeändert. Die Anweisungslängen sind ja auf Assemblerebene gleich (2 Byte).</p>
<p>Es wäre sehr freundlich von euch, wenn ihr mir dabei weiterhelfen könntet.</p>
<p>Greetings, Xzi-bit</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1310792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1310792</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 21 Jun 2007 15:13:50 GMT</pubDate></item><item><title><![CDATA[Reply to NtOpenProcess und NtTerminateProcess direkt über SYSENTER aufrufen on Thu, 21 Jun 2007 15:24:50 GMT]]></title><description><![CDATA[<p>Da die (meisten) Funktionen nicht dokumentiert sind kann ich Dir nur sagen:<br />
Da musst Du wohl noch etwas reverse Engineeren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>PS: Das einfachste ist: Frag an Deiner Uni ob Du den Windows Source-Code Dir anschauen kannst... die meinsten Unis haben Zugriff drauf... wenn nicht, kannst Du auch mich fragen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1310807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1310807</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Thu, 21 Jun 2007 15:24:50 GMT</pubDate></item><item><title><![CDATA[Reply to NtOpenProcess und NtTerminateProcess direkt über SYSENTER aufrufen on Thu, 21 Jun 2007 15:36:49 GMT]]></title><description><![CDATA[<p>Naja, ich denke, dass ich mir dabei ziemlich sicher sein kann.<br />
Ich habe eine Dokumentation für die beiden Funktionen gefunden:</p>
<p><a href="http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/NtOpenProcess.html" rel="nofollow">http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/NtOpenProcess.html</a><br />
und<br />
[url]<a href="http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/NtTerminateProcess.html" rel="nofollow">http://undocumented.ntinternals.net/UserMode/Undocumented Functions/NT Objects/Process/NtTerminateProcess.html</a> [/url]</p>
<p>Den Code von OpenProcess aus der kernel32.dll hab ich mir mit Windbg anzeigen lassen und habe außerdem den Sourcecode von Reactos 3.1 für OpenProcess da.<br />
Der ist in dieser Hinsicht identisch.<br />
Mein Code müsste folglich auch stimmig sein.</p>
<p>Aber ich werde so schnell wie möglich versuchen an den Quelltext zu kommen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
Vielleicht ist es das Beste. Hast ja Recht XD</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1310816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1310816</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 21 Jun 2007 15:36:49 GMT</pubDate></item><item><title><![CDATA[Reply to NtOpenProcess und NtTerminateProcess direkt über SYSENTER aufrufen on Thu, 21 Jun 2007 19:13:08 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">(...)
 __asm {

   PUSH ....     
   PUSH ....
   PUSH ....
   PUSH ....

   LEA  EAX,@LAB01    // &lt;- !!!
   PUSH EAX

   MOV  EAX, ....   
   MOV  EDX, ESP

   SYSENTER

 @LAB01:

   ADD ESP, ....      // &lt;- !!!

 }
(...)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1310995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1310995</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 21 Jun 2007 19:13:08 GMT</pubDate></item></channel></rss>