标题: 再读世界编程大赛第一名的debug64k作品批处理版 [打印本页]
作者: Batcher 时间: 2009-3-1 22:58 标题: 再读世界编程大赛第一名的debug64k作品批处理版
此为汇编程序初级帖,主要提及了机器码与汇编指令间的转换,汇编与反汇编的应用,以下是给出的操作实例
重要一点: 是汇编与批处理的结合,从而使批处理可以直接查看内存!
经过几天的观察 终于发现了其中的猫腻(:
其代码用批处理执行如下:复制代码
因为我们很多人对汇编不了解,所以对这段仅仅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
作者: 愚无尽 时间: 2009-3-17 10:28
太强了。。。厉害的家伙
作者: woifish 时间: 2009-6-25 00:00
惊人啊,太强了,我现在几乎不懂什么这些方面的。
作者: denrow 时间: 2009-8-5 22:49
经典,注册,回复只为楼主的好帖……找了好久终于有机会品味它的源代码了,哈哈,哈哈,哈哈哈……
作者: denrow 时间: 2009-8-5 23:03
好像搞错了,还以为是“分析”,原来是就是debug反汇编啊,强烈希望有人对此程序做个解析,谢谢
作者: zhangwencheng 时间: 2009-8-8 12:02
我保存为批处理双击出现类似CS游戏的画面,按ESC退出时死机了…………
晕!
作者: w439617840 时间: 2009-8-8 12:07
看不懂看不懂 是讲DEBUG的用法吗?
作者: canyuexiaolang 时间: 2009-8-16 07:06
呃...............怎么看不懂 o(>_<)o
作者: Lumiere 时间: 2009-8-16 09:53
解释看起来的都像天书。和楼主的差距太远了。佩服啊……
作者: xiaog1 时间: 2009-8-18 11:12
看了你的解释,直接决定不去费这个脑子了。
作者: pw04_5 时间: 2009-9-24 21:43
very very good
作者: a4188809b 时间: 2009-10-6 14:48
老天啊 那么牛 想一个游戏的画面 就这点代码 就可以达到这种境界
作者: canyuexiaolang 时间: 2009-10-6 15:27
我...我看的...晕车了.............想吐.........呕..........
作者: djwshh 时间: 2009-10-6 22:20
很是抽象,我的基础还很差啊
作者: athinko 时间: 2009-10-11 11:51
这是干什么用的啊。。。
。。。。。?
作者: hellodyan 时间: 2009-11-3 13:00
学习 ..... 不过还没到看懂的境界
作者: bppc888 时间: 2009-11-3 16:24
菜鸟一个,不懂。呵呵
作者: hanbing 时间: 2009-11-6 21:16
牛人~强悍啊~~~~
作者: netbenton 时间: 2009-11-18 19:33
楼主发的是一个4K的作品,我来转发一个真正64K的一等奖作品。
已经转为BAT格式,直接运行即可
作者: 绿地流年 时间: 2009-11-18 22:54
牛人啊哈哈哈哈哈哈哈哈
作者: crartor 时间: 2009-12-26 14:41 标题: 是一批指令集
可以将这个指令集用DEBUG编译成一个只有 4KB 的 COM 文件。双击该文件就可以看到像 CS 的画面了。
作者: fx1095 时间: 2010-1-16 12:47
太牛了 我也是第一次看到
作者: rogue_1983 时间: 2010-7-24 00:51 标题: 靠。
我是XP系统,怎么运行以后全是黑屏啊?
作者: qunwang6 时间: 2010-8-3 21:31
windows7下不起作用,楼主可以改一下吗?
作者: acaigg 时间: 2011-1-20 20:33
看不懂。学习一下吧。
作者: T455240489 时间: 2011-5-13 19:45
看了管理员的解析,才发现:
1.那个第一名的作品,也没想象中的那么神,不过人家有能力这是肯定的。
2.我的汇编算白学了,居然第一眼没看出来那是机器码
3.原来dos命令不只可以通过system函数与VC挂勾,它还可以和汇编相通,神了,越来越爱batch了!
4.管理员是个强人啊!嘿嘿!
作者: QIAOXINGXING 时间: 2011-10-7 10:33
不懂啊、、、、、、、、、、、、、、、、、、、、
作者: 285166531 时间: 2011-10-23 00:08
机器码? 神人! 敬仰了!
作者: ydafhjeajtrj 时间: 2011-10-25 16:45
楼主啊,为什么我保存为批处理后什么效果没有呢,只有第一句运行的提示
作者: qq2501 时间: 2011-12-16 16:57
very good!!!
作者: wodesitanfu 时间: 2012-7-19 11:36
……说实话,我连LZ的解释都看不懂,更别说作者的了
作者: gxuan2008 时间: 2012-8-22 11:17
不会汇编,只能敬仰了。。。
作者: mstsc 时间: 2012-8-22 11:48
不用多说 ,先收藏
作者: 0123456789 时间: 2012-12-31 11:57
那16进制是怎么写的???
作者: 0123456789 时间: 2013-1-18 21:33
机器码是怎么写的?
我也看不懂那机器码。
作者: T-bat 时间: 2013-5-4 18:56
小菜刚注册,虽然看不懂,但我知道确实很厉害!
作者: 377563714 时间: 2013-11-7 20:07
这不是一般的牛啊!非洲特种的么?????????????
作者: 112 时间: 2018-8-21 10:46
https://bjbgp02.baidupcs.com/file/9db57c9d99ae1a4f88e32010b63b345c?bkt=p3-14009db57c9d99ae1a4f88e32010b63b345c5a9298cb0000003598fc&fid=1930812830-250528-497587092673483&time=1534818997&sign=FDTAXGERLQBHSKW-DCb740ccc5511e5e8fedcff06b081203-nrRAlcI8Sb%2BveYQ57zkAtQZPwQU%3D&to=76&size=3512572&sta_dx=3512572&sta_cs=0&sta_ft=rar&sta_ct=0&sta_mt=0&fm2=MH%2CYangquan%2CAnywhere%2C%2Cbeijing%2Cpbs&resv0=cdnback&resv1=0&vuk=1930812830&iv=0&htype=&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=14009db57c9d99ae1a4f88e32010b63b345c5a9298cb0000003598fc&sl=76480590&expires=8h&rt=pr&r=185707508&mlogid=5390988315335086399&vbdid=4052590113&fin=a.rar&fn=a.rar&rtype=1&dp-logid=5390988315335086399&dp-callid=0.1.1&hps=1&tsl=80&csl=80&csign=uk8zKSdZm%2BlFg1LyQf%2Foxwzn7YE%3D&so=0&ut=6&uter=4&serv=0&uc=2915135174&ti=26fa64dbec288224f5381dbf23629c2043214477884a4734305a5e1275657320&by=themis
作者: 112 时间: 2018-8-21 11:24
https://bjbgp02.baidupcs.com/file/3425c1642171d0d5955146f1deccace6?bkt=p3-0000042ecec642f31c18b8ae2d63b402c7e0&fid=1930812830-250528-149165153216161&time=1534821819&sign=FDTAXGERLQBHSKW-DCb740ccc5511e5e8fedcff06b081203-En5cYIipgad15Y3i75r4bvMSCJs%3D&to=76&size=10119766&sta_dx=10119766&sta_cs=0&sta_ft=bat&sta_ct=0&sta_mt=0&fm2=MH%2CQingdao%2CAnywhere%2C%2Cbeijing%2Cpbs&resv0=cdnback&resv1=0&vuk=1930812830&iv=0&htype=&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=0000042ecec642f31c18b8ae2d63b402c7e0&sl=76480590&expires=8h&rt=pr&r=110592961&mlogid=5391745737635264669&vbdid=4052590113&fin=a.bat&fn=a.bat&rtype=1&dp-logid=5391745737635264669&dp-callid=0.1.1&hps=1&tsl=80&csl=80&csign=uk8zKSdZm%2BlFg1LyQf%2Foxwzn7YE%3D&so=0&ut=6&uter=4&serv=0&uc=2915135174&ti=76168191086d6f295671ae718b27a4de571b4d41a8ab9726&by=themis
作者: hzlbzo 时间: 2020-1-15 13:07
上学逃课打游戏了。还是没看懂。
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |