Toon posts:

[Assembly]Hoe interrupt handler installeren?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor het installeren van een nieuwe interrupt handler in dos kan je gebruik maken van 21h maar hoe doe je dat als er geen besturingsysteem aanwezig is maw hoe installeer je een interrupt handler in real mode?
Groeten.

Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Verwijderd schreef op vrijdag 06 februari 2009 @ 20:30:
Voor het installeren van een nieuwe interrupt handler in dos kan je gebruik maken van 21h maar hoe doe je dat als er geen besturingsysteem aanwezig is maw hoe installeer je een interrupt handler in real mode?
Groeten.
Rechtsteeks de pointers overschrijven in het interrupt gebied zodat ze naar de proc wijzen die aangeroepen moet worden. Ik geloof dat die op 0040:0000 beginnen ofzo, maar dit is meer een gok dan dat ik het (nog) weet...

--Edit:
Excuses, de interrupt vector table eindigt op 0040:0000 (= 0000:0400), hij begint op 0000:0000.

The bottom 1K (1024 bytes) of system memory is devoted to the storage of interrupt vectors. An interrupt vector is a 4-byte value of the form offset:segment, which represents the address of a routine to be called when the CPU receives an interrupt.
http://support.microsoft.com/kb/71486

En als je een beetje had gegoogled had je deze pagina ook kunnen vinden. :)

[ Voor 35% gewijzigd door MrBucket op 06-02-2009 20:49 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dus daar schrijf je het segment en de offset waar de processor moet naar toe springen? klopt dat?
Omdat ik ooit in dos een nieuwe handler heb geïnstalleerd dacht ik dat er voor gewoon in real mode een bijhorende dos interrupt moest bestaan, het is dus voldoende dat daar het adres staat? Groeten.

Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Verwijderd schreef op vrijdag 06 februari 2009 @ 21:02:
dus daar schrijf je het segment en de offset waar de processor moet naar toe springen? klopt dat?
Omdat ik ooit in dos een nieuwe handler heb geïnstalleerd dacht ik dat er voor gewoon in real mode een bijhorende dos interrupt moest bestaan, het is dus voldoende dat daar het adres staat? Groeten.
Yup. Als je hardwarematige interrupts wil gaan afvangen moet je er wel voor zorgen dat je tijdens het omklussen van je interrupt vector table de hardwarematige interrupts even uitschakelt (zie mijn 2e link), anders kon je nog wel eens in de problemen komen.

Dit is trouwens ook makkelijk vanuit DOS uit te proberen. Overschrijf de vector voor een ongebruikte interrupt (bijv. B0) met het adres van een eigen proc, en gebruik de INT instructie (dus INT B0h) om het aan te roepen.

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Vroeger kon je daar ook virus scanners mee omzeilen; die dos call werd afgevangen en dan werd je programma gevlagd vanwege interrupt vectoren veranderen, maar als je indirect via een register naar het onderste gedeelte van je geheugen schreef kon hij dat niet zien :)

Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Zoijar schreef op vrijdag 06 februari 2009 @ 21:47:
Vroeger kon je daar ook virus scanners mee omzeilen; die dos call werd afgevangen en dan werd je programma gevlagd vanwege interrupt vectoren veranderen, maar als je indirect via een register naar het onderste gedeelte van je geheugen schreef kon hij dat niet zien :)
M.a.w.: de virusscanner had waarschijnlijk zelf int 21h gehooked. Slechte zaak eigenlijk, in mijn beleving waren de meeste virussen van die tijd toen ook al niet zo netjes om alles aan het OS te vragen.
Zeker niet als je zonder problemen overal bij komt... :P

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Heb de code nog gevonden, uit 1996 :) Gebruikte dit voor calls:

GAS:
1
2
3
4
5
Call_INT   MACRO o 
   pushf
   db   26h,0ffh,1eh
   dw   o * 4
ENDM

Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Zoijar schreef op vrijdag 06 februari 2009 @ 21:59:
Heb de code nog gevonden, uit 1996 :) Gebruikte dit voor calls:

GAS:
1
2
3
4
5
Call_INT   MACRO o 
   pushf
   db   26h,0ffh,1eh
   dw   o * 4
ENDM
code:
1
2
26            ES:
FF1Eoooo      CALL    FAR o

Er vanuitgaande dat ES op 0 staat, roep je de betreffende interrupt dus rechtstreeks aan via de interrupt table? Maakt dat een verschil met "Int o" dan?

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:37

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op vrijdag 06 februari 2009 @ 20:30:
Voor het installeren van een nieuwe interrupt handler in dos kan je gebruik maken van 21h maar hoe doe je dat als er geen besturingsysteem aanwezig is maw hoe installeer je een interrupt handler in real mode?
Groeten.
Eeeh, een vraag stellen is prima maar we verwachten hier wel dat je zelf ook al wat hebt geprobeerd en dat je dat ook aangeeft. Dus: heb je hier zelf al informatie over gevonden? Wat lukte daar niet mee? etc.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Eeeh, een vraag stellen is prima maar we verwachten hier wel dat je zelf ook al wat hebt geprobeerd en dat je dat ook aangeeft. Dus: heb je hier zelf al informatie over gevonden? Wat lukte daar niet mee? etc.
Ik borduurde verder op mijn kennis die ik had van het installeren van interrupt handler in dos daar ga je de eigenlijke installatie doen mbv een int 21h
En omdat ik nu zonder os werk dacht ik nu dat je hiervoor een bios interrupt nodig zou hebben daarop heb ik dan gegoogeld maar dat leverde niets nuttig op omdat ik volledig verkeerd zat.
Bedankt voor de hulp.

Stel nu het volgende: ik laad een stuk data in vanaf diskette en ik zet dat ik een bepaald segment met een bepaalde offset (dat heb ik bijgeleerd met het vorige topic)
nu weet ik dat offset en segment in het geheugen moet gaan schrijven voor de handlers te activeren.
In het stuk code kan ik voor installatie van mijn handler gebruik maken van de functie seg die mij het segment terug geeft van een procedure maar klopt dit segment wel? maw ik heb zelf de code in een welbepaalde plaats geladen hoe kan ik nu vanuit die code te weten komen waar ik zit ga de functie seg het juiste segment terug geven of enkel een relatief segment binnen de code?
Vroeger had ik hier geen problemen mee omdat ik toen altijd werkte met één grootte file met daarin al de code plus een besturingssysteem die alles inlaadde.
Groeten.

Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Sommige van je vragen zijn redelijk basic (voor zover je assembly 'basic' kunt noemen ;) ), vind ik. Op welke manier leer je jezelf assembly programmeren? Gebruik je alleen de informatie die je op internet kunt vinden, of heb je ook nog boeken over assembly?

Als je nog geen goed boek hebt over assembly programmeren, dan denk ik dat Peter Norton's Assembly Language for the IBM PC een erg goed boek is om een solide basis te krijgen. Tenminste, zo heb ik het destijds geleerd. Want als je voor elk wissewasje een vraag moet stellen hier, dan gaat het leren niet bijzonder snel...

Bol.com biedt 'm nog 2e hands aan, zo te zien.

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Verwijderd schreef op zaterdag 07 februari 2009 @ 12:29:
In het stuk code kan ik voor installatie van mijn handler gebruik maken van de functie seg die mij het segment terug geeft van een procedure maar klopt dit segment wel? maw ik heb zelf de code in een welbepaalde plaats geladen hoe kan ik nu vanuit die code te weten komen waar ik zit ga de functie seg het juiste segment terug geven of enkel een relatief segment binnen de code?
Tenzij je de code in dat specifieke segment gaat laden, nee. Je moet relocatie doen, maw al je pointer kloppen niet meer en je moet ze aanpassen aan een nieuwe offset. Je offset kan je zo vinden (wederom ook een virus truckje...):

GAS:
1
2
3
4
  call  delta
delta:  
  pop   bp
  sub   bp,offset delta                ;store delta offset in BP


Als je de code rechtstreeks compiled dan is BP=0, maar omdat je compiler het adres van "delta" statisch bepaalt en de return waarde van de call dynamisch is, levert dit precies het verschil in code locatie op als je de code ergens anders laad. Wanneer je dan later bv een string uit geheugen wilt afbeelden, dan programmeer je dat bv zo:

GAS:
1
2
3
4
  mov   ah,09
  lea   dx,message
  add   dx,bp
  int   21h
MrBucket schreef op vrijdag 06 februari 2009 @ 22:11:
Er vanuitgaande dat ES op 0 staat, roep je de betreffende interrupt dus rechtstreeks aan via de interrupt table? Maakt dat een verschil met "Int o" dan?
Geen verschil, alleen een iets ander code pad op hardware niveau. Waarschijnlijk is die rechstreekse call sneller. Plus dat je geen herkenbare interrupt instructie genereerd...... en er zijn geloof ik wat restricties als je in een interrupt handler bezig bent (int instructie). Ik dacht dat je dan alleen lagere interrupts kon genereren vanuit die handler. Dus als een custom INT 10h handler een int 21h dos call wil maken, dan kan je niet een int 21h gebruiken, maar moet je het zo doen.

[ Voor 23% gewijzigd door Zoijar op 07-02-2009 13:15 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoijar schreef op zaterdag 07 februari 2009 @ 13:08:
Ik dacht dat je dan alleen lagere interrupts kon genereren vanuit die handler. Dus als een custom INT 10h handler een int 21h dos call wil maken, dan kan je niet een int 21h gebruiken, maar moet je het zo doen.
Geen idee waar je dat vandaan haalt. Software interrupts kun je gewoon nesten :). Voor IRQ's geldt dat lagere IRQ's voorrang hebben op hogere, en bovendien wordt de interrupt flag automatisch gecleared in je handler zodat andere IRQ's er niet doorheen kunnen komen.

Bovendien bypass je met jouw methode de protected mode handlers als je in virtual 86 mode zit. Op de standaard plek in de interrupt table hoeft dan ook niet eens wat zinnigs te staan. Een fatsoenlijke DOS extender haalt in z'n protected mode handler wel data uit de interrupt table om dat aan te roepen, maar dat hoeft niet per se.

[ Voor 8% gewijzigd door .oisyn op 07-02-2009 13:39 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Zoijar schreef op zaterdag 07 februari 2009 @ 13:08:
[...]
Geen verschil, alleen een iets ander code pad op hardware niveau. Waarschijnlijk is die rechstreekse call sneller. Plus dat je geen herkenbare interrupt instructie genereerd......
Ah, ok. Je hebt je asm-kennis toch niet toevallig door het schrijven van een virusje he? :P
en er zijn geloof ik wat restricties als je in een interrupt handler bezig bent (int instructie). Ik dacht dat je dan alleen lagere interrupts kon genereren vanuit die handler. Dus als een custom INT 10h handler een int 21h dos call wil maken, dan kan je niet een int 21h gebruiken, maar moet je het zo doen.
Ik kan me wel voorstellen dat het niet verstandig is om in een int 10h handler een DOS-call (int 21h) te doen, omdat 21h functionaliteit biedt die mogelijk zelf gebruik maakt van int 10h, waardoor je in een recursieve loop terecht kan komen.

Maar er zijn geen fysieke beperkingen hierop volgens mij, en ook de manier van aanroep (INT of rechtstreekse PUSHF + FAR CALL) maakt volgens mij geen verschil.

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

.oisyn schreef op zaterdag 07 februari 2009 @ 13:37:
Geen idee waar je dat vandaan haalt. Software interrupts kun je gewoon nesten :). Voor IRQ's geldt dat lagere IRQ's voorrang hebben op hogere, en bovendien wordt de interrupt flag automatisch gecleared in je handler zodat andere IRQ's er niet doorheen kunnen komen.
Zo iets stond me bij. Een TSR op int 10h kon volgens mij geen int 21h genereren in code. Misschien vergis ik me; is ook al weer 13 jaar geleden :P
Bovendien bypass je met jouw methode de protected mode handlers als je in virtual 86 mode zit. Op de standaard plek in de interrupt table hoeft dan ook niet eens wat zinnigs te staan. Een fatsoenlijke DOS extender haalt in z'n protected mode handler wel data uit de interrupt table om dat aan te roepen, maar dat hoeft niet per se.
Ik had het uiteraard over de standaard real-mode als je boot. Protected mode moet je sowieso je eigen IDT opzetten etc.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoijar schreef op zaterdag 07 februari 2009 @ 13:55:
Ik had het uiteraard over de standaard real-mode als je boot. Protected mode moet je sowieso je eigen IDT opzetten etc.
Wat ik bedoel is dat als je in virtual 86 mode zit (als je app bijv. gewoon in een DOS omgeving draait), en je doet een call far [0:intnum*4], dat dat niet dezelfde bijwerkingen heeft als een int intnum zonder dat je dat zelf doorhebt. Wat dat betreft is het dus onverstandig om direct de call te doen :). Voor de TS gaat dit idd niet op.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

.oisyn schreef op zaterdag 07 februari 2009 @ 14:03:
Wat ik bedoel is dat als je in virtual 86 mode zit (als je app bijv. gewoon in een DOS omgeving draait), en je doet een call far [0:intnum*4], dat dat niet dezelfde bijwerkingen heeft als een int intnum zonder dat je dat zelf doorhebt. Wat dat betreft is het dus onverstandig om direct de call te doen :). Voor de TS gaat dit idd niet op.
Oh ok. Je gaat dan idd eerst via een ring 0 interrupt gate, en die kan op zijn beurt weer een (oude/legacy) ring 3 handler aanroepen. Die kan overal staan. Ook heb je kans dat je uberhaupt geen rechten hebt om die call rechstreeks te maken. Ligt aan de opzet. Naja... boeien ;) Ach, ik heb de 80386 PRM weer eens uit de kast hehe. M'n mooiste boek van vroeger... zo veel van geleerd toendertijd. Wel lastig lezen...
MrBucket schreef op zaterdag 07 februari 2009 @ 13:53:
Ah, ok. Je hebt je asm-kennis toch niet toevallig door het schrijven van een virusje he? :P
Nee, maar nadat ik die kennis had opgedaan heb ik wel eens een poging gewaagd. Interessante code vaak.

[ Voor 15% gewijzigd door Zoijar op 07-02-2009 14:25 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
[quote]
Sommige van je vragen zijn redelijk basic (voor zover je assembly 'basic' kunt noemen ), vind ik. Op welke manier leer je jezelf assembly programmeren? Gebruik je alleen de informatie die je op internet kunt vinden, of heb je ook nog boeken over assembly?
[/qoute]

Ik heb een boek programming the 80386 van john H.Crawford en Patrick P. Gelsinger
Verder heb ik ook een semseter cursus hierover gehad en een projectje gemaakt (tetris in assembly) maar dat was allemaal in een dos omgeving. Groeten.
Pagina: 1