|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
|
|