Kris 发表于 2011-8-9 14:16

【暑假活动后续】追码+爆破 之"002 一个简单的CM"

本帖最后由 Kris 于 2011-8-9 14:20 编辑

[ 破文标题 ] 追码+爆破 之 一个简单的CM!本地验证!菜鸟找回信心[ 破文作者 ] Kris[ 作者邮箱 ] ZzhEMail@Foxmail.Com
[ 破解工具 ] OD[ 破解平台 ] Windows Xp[ 软件名称 ] 一个简单的CM!本地验证!菜鸟找回信心[ 软件大小 ] 568KB[ 原版下载 ] http://www.52pojie.cnthread-101329-1-1.html[ 保护方式 ] 固定密码[ 软件简介 ] 超级简单的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 ,eax                        ;中保存编辑框中输入的密码
004010C3|.68 4C9B4600   push CM.00469B4C                         ;正确的密码
004010C8|.FF75 FC         push                            ;编辑框中输入的密码
004010CB|.E8 34FFFFFF   call CM.00401004                         ;比较正确密码和编辑框中输入的密码的函数,F7跟进去
---------------------------------------------------------------Code of 401004 Begin------------------------------------------------------------------------------------------------------
00401004/$8B5424 04       mov edx,dword ptr ss:
00401008|.8B4C24 08       mov ecx,dword ptr ss:
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:,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:,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:
00401034|.3A01            |cmp al,byte ptr ds:                ;al为编辑框中输入的密码,为正确的密码
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:            ;ah为编辑框中输入的密码,为正确的密码
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:            ;al为编辑框中输入的密码,为正确的密码
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:            ;ah为编辑框中输入的密码,为正确的密码
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:
00401073|.42            inc edx
00401074|.3A01            cmp al,byte ptr ds:
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:
00401088|.83C2 02         add edx,0x2
0040108B|.3A01            cmp al,byte ptr ds:
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:
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 ,eax                        ;保存eax的值
004010E1|.8B5D FC         mov ebx,
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 ,0x0                        ;与0比较
004010F5|.0F84 35000000   je CM.00401130                           ;如果为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                           ;如果为0,那么跳转实现,就会跳出失败
很明显,这句代码跳转了的话必定会失败,那肯定用NOP啦,这样就可以完成爆破了



破解总结:
1.通过弹出错误框后,暂停-调试-执行到用户代码,找到按钮事件
2.分析关键代码
3.找到比较代码即可得到正确密码
4.找到关键跳转即可得到爆破点
http://u.115.com/file/clqpyqd6#
演示教程.rar

Shiny 发表于 2011-8-9 14:18

Kris 发表于 2011-8-9 14:20

闲的蛋疼了。。。

阿杰 发表于 2011-8-9 14:20

哎哟, 不错噢,   坐等粉粉。

zhi5231 发表于 2011-8-9 14:20

Kris 发表于 2011-8-9 14:23

淡定。。。参赛的CM为了电子书的下册,全部要写破文

浮华丶一场梦 发表于 2011-8-9 14:25

2356265 发表于 2011-8-9 14:35

什么东西啊?

注册账户好难 发表于 2011-8-9 14:38

呼呼
找回来信心!!!!!!!!!!!!
膜拜kris牛

吾爱、硬币 发表于 2011-8-9 14:42

大牛大牛大牛{:301_988:}膜拜
页: [1] 2
查看完整版本: 【暑假活动后续】追码+爆破 之"002 一个简单的CM"