此为汇编程序初级帖,主要提及了机器码与汇编指令间的转换,汇编与反汇编的应用,以下是给出的操作实例
重要一点: 是汇编与批处理的结合,从而使批处理可以直接查看内存!
经过几天的观察 终于发现了其中的猫腻(:
其代码用批处理执行如下:复制代码 因为我们很多人对汇编不了解,所以对这段仅仅64k的代码众说纷纭.
下面引用 一段极其精短的汇编代码进行分析:- more +1 %~s0|debug
- e100 B0 13 CD 10 C4 2F AA 13 C7 64 13 06 6C 04 50 B4 01 CD 16 58 74 F0 B8 03 00 CD 10 C3
- g
复制代码 此段代码,为什么可以被执行呢?它到底是怎么被执行的?
其实这些是机器码,被植入内存后由机器来执行
那么我们用汇编怎么写呢?
接下来我们将其 反汇编就可以看到其中的猫腻了
先将此段代码加入到内存 使用debug的u命令来反汇编(赎不详述) 结果如下:- a100
- MOV AL,13
- INT 10
- LES BP,[BX]
- STOSB
- ADC AX,DI
- DB 64
- ADC AX,[046C]
- PUSH AX
- MOV AH,01
- INT 16
- POP AX
- JZ 0106
- MOV AX,0003
- ADD [BX+SI],AL
- ADD [SI],DH
- ADD [BX+13],CL
复制代码 这下可以看出来 编程高手的作品并不是天书 他们只是省略了第三方工具 直接通过机器码来编译而已(如果不用机器码 想必应该很长吧...)
好了 让我们再运行一下反汇编出来的这一小段程序,看看结果一样吗?
再说下 如何将汇编语言转换成机器码的方法
网上有很多工具 但是我在这里只说下怎么用debug(因为大家都有)来转译:
使用我们刚才转换过来的下列代码 用u命令再将其转换回去 看下结果:- a100
- MOV AL,13
- INT 10
- LES BP,[BX]
- STOSB
- ADC AX,DI
- DB 64
- ADC AX,[046C]
- PUSH AX
- MOV AH,01
- INT 16
- POP AX
- JZ 0106
- MOV AX,0003
- ADD [BX+SI],AL
- ADD [SI],DH
- ADD [BX+13],CL
-
- u
复制代码 结果如下:- 1360:0100 [color=Red]B013 [/color]MOV AL,13
- 1360:0102 [color=Red]CD10 [/color]INT 10
- 1360:0104 [color=Red]C42F [/color]LES BP,[BX]
- 1360:0106 [color=Red]AA [/color]STOSB
- 1360:0107 [color=Red]11F8 [/color]ADC AX,DI
- 1360:0109 [color=Red]64 [/color]DB 64
- 1360:010A [color=Red]13066C04 [/color]ADC AX,[046C]
- 1360:010E [color=Red]50 [/color]PUSH AX
- 1360:010F [color=Red]B401 [/color]MOV AH,01
- 1360:0111 [color=Red]CD16 [/color]INT 16
- 1360:0113 [color=Red]58 [/color]POP AX
- 1360:0114 [color=Red]74F0 [/color]JZ 0106
- 1360:0116 [color=Red]B80300 [/color]MOV AX,0003
- 1360:0119 [color=Red]0000 [/color]ADD [BX+SI],AL
- 1360:011B [color=Red]0034 [/color]ADD [SI],DH
- 1360:011D [color=Red]004F13 [/color]ADD [BX+13],CL
复制代码 对比以下红色字体与以下原始代码:
B0 13 CD 10 C4 2F AA 13 C7 64 13 06 6C 04 50 B4 01 CD 16 58 74 F0 B8 03 00 CD 10 C3
基本一致(可能是因为我们反复转化几次后产生的结果) 但是方法很清楚了,避免反复操作就可以了
机器码会省略a100的默认开始地址 我们要使用通过机器码转换后的汇编程序需要加上a100 (如上) 不然反汇编出错.
接下来该大家自己操作了:
留道家庭作业题:
批处理输入密码但不显示字符的代码
中有段代码:- hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x
复制代码 现在利用以上技巧 理解怎样设计此类程序,并将其编译成汇编语言
- hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x
复制代码 我们想让这段代码跟 世界第一编程高手写的天书那样子 怎么弄呢?
跟我来转换一下吧:- more +1 %~s0|debug>>ascii.txt
- a100
- DB 'hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x'
-
- d100
复制代码 我们先利用debug将其转换成十六进制机器码
结果如下:
Invalid keyboard code specified
-a100
1360:0100 DB 'hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x'
1360:012C
-d100
1360:0100 68 50 31 58 35 30 30 50-5B 50 5A 42 42 42 66 68 hP1X500P[PZBBBfh
1360:0110 23 62 23 23 66 58 66 2D-56 40 60 24 66 50 66 5D #b##fXf-V@`$fPf]
1360:0120 66 33 2F 66 31 2F 35 2B-2B 75 35 78 00 00 00 00 f3/f1/5++u5x....
1360:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1360:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1360:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1360:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1360:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-
然后利用debug的e命令 将前三行放入内存执行(这里要计算字节长度)每行长度为16
所以 我们写成以下形式:- e100 68 50 31 58 35 30 30 50 5B 50 5A 42 42 42 66 68
- e110 23 62 23 23 66 58 66 2D 56 40 60 24 66 50 66 5D
- e120 66 33 2F 66 31 2F 35 2B 2B 75 35 78 00 00 00 00
复制代码 到了这里 大家是不是就很眼熟拉? 呵呵 跟世界编程大赛的原理一样吧!
那么我们来验证一下 转换的到底能用不能:
依然利用反汇编命令u,将这段机器码再转换回去- more +1 %~s0|debug
- e100 68 50 31 58 35 30 30 50 5B 50 5A 42 42 42 66 68
- e110 23 62 23 23 66 58 66 2D 56 40 60 24 66 50 66 5D
- e120 66 33 2F 66 31 2F 35 2B 2B 75 35 78 00 00 00 00
-
- u100,12f
复制代码 12f在这里是程序结束的最后位置,因为按字节算 已经足够显示整个程序代码了
结果如下:
-u100,12f
1360:0100 68 DB 68
1360:0101 50 PUSH AX
1360:0102 315835 XOR [BX+SI+35],BX
1360:0105 3030 XOR [BX+SI],DH
1360:0107 50 PUSH AX
1360:0108 5B POP BX
1360:0109 50 PUSH AX
1360:010A 5A POP DX
1360:010B 42 INC DX
1360:010C 42 INC DX
1360:010D 42 INC DX
1360:010E 66 DB 66
1360:010F 68 DB 68
1360:0110 236223 AND SP,[BP+SI+23]
1360:0113 236658 AND SP,[BP+58]
1360:0116 66 DB 66
1360:0117 2D5640 SUB AX,4056
1360:011A 60 DB 60
1360:011B 2466 AND AL,66
1360:011D 50 PUSH AX
1360:011E 66 DB 66
1360:011F 5D POP BP
1360:0120 66 DB 66
1360:0121 332F XOR BP,[BX]
1360:0123 66 DB 66
1360:0124 312F XOR [BX],BP
1360:0126 352B2B XOR AX,2B2B
1360:0129 7535 JNZ 0160
1360:012B 7800 JS 012D
1360:012D 0000 ADD [BX+SI],AL
1360:012F 0000 ADD [BX+SI],AL
-
结果出来了 基本一致 除了最后我们因为选择范围过大(12f) 而多出来的部分!
不多说,运行了才知道- more +1 %~s0|debug>>PPdos.txt
- e100 68 50 31 58 35 30 30 50 5B 50 5A 42 42 42 66 68
- e110 23 62 23 23 66 58 66 2D 56 40 60 24 66 50 66 5D
- e120 66 33 2F 66 31 2F 35 2B 2B 75 35 78 00 00 00 00
-
- n heihei.com
- rcx
- 64
- w
复制代码 运行成功!到此大家对汇编语言转换成机器码 也有所了解了!
[本文仅代表PPdos个人观点]
原文地址:http://www.cn-dos.net/forum/viewthread.php?tid=40867 |