|
You last visited: Today at 04:07
Advertisement
Interrupts in Inline Assembler
Discussion on Interrupts in Inline Assembler within the General Coding forum part of the Coders Den category.
03/22/2011, 17:56
|
#1
|
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
}
}
|
|
|
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.
|
|
|
03/22/2011, 18:08
|
#3
|
elite*gold: 1
Join Date: Feb 2009
Posts: 1,726
Received Thanks: 729
|
Hab es unter Win7 x64 getestet.
|
|
|
03/22/2011, 18:16
|
#4
|
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?
|
|
|
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.
|
|
|
03/22/2011, 18:24
|
#6
|
elite*gold: 1
Join Date: Feb 2009
Posts: 1,726
Received Thanks: 729
|
Quote:
Originally Posted by Akorn
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
|
|
|
03/22/2011, 18:40
|
#7
|
elite*gold: 0
Join Date: Mar 2008
Posts: 747
Received Thanks: 245
|
Quote:
Originally Posted by HardCore.1337
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.
|
|
|
03/22/2011, 18:45
|
#8
|
elite*gold: 1
Join Date: Feb 2009
Posts: 1,726
Received Thanks: 729
|
Ok, hätte nicht gedacht das es so kompliziert wird
|
|
|
03/22/2011, 19:10
|
#9
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,913
Received Thanks: 25,413
|
Quote:
Originally Posted by Akorn
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?
|
|
|
03/22/2011, 23:42
|
#10
|
elite*gold: 0
Join Date: Mar 2008
Posts: 747
Received Thanks: 245
|
Quote:
Originally Posted by MrSm!th
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
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.
|
|
|
|
03/23/2011, 11:57
|
#11
|
elite*gold: 1
Join Date: Feb 2009
Posts: 1,726
Received Thanks: 729
|
Find ich aber relativ schade das die Interrupts verschwinden
|
|
|
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.
|
|
|
03/23/2011, 15:49
|
#13
|
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
|
|
|
 |
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.
|
|