鱼C论坛

 找回密码
 立即注册
查看: 2126|回复: 2

[技术交流] 教你制作用debug执行的程序!!

[复制链接]
发表于 2012-6-23 13:29:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
其实这个东西学汇编学到一定的程度自己就能弄出来了,但这一般可能需要比较长的时间,所以献丑做了这个教程

首先,最好使用汇编语言编写DOS程序,Windows的程序也可以写,但是那种用DEBUG弄出来的Windows程序其实只是借用了DEBUG的一些功能而已,我不会弄,谁会弄写个教程吧
其次,必须把握好程序中的段,因为在exe程序中,段的值是会重定向的,所以绝对不能使用类似 mov ds,段名 的指令,取而代之的是通过当前的CS来给其他的段寄存器赋值
还有一点是整个程序最好只使用一个段,这个不是绝对的,主要是这样方便处理
下面就以一个相当经典的"Hello World!"来演示一下:
首先,将以下源码用masm5(如果你会用其他的也可以用其他的)编译成exe:
     assume     cs:code

code     segment
msg     db     "Hello World!","$"

start:
     mov     ax,cs
     mov     ds,ax

     mov     ah,09H
     mov     dx,offset msg
     int     21H

     mov     ah,07H
     int     21H

     mov     ax,4C00H
     int     21H

code     ends

     end     start

然后用DEBUG加载你编译好的exe,用u命令看一下第一条和最后一条指令的的位置:
0B61:000D 8CC8           MOV      AX,CS
0B61:000F 8ED8           MOV      DS,AX
0B61:0011 B409           MOV      AH,09
0B61:0013 BA0000         MOV      DX,0000
0B61:0016 CD21           INT      21
0B61:0018 B407           MOV      AH,07
0B61:001A CD21           INT      21
0B61:001C B8004C         MOV      AX,4C00
0B61:001F CD21           INT      21
好了,程序是在D那里开始,1F那里的CD21结束的
你可能发现第一条指令的偏移地址不是0,那是因为前面有一些数据
然后使用 dcs:0 命令,显示代码段的数据:
0B61:0000   48 65 6C 6C 6F 20 57 6F-72 6C 64 21 24 8C C8 8E    Hello World!$...
0B61:0010   D8 B4 09 BA 00 00 CD 21-B4 07 CD 21 B8 00 4C CD    .......!...!..L.
0B61:0020   21 01 00 EB 60 26 8A 47-01 32 E4 40 D1 E0 03 D8    !...`&.G.2.@....
0B61:0030   26 8A 0F 32 ED 0B C9 74-0F 43 53 26 8B 1F E8 C6    &..2...t.CS&....
再然后使用DOS窗口的标记功能将数据复制出来:
左键单击DOS窗口左上角的那个图标,在菜单里选 编辑->标记
然后你就可以在DOS里框选要复制的文本了
在这个例子里你可以将前三行框选起来:
48 65 6C 6C 6F 20 57 6F-72 6C 64 21 24 8C C8 8E
D8 B4 09 BA 00 00 CD 21-B4 07 CD 21 B8 00 4C CD
21 01 00 EB 60 26 8A 47-01 32 E4 40 D1 E0 03 D8
按回车键,确定复制
之后再新建一个记事本(在桌面上右键单击,新建->文本文档就行了),将复制好的内容粘贴到记事本里,将第三行21之后的东西删除,再将段横换成空格,再将数据整成一行:
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 24 8C C8 8E D8 B4 09 BA 00 00 CD 21 B4 07 CD 21 B8 00 4C CD 21
然后就是关键的东西了--将这些数据改写成可以将这些数据写入cs:0的命令,只需再前面添一点东西就行了,注意这个ecs:0一定要独占一行:
ecs:0
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 24 8C C8 8E D8 B4 09 BA 00 00 CD 21 B4 07 CD 21 B8 00 4C CD 21
最后,由于这个程序不是从cs:0开始执行的,所以要修改一下IP,修改的值在前面已经记下了,是D,其实把数据定义在后面就不用这步了,这个属于个人习惯,最后让程序运行起来,用g就行了:
ecs:0
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 24 8C C8 8E D8 B4 09 BA 00 00 CD 21 B4 07 CD 21 B8 00 4C CD 21
rip
d
g
好了,大功告成,将上面的代码复制到DEBUG就可以看到效果了

另外说一下,如果你知道EXE文件的文件结构(其实DOS里面的EXE挺简单,512字节之后就是了),可以直接用UE等二进制编辑器直接获取指令的十六进制机器码和数据,再另外如果数据比较多的话,可以灵活的运用UE的替换功能修改数据,Word什么的也可以

如果关于这个有不懂的地方欢迎跟帖提问,如果在我能力之内我会尽力的


转帖地址:http://tieba.baidu.com/p/773048643

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-6-23 13:31:22 | 显示全部楼层
这个是转帖的,大家分享一下。。。:D
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-23 15:34:57 | 显示全部楼层
看看!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-20 08:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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