VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 44|回复: 10

windows保护模式下,编译器&&读取中断描述符表?

[复制链接]

3

主题

10

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2020-3-16 02:30:01 | 显示全部楼层 |阅读模式
windows下可否读取到某中断的入口地址? 类似于dos下的*4. 是否读取到也是不可修改的啊!

没办法,老板一定要求读取该地址,去修改.

windows下的汇编和dos下所用的编程环境不同吧? 该用什么编译器呢?

谢谢!
回复

使用道具 举报

1

主题

5

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2020-6-16 15:30:02 | 显示全部楼层
除非你的程序可以运行在ring0级,要不是不允许修改的。读的话就不清楚。
回复

使用道具 举报

0

主题

10

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2020-6-20 11:15:01 | 显示全部楼层
windows下可以操作,编译器可以选择  masm32
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2020-7-18 14:15:01 | 显示全部楼层
没看懂。

是有API支持读取么???还是直接找描述符表的位置???或者有固定的入口地址???
回复

使用道具 举报

0

主题

4

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2020-7-18 15:15:01 | 显示全部楼层
参看《保护模式下的80386编程》或Intel 手册(Intel网站上可以下载)第一卷
98下课可以直接读写,例如下列汇编程序就改写了中断:
.386
    .model flat, stdcall
option casemap: none

include     windows.inc
include     kernel32.inc
include     user32.inc

INTNUM      equ     9

includelib  kernel32.lib
includelib  user32.lib

.data
szAppName   db "Ring0 Try--using IDT",0
szFormat    db "My INT %u handler return the value of CRO: %08X",0
szMsg       db 512 dup(0)

IDTR        df 0
OldGate     dq 0
MyGate      dw 0
            dw 28h
            dw 0EE00h
            dw 0

.code

start:

    ;construct my call gate
    mov     eax, IntHandler
    mov     MyGate, ax
    shr     eax, 16
    mov     [MyGate+6], ax

    ;save old IDT
    sidt    IDTR
    mov     ebx, dword ptr [IDTR+2]   
    add     ebx, 8*INTNUM
    push    ebx
    mov     esi, ebx
    mov     edi, offset OldGate
    cld
    movsd
    movsd

    ;modify IDT
    mov     edi, ebx
    mov     esi, offset MyGate
    cli
    movsd
    movsd

    ;interrupt!
    sti
    int     INTNUM

    ;restore IDT
    pop     edi
    mov     esi, offset OldGate
    cli
    movsd
    movsd
    sti   

    ;OK!
    invoke wsprintf, addr szMsg, addr szFormat, INTNUM, eax
    invoke MessageBox, NULL, addr szMsg, addr szAppName, MB_OK
   
    invoke ExitProcess, 0

IntHandler:
    mov eax, cr0
    iretd

end start

但NT/2000/XP不行,需要编写内核驱动才行
回复

使用道具 举报

0

主题

4

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2020-7-18 15:45:01 | 显示全部楼层
编译器使用微软的masm32即可
回复

使用道具 举报

3

主题

10

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2020-7-18 23:30:01 | 显示全部楼层
看到大家的回复,非常感谢啊!我去尝试一下

其实,我的最终目的是希望,能够修改 int 17h(打印中断)的入口地址,使得在windows下,只要有打印动作发生,则进入我的中断服务程序,修改打印内容.

不知道,windows下,通过这样的方式能否实现呢?也就是说,windows下,打印是否会触发int 17h中断呢?

再次感谢大家的关注啊!
回复

使用道具 举报

0

主题

4

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2020-7-21 16:00:02 | 显示全部楼层
看样子LZ没能摆脱DOS的影响。你应该编写一个打印驱动,插入Windows的驱动栈中,而不是什么中断
回复

使用道具 举报

3

主题

10

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2020-7-21 20:00:01 | 显示全部楼层
是啊!陷入dos的思维了!

其实,主要还是对windows不熟悉其工作原理,从未接触过有关内核的内容! 请各位谅解啊!

renzichao: 有关写打印驱动的内容,可否指点一下啊!入个门好下手! 多谢了!
回复

使用道具 举报

0

主题

4

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2020-7-29 00:30:01 | 显示全部楼层
Windows内核驱动很复杂,网上有不少基础介绍,MS也有专门的资料。不过很贵,几百元吧。
WDM(Windows Diver Model)以IRP(Interrupt Request Package)处理中心,类似Windows应用以消息处理为中心,驱动与系统相互交户完成任务。
如果你对Windows体系结构不熟悉,恐怕很难开发打印驱动这种难度较大的东西,如果时间很紧,建议找人帮助吧。如果有时间,慢慢学。如果你基础好,肯努力,半年入门是至少的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2020|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表