本帖最后由 Kris 于 2011-8-9 14:20 编辑
[ 破文标题 ] 追码+爆破 之 一个简单的CM!本地验证!菜鸟找回信心 [ 破文作者 ] Kris [ 破解平台 ] Windows Xp [ 软件名称 ] 一个简单的CM!本地验证!菜鸟找回信心 [ 软件大小 ] 568KB [ 保护方式 ] 固定密码 [ 软件简介 ] 超级简单的CM [ 破解声明 ] 仅供交流学习技术,若教程中有不对之处,希望各位大大即使指正! 破解过程: 1. 打开CM,密码框留空,直接点按钮,弹出了错误框 2. 载入OD,运行后重复刚才的步骤,弹出错误框后不要马上去点击确定。 首先点暂停,然后点调试-执行到用户代码 并点击错误框的“确定”按钮,点下后OD暂停在如下位置 接着F8单步步过,两个ret后来到关键代码,这个所谓的关键代码就是按钮事件代码了: 004010A1 /. 55 push ebp ; F2,在此处(段首)下INT3断点,运行后点击按钮将会断下
004010A2 |. 8BEC mov ebp,esp
004010A4 |. 81EC 08000000 sub esp,0x8
004010AA |. 6A FF push -0x1
004010AC |. 6A 08 push 0x8
004010AE |. 68 02000116 push 0x16010002
004010B3 |. 68 01000152 push 0x52010001
004010B8 |. E8 00010000 call CM.004011BD ; 获取编辑框中输入的密码内容
004010BD |. 83C4 10 add esp,0x10
004010C0 |. 8945 FC mov [local.1],eax ; [local.1]中保存编辑框中输入的密码
004010C3 |. 68 4C9B4600 push CM.00469B4C ; 正确的密码
004010C8 |. FF75 FC push [local.1] ; 编辑框中输入的密码
004010CB |. E8 34FFFFFF call CM.00401004 ; 比较正确密码和编辑框中输入的密码的函数,F7跟进去
---------------------------------------------------------------Code of 401004 Begin------------------------------------------------------------------------------------------------------
00401004 /$ 8B5424 04 mov edx,dword ptr ss:[esp+0x4]
00401008 |. 8B4C24 08 mov ecx,dword ptr ss:[esp+0x8]
0040100C |. 85D2 test edx,edx
0040100E |. 75 0D jnz XCM.0040101D
00401010 |. 33C0 xor eax,eax
00401012 |. 85C9 test ecx,ecx
00401014 |. 74 06 je XCM.0040101C
00401016 |. 8039 00 cmp byte ptr ds:[ecx],0x0
00401019 |. 74 01 je XCM.0040101C
0040101B |. 48 dec eax
0040101C |> C3 retn
0040101D |> 85C9 test ecx,ecx
0040101F |. 75 09 jnz XCM.0040102A
00401021 |. 33C0 xor eax,eax
00401023 |. 803A 00 cmp byte ptr ds:[edx],0x0
00401026 |. 74 01 je XCM.00401029
00401028 |. 40 inc eax
00401029 |> C3 retn
0040102A |> F7C2 03000000 test edx,0x3
00401030 |. 75 37 jnz XCM.00401069
00401032 |> 8B02 /mov eax,dword ptr ds:[edx]
00401034 |. 3A01 |cmp al,byte ptr ds:[ecx] ; al为编辑框中输入的密码,[ecx]为正确的密码
00401036 |. 75 2B |jnz XCM.00401063 ; 如果不一样就跳出比较函数
00401038 |. 0AC0 |or al,al
0040103A |. 74 24 |je XCM.00401060
0040103C |. 3A61 01 |cmp ah,byte ptr ds:[ecx+0x1] ; ah为编辑框中输入的密码,[ecx+0x1]为正确的密码
0040103F |. 75 22 |jnz XCM.00401063 ; 如果不一样就跳出比较函数
00401041 |. 0AE4 |or ah,ah
00401043 |. 74 1B |je XCM.00401060
00401045 |. C1E8 10 |shr eax,0x10
00401048 |. 3A41 02 |cmp al,byte ptr ds:[ecx+0x2] ; al为编辑框中输入的密码,[ecx+0x2]为正确的密码
0040104B |. 75 16 |jnz XCM.00401063 ; 如果不一样就跳出比较函数
0040104D |. 0AC0 |or al,al
0040104F |. 74 0F |je XCM.00401060
00401051 |. 3A61 03 |cmp ah,byte ptr ds:[ecx+0x3] ; ah为编辑框中输入的密码,[ecx+0x3]为正确的密码
00401054 |. 75 0D |jnz XCM.00401063 ; 如果不一样就跳出比较函数
00401056 |. 83C1 04 |add ecx,0x4 ; ecx为真确密码,edx为编辑框中输入的密码
00401059 |. 83C2 04 |add edx,0x4 ; 因为每次比较四个byte,所以每次比较过后+4
0040105C |. 0AE4 |or ah,ah
0040105E |.^ 75 D2 \jnz XCM.00401032 ; 继续比较,直到全部比较完
00401060 |> 33C0 xor eax,eax ; 如果一样,作为返回值的eax将会变为0
00401062 |. C3 retn ; 返回
00401063 |> 1BC0 sbb eax,eax ; 如果输入的密码与正确的密码相比较
00401065 |. D1E0 shl eax,1 ; 并不一样
00401067 |. 40 inc eax ; 那么作为返回值的eax将会变为-1(FFFFFFFF)
00401068 |. C3 retn ; 返回
00401069 |> F7C2 01000000 test edx,0x1
0040106F |. 74 14 je XCM.00401085
00401071 |. 8A02 mov al,byte ptr ds:[edx]
00401073 |. 42 inc edx
00401074 |. 3A01 cmp al,byte ptr ds:[ecx]
00401076 |.^ 75 EB jnz XCM.00401063
00401078 |. 41 inc ecx
00401079 |. 0AC0 or al,al
0040107B |.^ 74 E3 je XCM.00401060
0040107D |. F7C2 02000000 test edx,0x2
00401083 |.^ 74 AD je XCM.00401032
00401085 |> 66:8B02 mov ax,word ptr ds:[edx]
00401088 |. 83C2 02 add edx,0x2
0040108B |. 3A01 cmp al,byte ptr ds:[ecx]
0040108D |.^ 75 D4 jnz XCM.00401063
0040108F |. 0AC0 or al,al
00401091 |.^ 74 CD je XCM.00401060
00401093 |. 3A61 01 cmp ah,byte ptr ds:[ecx+0x1]
00401096 |.^ 75 CB jnz XCM.00401063
00401098 |. 0AE4 or ah,ah
0040109A |.^ 74 C4 je XCM.00401060
0040109C |. 83C1 02 add ecx,0x2
0040109F \.^ EB 91 jmp XCM.00401032
---------------------------------------------------------------Code of 401004 End------------------------------------------------------------------------------------------------------
004010D0 |. 83C4 08 add esp,0x8 ; eax=0输入的密码与正确密码吻合,eax为-1(FFFFFFFF)则不吻合
004010D3 |. 83F8 00 cmp eax,0x0 ; eax与0比较,如果一样,标志寄存器Z=1,否则Z=0
004010D6 |. B8 00000000 mov eax,0x0
004010DB |. 0F94C0 sete al ; 如果Z=1,那么EAX将为1,如果Z=0,那么EAX将为0
004010DE |. 8945 F8 mov [local.2],eax ; [local.2]保存eax的值
004010E1 |. 8B5D FC mov ebx,[local.1]
004010E4 |. 85DB test ebx,ebx
004010E6 |. 74 09 je XCM.004010F1
004010E8 |. 53 push ebx
004010E9 |. E8 C9000000 call CM.004011B7
004010EE |. 83C4 04 add esp,0x4
004010F1 |> 837D F8 00 cmp [local.2],0x0 ; [local.2]与0比较
004010F5 |. 0F84 35000000 je CM.00401130 ; 如果[local.2]为0,那么跳转实现,就会跳出失败
004010FB |. 6A 00 push 0x0 ; 到这里就可以跳出成功
004010FD |. 6A 00 push 0x0
004010FF |. 6A 00 push 0x0
00401101 |. 68 01030080 push 0x80000301
00401106 |. 6A 00 push 0x0
00401108 |. 68 00000000 push 0x0
0040110D |. 68 04000080 push 0x80000004
00401112 |. 6A 00 push 0x0
00401114 |. 68 569B4600 push CM.00469B56
00401119 |. 68 03000000 push 0x3
0040111E |. BB 00134000 mov ebx,CM.00401300
00401123 |. E8 89000000 call CM.004011B1
00401128 |. 83C4 28 add esp,0x28
0040112B |. E9 30000000 jmp CM.00401160
00401130 |> 6A 00 push 0x0 ; 到这理将会跳出失败
00401132 |. 6A 00 push 0x0
00401134 |. 6A 00 push 0x0
00401136 |. 68 01030080 push 0x80000301
0040113B |. 6A 00 push 0x0
0040113D |. 68 00000000 push 0x0
00401142 |. 68 04000080 push 0x80000004
00401147 |. 6A 00 push 0x0
00401149 |. 68 799B4600 push CM.00469B79
0040114E |. 68 03000000 push 0x3
00401153 |. BB 00134000 mov ebx,CM.00401300
00401158 |. E8 54000000 call CM.004011B1
0040115D |. 83C4 28 add esp,0x28
00401160 |> 8BE5 mov esp,ebp
00401162 |. 5D pop ebp
00401163 \. C3 retn
3.
代码分析完毕,下面开始进行破解
(1)
追码:
004010C3 |. 68 4C9B4600 push CM.00469B4C ; 正确的密码
通过这句代码就知道,00469B4C里面就存放着正确的密码,数据窗口-跟随-00469B4C,马上能找到正确的密码为:法克shiny
(2)
爆破:
004010F5 |. 0F84 35000000 je CM.00401130 ; 如果[local.2]为0,那么跳转实现,就会跳出失败
很明显,这句代码跳转了的话必定会失败,那肯定用NOP啦,这样就可以完成爆破了
破解总结:
1.通过弹出错误框后,暂停-调试-执行到用户代码,找到按钮事件
2.分析关键代码
3.找到比较代码即可得到正确密码
4.找到关键跳转即可得到爆破点
http://u.115.com/file/clqpyqd6#
演示教程.rar
|