教你制作可以用DEBUG执行的程序
debug吧
全部回复
仅看楼主
level 5
文刀舍予 楼主
其实这个东西学汇编学到一定的程度自己就能弄出来了,但这一般可能需要比较长的时间,所以献丑做了这个教程
首先,最好使用汇编语言编写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什么的也可以
如果关于这个有不懂的地方欢迎跟帖提问,如果在我能力之内我会尽力的
2010年05月16日 16点05分 1
level 5
文刀舍予 楼主
写的太好了,LZ我崇拜你[害羞]
2010年05月16日 16点05分 2
level 6
写的太好了,LZ我崇拜你[害羞]
2010年05月16日 16点05分 3
level 0
好精彩!!!佩服LZ。
2010年05月17日 02点05分 4
level 5
文刀舍予 楼主
回复:5楼
DEBUG写不了批处理
用批处理:
shutdown -r -t 0 重启
shutdown -s -t 0 关机
你问的问题和我说的东西有关系么?
2010年05月22日 16点05分 6
level 6

-e100 'shutdown -r -t 0'
-rcx
CX 0000
:10
-n reboot.bat
-w
Writing 00010 bytes
2010年05月23日 04点05分 7
level 5
文刀舍予 楼主
回复:7楼
用你那种方法什么东西都能写出来了[汗]
2010年06月09日 12点06分 8
level 1
学习。。。
2010年06月12日 10点06分 9
level 1
回复:2楼
[瀑布汗~]
2010年06月15日 09点06分 10
level 1
将第三行21之后的东西删除
==
为何从这里删除?
很多细节的原理没有讲,很难去自己变通啊。
2010年08月07日 18点08分 11
level 0
回复:11楼
注意看u命令反汇编出来的东西每一行地址后面的机器码.
2010年08月11日 14点08分 12
level 1
太好了 崇拜
2010年12月15日 06点12分 14
level 1
学习了
2011年06月11日 17点06分 16
level 1
哇哈哈
2011年09月10日 15点09分 17
level 1
b9 0b 00 bb 11 01 b4 02 8a 17 cd 21 43 e2 f9 cd
20 48 65 6c 6c 6f 20 57 6f 72 6c 21
2012年04月05日 22点04分 18
level 1
b1 0c bb 10 01 b4 02 8a 17 cd 21 43 e2 f9 cd 20
48 65 6c 6c 6f 20 57 6f 72 6c 64 21
2012年04月05日 23点04分 19
level 1
ba 09 01 b4 09 cd 21 cd 20 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 24
2012年04月06日 00点04分 20
level 6
实际的原理:
其实就是取U中最后一个啦……很难讲哦!
2012年05月12日 14点05分 21
level 3
哈哈,好厉害啊,,
2012年11月03日 07点11分 24
1 2 尾页