Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding
You last visited: Today at 04:07

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Interrupts in Inline Assembler

Discussion on Interrupts in Inline Assembler within the General Coding forum part of the Coders Den category.

Reply
 
Old   #1
 
HardCore.1337's Avatar
 
elite*gold: 1
Join Date: Feb 2009
Posts: 1,726
Received Thanks: 729
Interrupts in Inline Assembler

Hey

ich bin heute auf etwas merkwürdiges Gestoßen. Es geht um Interrupts in Inline Assembler. Folgender Code mit einer Zugriffsverletzung beendet. Ist es möglich das gar keine Interrupts in Inline Assembler unterstützt werden oder ich habe ich einen Fehler gemacht?

Code:
void MoveMouse()
{
   _asm
   {
       mov ah, 0x04;
       mov cx, 500; // X
       mov dx, 1000; // Y
       int 0x33; //das scheint nicht zu gehen

   }
}
HardCore.1337 is offline  
Old 03/22/2011, 18:06   #2
 
elite*gold: 0
Join Date: Mar 2008
Posts: 747
Received Thanks: 245
Für welches betriebssystem ist den das pogramm.
Akorn is offline  
Old 03/22/2011, 18:08   #3
 
HardCore.1337's Avatar
 
elite*gold: 1
Join Date: Feb 2009
Posts: 1,726
Received Thanks: 729
Hab es unter Win7 x64 getestet.
HardCore.1337 is offline  
Old 03/22/2011, 18:16   #4


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,913
Received Thanks: 25,413
In Inline ASM gehen natürlich alle Befehle genau so, als würde man sie direkt mit einem Assembler assemblieren, aber was ich mich gerade frage:

Was macht der Interrupt? Ist er überhaupt vom System zugelassen? Soweit ich weiß, gibt es einige, die das System nicht zulässt.
Oder wird einer der Werte, die du angegeben hast, als Speicheradresse verwendet?
MrSm!th is offline  
Thanks
1 User
Old 03/22/2011, 18:16   #5
 
elite*gold: 0
Join Date: Mar 2008
Posts: 747
Received Thanks: 245
Interrupt 0x33 ist ein Interrupt das vom BIOS bereitgestellt wird. Es ist eigentlich nur für Realmode Betriebssysteme gedacht und funktioniert nicht auf betriebssyteme die protectmode bzw bei X64 im Longmode laufen.

Die BIOS interrupt haben früher zusammen mit dem DOS interrupts unter den Betreibssystem DOS die Pogrammier API Dargestellt.

Unter Windows wirst du ein pogramm dass interrupts benutzt nur noch emuliert ausführen können.
Der NT-Kernel von Windows stellt nur noch einen Interrupt berreit undzwar den 0x2e dieser wird aber nur von der ntdll als verbindungsglied zwischen Usermode und Kernelmode benutzt. Wobei es mittlerweile andere verfahren gibt um aus dem Usermode mit dem kernel im kernelmode zu kommunizieren. wodurch auch dieser interrupt immer mehr verschwindet.
Akorn is offline  
Thanks
1 User
Old 03/22/2011, 18:24   #6
 
HardCore.1337's Avatar
 
elite*gold: 1
Join Date: Feb 2009
Posts: 1,726
Received Thanks: 729
Quote:
Originally Posted by Akorn View Post
Interrupt 0x33 ist ein Interrupt das vom BIOS bereitgestellt wird. Es ist eigentlich nur für Realmode Betriebssysteme gedacht und funktioniert nicht auf betriebssyteme die protectmode bzw bei X64 im Longmode laufen.

Die BIOS interrupt haben früher zusammen mit dem DOS interrupts unter den Betreibssystem DOS die Pogrammier API Dargestellt.
Ja, davon habe ich auch schon gelesen, das der 0x33 Interrupt noch aus DOS Zeiten stammt. Ich werde es mal unter Win98 testen. Aber wenn ich weiß das Interrupts allgemein gehen wäre ich schon sehr erleichtert
HardCore.1337 is offline  
Old 03/22/2011, 18:40   #7
 
elite*gold: 0
Join Date: Mar 2008
Posts: 747
Received Thanks: 245
Quote:
Originally Posted by HardCore.1337 View Post
Ja, davon habe ich auch schon gelesen, das der 0x21 Interrupt noch aus DOS Zeiten stammt. Ich werde es mal unter Win98 testen. Aber wenn ich weiß das Interrupts allgemein gehen wäre ich schon sehr erleichtert
Habe in meinen letzten post noch was hinzugefügt da ich nicht gesehn hab das du berreits zurückgeschrieben hast.

32Bit windows systeme haben einen Emulator der es erlaubt pogramme die den Interupt 0x21 benutzen auszuhfüren.
Ansonsten kannst du halt nur den Interrupt 0x2e benutzen. Damit kannst du aber schon ne menge machen da schliesslich die komplette Kernel32.dll auf diesen interrupt aufbaut. Allerdings wirst du keinerlei dokummentationen über die funktionen dieses Interrupts finden.

Ansonsten wen du umbedingt mit Interrupts arbeiten willst dan kannst du auch Linux nehmen. Der Linux kernel stellt nämlich alle seine funktionen als interrupt 0x80 berreit. Oder du nimmst das BS MenuetOs das stellt seine API auch nur als interrupt berreit.
Akorn is offline  
Thanks
1 User
Old 03/22/2011, 18:45   #8
 
HardCore.1337's Avatar
 
elite*gold: 1
Join Date: Feb 2009
Posts: 1,726
Received Thanks: 729
Ok, hätte nicht gedacht das es so kompliziert wird
HardCore.1337 is offline  
Old 03/22/2011, 19:10   #9


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,913
Received Thanks: 25,413
Quote:
Originally Posted by Akorn View Post
Habe in meinen letzten post noch was hinzugefügt da ich nicht gesehn hab das du berreits zurückgeschrieben hast.

32Bit windows systeme haben einen Emulator der es erlaubt pogramme die den Interupt 0x21 benutzen auszuhfüren.
Ansonsten kannst du halt nur den Interrupt 0x2e benutzen. Damit kannst du aber schon ne menge machen da schliesslich die komplette Kernel32.dll auf diesen interrupt aufbaut. Allerdings wirst du keinerlei dokummentationen über die funktionen dieses Interrupts finden.

Ansonsten wen du umbedingt mit Interrupts arbeiten willst dan kannst du auch Linux nehmen. Der Linux kernel stellt nämlich alle seine funktionen als interrupt 0x80 berreit. Oder du nimmst das BS MenuetOs das stellt seine API auch nur als interrupt berreit.
Funktionieren die Calls in den Kernel nicht mittlerweile per SYSENTER?
MrSm!th is offline  
Old 03/22/2011, 23:42   #10
 
elite*gold: 0
Join Date: Mar 2008
Posts: 747
Received Thanks: 245
Quote:
Originally Posted by MrSm!th View Post
Funktionieren die Calls in den Kernel nicht mittlerweile per SYSENTER?
Ja das wird immer öfters als Sysenter gemacht,das hatte ich aber auch angedeutet.

Quote:
Originally Posted by Akorn View Post
Der NT-Kernel von Windows stellt nur noch einen Interrupt berreit undzwar den 0x2e dieser wird aber nur von der ntdll als verbindungsglied zwischen Usermode und Kernelmode benutzt. Wobei es mittlerweile andere verfahren gibt um aus dem Usermode mit dem kernel im kernelmode zu kommunizieren. wodurch auch dieser interrupt immer mehr verschwindet.
Akorn is offline  
Old 03/23/2011, 11:57   #11
 
HardCore.1337's Avatar
 
elite*gold: 1
Join Date: Feb 2009
Posts: 1,726
Received Thanks: 729
Find ich aber relativ schade das die Interrupts verschwinden
HardCore.1337 is offline  
Old 03/23/2011, 13:03   #12
 
elite*gold: 0
Join Date: Mar 2008
Posts: 747
Received Thanks: 245
Nunja auf anderen Betriebssystemen gibt es ja noch Interrupts.
Und rein theoretisch kannst du auch kernel funktionen mittels Sysenter von deinem programm aus aufrufen, das ist aber weitaus schwieriger da nicht jede Cpu sysenter unterstützt und das benutzen von Sysenter sich auf Intel und Amd Cpu´s unterscheidet.
Akorn is offline  
Old 03/23/2011, 15:49   #13


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,913
Received Thanks: 25,413
Warum schade? Gibt nunmal nun bessere Varianten.
Was haben die Interrupts, was andere Methoden nicht haben?

Ob du nun Ausgabefunktionen callst oder den Ausgabe-Interrupt auslöst, ist doch ziemlich egal. Und Sprünge in den Kernel passieren wie gesagt nun per SYSENTER.

Schreib doch dein eigenes Betriebssystem, dann kannst du die Interrupt-Table sogar selbst festlegen :P
MrSm!th is offline  
Reply


Similar Threads Similar Threads
Inline ASM
06/07/2010 - General Coding - 5 Replies
Huhu was mich schon länger beschäftigt ist die Frage wieso inline assembler unbedingt vermieden werden sollte. Es geht mir vorallem um windows tools/game hacks. Wäre nett wenn mich jemand mit ein paar schönen begründungen erleuchten könnte.
[Inline Assembler] Wo liegt der Fehler?
04/11/2010 - General Coding - 8 Replies
Hi, ich arbeite seit gestern mit Assembler (inline Assembler). Grundsachen wie Rechnen und einfache Schleifen kann ich schon, aber an diesem nicht sinnvollen Beispiel (das ich nur zum üben nehme :D) bekomme ich einen Zugriffsfehler. Warum? function Test(x: integer): Integer; assembler; asm PUSH EAX; MOV EAX, X; //Kopiere einen beliebigen Wert in EAX MOV EDX, 30; //kopiere 30 in EDX CMP EAX, 20; //WENN EAX = 20 DANN JE @Start; //Springe zu Start CDQ; //EAX auf...
[Request] Some help with Inline asm in C++
09/08/2008 - CO2 Programming - 3 Replies
I'm trying to read a "string" (not necessarily human readable characters) that may also contain 0x00's using an injected dll. Is there a way to (efficiently) copy a string of a length that can be up to 400 bytes or so into a c++ variable? I have a pointer to the memory location inside EDI.



All times are GMT +2. The time now is 04:08.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.