首页
社区
课程
招聘
[原创]dpxdp的16Bit DOS crackme分析
发表于: 2007-6-11 20:36 7678

[原创]dpxdp的16Bit DOS crackme分析

2007-6-11 20:36
7678
seg000:0001 main proc far ; CODE XREF: _main+D P
seg000:0001
seg000:0001 var_4 = word ptr -4
seg000:0001 var_2 = word ptr -2
seg000:0001
seg000:0001 push bp
seg000:0002 mov bp, sp
seg000:0004 sub sp, 4
seg000:0008 push di
seg000:0009 push si
seg000:000A xor ax, ax
seg000:000C push ax
seg000:000D push ax
seg000:000E call sub_12886        要往屏幕打印信息的初始化
seg000:000E
seg000:0013 mov ax, 2Bh ; '+' ; <suspicious> 要打印的字符个数
seg000:0016 push ax
seg000:0017 mov ax, 9AAh ; <suspicious> 其实就是字符串”Please input serial 
                                                    number (no character) :”的地址
seg000:001A push ds
seg000:001B push ax
seg000:001C call sub_12C38            开始打印字符串
seg000:001C
seg000:0021 call sub_127B7            打印结束
seg000:0021
seg000:0026 xor ax, ax
seg000:0028 push ax
seg000:0029
seg000:0029 loc_10029:
seg000:0029 mov ax, 1
seg000:002C push ax
seg000:002D mov ax, 7FFFh
seg000:0030 push ax
seg000:0031 mov ax, 64h ; 'd' ; <suspicious> 是字符串(I9,I2)
seg000:0034 push ds
seg000:0035 push ax
seg000:0036 call sub_11FB8            初始化接收输入
seg000:0036
seg000:003B mov ax, 5Ch ; '\' ; <suspicious>
seg000:003E push ds
seg000:003F push ax
seg000:0040 call sub_125C5            把I9得到的数值放在ds:[5C]里面
seg000:0040
seg000:0045 mov ax, 60h ; '`' ; <suspicious>
seg000:0048 push ds
seg000:0049 push ax
seg000:004A call sub_125C5            把I2得到的数值放在ds:[60]里面
seg000:004A
seg000:004F call sub_120B3            接收输入结束
                                    我们看上面这个接收输入的函数是靠(I9,I2)做为格式的
                                    说明取输入的前9个数字字符,转换为一个DWORD数值
                                    从9个后面取2个数字字符,再转换成一个DWORD数值
                                    我接触的语言比较少,不知道那位大侠知道什么语言是靠
                                    这样的格式接收数值的,就可以知道作者用什么编程语言
seg000:004F
seg000:0054 push word ptr ds:62h    DOS下每次push只能push一个WORD
seg000:0058 push word ptr ds:60h    所以一个数值要push两次
seg000:005C mov ax, 3            3次方的意思
seg000:005F xor dx, dx
seg000:0061 push dx
seg000:0062 push ax
seg000:0063 call sub_11531        这个是乘方函数,结果放在ax,dx里面
seg000:0063
seg000:0068 push word ptr ds:62h
seg000:006C push word ptr ds:60h
seg000:0070 mov [bp+var_4], ax    把ds:[60]的3次方保存在局部变量里面
seg000:0073 mov [bp+var_2], dx
seg000:0076 mov ax, 2            2次方
seg000:0079 xor dx, dx
seg000:007B push dx
seg000:007C push ax
seg000:007D call sub_11531        还是那个乘方函数
seg000:007D
seg000:0082 add ax, [bp+var_4]    
seg000:0085 adc dx, [bp+var_2]    这两个操作是2次方加上保存的3次方
seg000:0088 add ax, ds:60h        
seg000:008C adc dx, ds:62h        再加上本身,就是1次方
seg000:0090 mov ds:6Ch, ax
seg000:0093 mov ds:6Eh, dx        把3次方,2次方,1次方的和放在ds:[6C]
seg000:0097 mov ax, ds:5Ch
seg000:009A mov dx, ds:5Eh        取出[5C]的数值,就是我们输入的9位数
seg000:009E sub ax, ds:6Ch
seg000:00A2 sbb dx, ds:6Eh        减去[6C]也就是刚才的运算结果
seg000:00A6 or ax, dx            或操作,说明要求ax,dx都是0,ax才是0
seg000:00A8 jnz short loc_100C8    不等0就跳
seg000:00A8
seg000:00AA xor ax, ax
seg000:00AC push ax
seg000:00AD push ax
seg000:00AE call sub_12886        上面分析过了,打印字符初始化
seg000:00AE
seg000:00B3 mov ax, 5            5个字符
seg000:00B6 push ax        
seg000:00B7 mov ax, 9D5h ; <suspicious>            “Good!”
seg000:00BA push ds
seg000:00BB push ax
seg000:00BC call sub_12C38        打印到屏幕
seg000:00BC
seg000:00C1 call sub_127B7        打印结束
seg000:00C1
seg000:00C6 jmp short loc_100E4
seg000:00C6
seg000:00C8 ; ---------------------------------------------------------------------------
seg000:00C8
seg000:00C8 loc_100C8: ; CODE XREF: main+A7 j
seg000:00C8 xor ax, ax
seg000:00CA push ax
seg000:00CB push ax
seg000:00CC call sub_12886        打印初始化
seg000:00CC
seg000:00D1 mov ax, 6            6个字符
seg000:00D4 push ax
seg000:00D5 mov ax, 9DAh ; <suspicious>        “Sorry!”
seg000:00D8 push ds
seg000:00D9 push ax
seg000:00DA call sub_12C38        开始打印到屏幕
seg000:00DA
seg000:00DF call sub_127B7        结束打印
seg000:00DF
seg000:00E4
seg000:00E4 loc_100E4: ; CODE XREF: main+C5 j
seg000:00E4 pop si
seg000:00E5 pop di
seg000:00E6 mov sp, bp
seg000:00E8 pop bp
seg000:00E9 retf
seg000:00E9
seg000:00E9 main endp

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
不错,学习了,很懂算法是我的偶像已经是很明显的
2007-6-11 23:09
0
雪    币: 202
活跃值: (77)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
你的发帖量已经超过我那么多了
2007-6-11 23:20
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
菜鸟就只好灌水了
2007-6-12 00:18
0
雪    币: 241
活跃值: (35)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
我也灌一个。
2007-6-12 04:06
0
雪    币: 244
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
狂晕...楼主厉害
-
-
十分支持你!!!

看到那个DOS的,用OD不能调试我就没去做过多考虑,直接放弃...还是太菜...
2007-6-14 19:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
dos下程序以前没弄过,学习了。
2007-6-17 15:42
0
游客
登录 | 注册 方可回帖
返回
//