VerySource

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

由.exe 转换为 .com文件问题?

[复制链接]

3

主题

10

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-1-27 22:00:01 | 显示全部楼层 |阅读模式
exe2bin.exe 制作 驻留内存的.com文件.

在dos下敲入命令行:  exe2bin.exe  D:\A(待转换文件)

但结果提示:File cannot be converted

请问:是怎么回事啊?
回复

使用道具 举报

0

主题

23

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-2-23 20:00:01 | 显示全部楼层
文件不能被转换, 即你的 .exe 不满足 .com 的条件. 要能被转换为 .com, .exe 必须满足两个条件, 一个是程序是从 0100h 处开始执行的; 另外就是不能有段址的引用, 如  mov  ax, DataSeg 这样的
回复

使用道具 举报

3

主题

10

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
 楼主| 发表于 2020-3-12 21:45:02 | 显示全部楼层
多谢www_james对我提出的所有问题的回复,谢谢啦!

转.com文件的问题,已经成功,但奇怪,我的源程序中包含了   
     mov word ptr old_print[2],es  ; 段地址
也成功转换了啊!

在此希望和www_james(当然也包括能帮我解惑的朋友),具体讨论一下:

1、我所有的问题都是围绕一个中心的,修改17h中断服务程序,并使之永远有效!

2、我现在的.com文件是一个内存驻留程序,把17h的中断地址修改,希望之后的所有程序,只要调用 int 17h,则进入我的新的入口程序.

3、问题是,只要我编写的程序一结束,再用别的汇编程序调用int 17h,则又跑到原来的中断服务程序去执行了!!

请看看我的代码,是否有错呢?

cseg segment
    assume cs:cseg,ds:cseg
    org 100h
   
start:
    JMP Initialize
    old_print dd ?

new_print proc far     ;新的中断服务程序入口
    assume cs:cseg,ds:cseg
    STI   
    pushf
    assume ds:nothing
    push ax
    push dx   
    mov al,'M'
    mov ah,0
    mov dx,0
    call dword ptr old_print
    pop dx
    pop ax
    popf
    NOP
    IRET
new_print endp

Initialize:
    assume cs:cseg,ds:cseg
    mov bx,cs
    mov ds,bx
    mov al,17h    ;保存原中断向量
    mov ah,35h
    int 21h
    mov word ptr old_print,bx
    mov word ptr old_print[2],es

    mov dx,OFFSET new_print  ;置新的中断向量
    mov al,17h
    mov ah,25h
    int 21h

    mov dx,offset Initialize
    int 27h   ;将标签Initialize前的程序驻留内存
   
cseg ends
    end start

再次感谢了啊!



回复

使用道具 举报

0

主题

15

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-3-20 22:00:01 | 显示全部楼层
你是想改v8086中的中断地址么?
回复

使用道具 举报

0

主题

23

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-3-28 20:45:01 | 显示全部楼层
> 转.com文件的问题,已经成功,但奇怪,我的源程序中包含了   
>      mov word ptr old_print[2],es  ; 段地址
> 也成功转换了啊
不是说 .com 文件中不能使用 es 这样的段寄存器, 而是不能引用自己程序段的段址. 这是因为程序段的段址, 由于程序被加载到内存中时, 由于起始地址的不同, 也会有不同. 所以, dos 会根据加载的基址对其调整, 使其引用正确. 这个就是所谓的 exe 程序的重定位. com 文件就没有重定位项, 所以也不能有对段的引用. 其它方式对段寄存器的使用都是可以的. 比如:
  mov  ax, 0b800h
  mov  es, ax

上面的那个代码, 是有个问题:
new_print proc far     ;新的中断服务程序入口
    assume cs:cseg,ds:cseg
    STI   
    pushf
    assume ds:nothing
    push ax
    push dx   
    mov al,'M'
    mov ah,0
    mov dx,0
    pushf      ;*+  需用这个指令. 如同 int17h 一样, 标记寄存器需用压栈的
    call dword ptr old_print
    pop dx
    pop ax
    popf
    NOP
    IRET
new_print endp

另外, 这个代码的驻留功能是正常的吧. 我在 xp 的 dos 窗口下直接运行了, 再进 debug 查看 0:5c 处的 int17h 的中断向量, 是指向这段代码的.
不过, 看过你的另外的帖子, 要求以此修改打印的内容. 这个, 恐怕不能这么实现的. 一般来说, 打印功能, 通过 int17h 来发送数据的, 可能比较少吧, 还是直接传送到打印端口比较有效率. 所以, 通过拦截 int17h 可能难以达到原来设想的目的
回复

使用道具 举报

0

主题

23

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-4-9 14:00:02 | 显示全部楼层
如果是要视图拦截 Windows 的打印数据的话, 通过 int17h 肯定是没有丝毫用处的. Windows 下的 dos 窗口提高的这些功能, 都是临时模拟出来的. 不过, 如何实现你的要求, 我也不了解, 没有做过这方面的内容.
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-4-14 22:15:01 | 显示全部楼层
楼主想做的功能肯定能实现,不过要写Windows驱动而不是Dos驱动。
回复

使用道具 举报

0

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-4-18 10:15:01 | 显示全部楼层
DOS 下不行,需要写windows的driver
回复

使用道具 举报

3

主题

10

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
 楼主| 发表于 2020-4-19 14:45:01 | 显示全部楼层
谢谢大家的回复!

也就是说,我现在即使在保护模式下写汇编程序,修改 int 17h的方式,是不可能实现的了!对吧!

有关windows驱动,了解这方面内容的朋友,能否稍微具体指点迷津,给我个方向,好去动手做.

再次感谢了!
回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-5-11 11:00:01 | 显示全部楼层
下 DDK , 看例程, 写驱动还是满简单的 ....

回复

使用道具 举报

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

本版积分规则

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

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