-
-
[原创]dpxdp的16Bit DOS crackme分析
-
发表于:
2007-6-11 20:36
7679
-
[原创]dpxdp的16Bit DOS crackme分析
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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!