飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 6383|回复: 15

[07版] [样帖]第三章暴力破解:开心小闹钟 2.7 Build 0107 SP1 简单分析

[复制链接]

该用户从未签到

发表于 2007-3-18 11:24:55 | 显示全部楼层 |阅读模式
教程制作简单说明:
上午抽时间做了这份样帖,我直接用破文生成器生成了HTML文件,大家如有工具,可使用其他工具制作成图文并貌的文件。

所有教程讲解采用的软件有以下要求:建议大家找E文软件(最好是最新版),国产软件停止更新一年以上。

大家在制作教程中,尽量将思路叙述的详细些,讲明这是为什么。尽量多提供几种破解思路让读者来开阔思路。

所有文章,大家在投稿时,请对软件下载最新版并重新调试些成破文,原则上不引用之前的破文(如果软件没更新,对原有文章使用破文生成器重新生成即可)。文章的制作上,大家多费些心,毕竟这样大规模的制作一次教程不易,我们的收稿宗旨是宁缺毋滥。讲解时候一定要心系读者,多提问些为什么,多一些疑难的解答。

以下为破文样板,可供大家参考(我制作的由于时间问题,没有添加图片) 帖子代码使用黑夜彩虹兄弟所写的xTiNt代码着色器着色。




【PYG官方出品】破文圣手 Ver1.0 最终版
https://www.chinapyg.com/viewthread.php?tid=3143
xTiNt代码着色器-PET内部版
https://www.chinapyg.com/viewthr ... &extra=page%3D1
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2007-3-18 11:34:36 | 显示全部楼层
【破文标题】开心小闹钟 2.7 Build 0107 SP1 简单分析
【破文作者】Nisy[PYG]
【作者邮箱】aqiayi@sina.com
【作者主页】https://www.chinapyg.com
【破解工具】OllyICE,PEiD 0.94
【破解平台】Win XP
【软件名称】开心小闹钟 2.7 Build 0107 SP1
【软件大小】1586KB
【原版下载】http://www.onlinedown.net/soft/9070.htm
【保护方式】注册码+时间限制
【软件简介】日常生活中常常会遇到由于事务繁忙或要处理的事太多,健忘,无序的事务管理,对个人和单位造成很大麻烦 。开心小闹钟(HappyClock)就是为解决这些问题所写的。通过合理的设计,做出体贴的面向用户需要的功能,开心小闹钟还很年轻,不完善、不合理、再所难免,希望大家多提意见,一起来完善它,使其更好的为大家服务。现有功能:1、使用图形界面,内置13款皮肤,窗口形状随图形改变,外形活泼可爱,特色鲜明。2、可以设定闹铃,最大的灵活性覆盖一天24小时。3、面板功能设置,方面用户打造出更个性化的窗口界面。4、系统时间修改功能,用户不需要再通过控制面板修改时间。5、提供日历功能,可以查询今天的任意天数后是什么日期。6、提供快速提醒功能,方便临时需要闹钟的提醒。7、面板设置功能,用户操作更加灵活;8、自动保留用户设置、用户不需再为每次运行程序额外开销劳动量;9、提供多种运行选项,如保持在最前面、开机自动运行、以任务栏图标方式运行等,随用户喜爱自由设置。
【破解声明】仅限与技术交流,无他,失误之处敬请诸位大侠赐教!

------------------------------------------------------------------------
PEiD查壳:ASPack 2.12 -> Alexey Solodovnikov
ESP定律搞定,这里不再重述。
PEiD再查壳:Microsoft Visual C++ 6.0

先运行软件,随意输入注册码。得知该软件的验证方式为重启验证
我们OD载入该软件,到软件注册部分下API函数断点:
BP GetWindowTextA 或 BP GetWindowTextLengthA 断点(第一个是取注册码的常用API函数断点,第二个为取注册信息长度的函数)。

输入假码,点注册,OD断到这里:77D3213C >  6A 0C              push 0C
我们注意观察堆栈窗口:

0012ECBC    000604CA  |hWnd = 000604CA (class='Edit',parent=000904E2)
0012ECC0    0012EDF0  |Buffer = 0012EDF0
0012ECC4    00000015  \Count = 15 (21.)

在该行“0012ECB8  0040E000 /CALL 到 GetWindowTextA 来自 Dump.0040DFFE”
点右键,然后“回车”(或选择在数据窗口中跟随)
返回到程序领空后,我们在0040DFF7下断点:
然后F8单步一路向下走,即使看不懂软件的算法也没关系,我们注意观察和思考各跳转将实现的意图,来了解注册注册信息的保存位置即可。


0040DFDA    FFD7               call edi
0040DFDC    8B2D A0534600      mov ebp,dword ptr ds:[<&USER32.GetWind>; USER32.GetWindowTextLengthA
0040DFE2    50                 push eax
0040DFE3    FFD5               call ebp
0040DFE5    40                 inc eax
0040DFE6    50                 push eax
0040DFE7    8D8424 2C010000    lea eax,dword ptr ss:[esp+12C]
0040DFEE    50                 push eax
0040DFEF    68 C3040000        push 4C3
0040DFF4    56                 push esi
0040DFF5    FFD7               call edi
0040DFF7    8B1D 9C534600      mov ebx,dword ptr ds:[<&USER32.GetWind>; USER32.GetWindowTextA
0040DFFD    50                 push eax
0040DFFE    FFD3               call ebx
0040E000    68 C4040000        push 4C4
0040E005    56                 push esi
0040E006    FFD7               call edi
0040E008    50                 push eax
0040E009    FFD5               call ebp
0040E00B    8BE8               mov ebp,eax
0040E00D    8D5424 28          lea edx,dword ptr ss:[esp+28]
0040E011    8D4D 01            lea ecx,dword ptr ss:[ebp+1]
0040E014    51                 push ecx
0040E015    52                 push edx
0040E016    68 C4040000        push 4C4
0040E01B    56                 push esi
0040E01C    FFD7               call edi
0040E01E    50                 push eax
0040E01F    FFD3               call ebx
0040E021    33F6               xor esi,esi
0040E023    85ED               test ebp,ebp
0040E025    897424 10          mov dword ptr ss:[esp+10],esi
0040E029    7E 1D              jle short Dump.0040E048
0040E02B    0FBE4434 28        movsx eax,byte ptr ss:[esp+esi+28]
0040E030    50                 push eax
0040E031    E8 9C380400        call Dump.004518D2
0040E036    83C4 04            add esp,4
0040E039    85C0               test eax,eax
0040E03B    0F84 95000000      je Dump.0040E0D6
0040E041    46                 inc esi
0040E042    3BF5               cmp esi,ebp
0040E044  ^ 7C E5              jl short Dump.0040E02B
0040E046    85ED               test ebp,ebp
0040E048    0F84 90000000      je Dump.0040E0DE
0040E04E    8B7424 20          mov esi,dword ptr ss:[esp+20]
0040E052    8D4C24 28          lea ecx,dword ptr ss:[esp+28]          ; 这里已经取出了假码
0040E056    51                 push ecx
0040E057    56                 push esi
0040E058    E8 A30F0500        call Dump.0045F000
0040E05D    8B7C24 24          mov edi,dword ptr ss:[esp+24]
0040E061    68 BCF84600        push Dump.0046F8BC                     ; ASCII "963251DC5A9C90D9F203A03C363BA411"
0040E066    57                 push edi
0040E067    E8 940F0500        call Dump.0045F000
0040E06C    8B5424 24          mov edx,dword ptr ss:[esp+24]
0040E070    68 B4F84600        push Dump.0046F8B4                     ; ASCII "10001"
0040E075    52                 push edx
0040E076    E8 850F0500        call Dump.0045F000
0040E07B    57                 push edi
0040E07C    56                 push esi
0040E07D    E8 0EFD0400        call Dump.0045DD90
0040E082    83C4 20            add esp,20
0040E085    83F8 FF            cmp eax,-1
0040E088    75 4C              jnz short Dump.0040E0D6               
0040E08A    8B5C24 24          mov ebx,dword ptr ss:[esp+24]
0040E08E    8B4424 14          mov eax,dword ptr ss:[esp+14]
0040E092    53                 push ebx
0040E093    57                 push edi
0040E094    50                 push eax
0040E095    56                 push esi
0040E096    E8 E50C0500        call Dump.0045ED80
0040E09B    8D8C24 38020000    lea ecx,dword ptr ss:[esp+238]
0040E0A2    6A 00              push 0
0040E0A4    51                 push ecx
0040E0A5    53                 push ebx
0040E0A6    68 00010000        push 100
0040E0AB    E8 D0060500        call Dump.0045E780
0040E0B0    56                 push esi
0040E0B1    E8 3AF70400        call Dump.0045D7F0
0040E0B6    53                 push ebx
0040E0B7    E8 34F70400        call Dump.0045D7F0
0040E0BC    57                 push edi
0040E0BD    E8 2EF70400        call Dump.0045D7F0
0040E0C2    8B5424 40          mov edx,dword ptr ss:[esp+40]
0040E0C6    52                 push edx
0040E0C7    E8 24F70400        call Dump.0045D7F0
0040E0CC    83C4 30            add esp,30
0040E0CF    E8 3CF70400        call Dump.0045D810
0040E0D4    EB 08              jmp short Dump.0040E0DE
0040E0D6    C74424 10 01000000 mov dword ptr ss:[esp+10],1
0040E0DE    8DB424 28020000    lea esi,dword ptr ss:[esp+228]
0040E0E5    8D8424 28010000    lea eax,dword ptr ss:[esp+128]
0040E0EC    8A10               mov dl,byte ptr ds:[eax]
0040E0EE    8A1E               mov bl,byte ptr ds:[esi]
0040E0F0    8ACA               mov cl,dl
0040E0F2    3AD3               cmp dl,bl
0040E0F4    75 1E              jnz short Dump.0040E114
0040E0F6    84C9               test cl,cl
0040E0F8    74 16              je short Dump.0040E110
0040E0FA    8A50 01            mov dl,byte ptr ds:[eax+1]
0040E0FD    8A5E 01            mov bl,byte ptr ds:[esi+1]
0040E100    8ACA               mov cl,dl
0040E102    3AD3               cmp dl,bl
0040E104    75 0E              jnz short Dump.0040E114
0040E106    83C0 02            add eax,2
0040E109    83C6 02            add esi,2
0040E10C    84C9               test cl,cl
0040E10E  ^ 75 DC              jnz short Dump.0040E0EC
0040E110    33C0               xor eax,eax
0040E112    EB 05              jmp short Dump.0040E119
0040E114    1BC0               sbb eax,eax
0040E116    83D8 FF            sbb eax,-1
0040E119    85C0               test eax,eax
0040E11B    75 78              jnz short Dump.0040E195                ; 如果这里不跳,软件将想注册表写入我们输入的注册信息。这里我们修改为JZ。         
0040E11D    837C24 10 01       cmp dword ptr ss:[esp+10],1
0040E122    74 71              je short Dump.0040E195                 
0040E124    85ED               test ebp,ebp
0040E126    74 6D              je short Dump.0040E195
0040E128    8D4424 18          lea eax,dword ptr ss:[esp+18]
0040E12C    50                 push eax
0040E12D    68 98F84600        push Dump.0046F898                     ; ASCII "SOFTWARE\HappyClock\License"
0040E132    68 02000080        push 80000002
0040E137    FF15 0C504600      call dword ptr ds:[<&ADVAPI32.RegCreat>; ADVAPI32.RegCreateKeyA
0040E13D    8B5424 18          mov edx,dword ptr ss:[esp+18]
0040E141    8B35 08504600      mov esi,dword ptr ds:[<&ADVAPI32.RegSe>; ADVAPI32.RegSetValueExA
0040E147    8D8C24 28010000    lea ecx,dword ptr ss:[esp+128]
0040E14E    68 00010000        push 100
0040E153    51                 push ecx
0040E154    6A 01              push 1
0040E156    6A 00              push 0
0040E158    68 90F84600        push Dump.0046F890                     ; ASCII "Name"
0040E15D    52                 push edx
0040E15E    FFD6               call esi
0040E160    8B4C24 18          mov ecx,dword ptr ss:[esp+18]
0040E164    8D4424 28          lea eax,dword ptr ss:[esp+28]
0040E168    68 00010000        push 100
0040E16D    50                 push eax
0040E16E    6A 01              push 1
0040E170    6A 00              push 0
0040E172    68 88F84600        push Dump.0046F888                     ; ASCII "Keygen"
0040E177    51                 push ecx
0040E178    FFD6               call esi
0040E17A    8B5424 18          mov edx,dword ptr ss:[esp+18]
0040E17E    52                 push edx
0040E17F    FF15 10504600      call dword ptr ds:[<&ADVAPI32.RegClose>; ADVAPI32.RegCloseKey
0040E185    5F                 pop edi
0040E186    5E                 pop esi
0040E187    5D                 pop ebp
0040E188    B8 01000000        mov eax,1
0040E18D    5B                 pop ebx
0040E18E    81C4 18030000      add esp,318
0040E194    C3                 retn


到这里,我们已确认软件将注册信息保存到了注册表中:
HKEY_LOCAL_MACHINE\SOFTWARE\HappyClock\License

这次我们使用OD的API函数断点插件来下断,注意观察堆栈窗口:




0012FB24    0040E262  /CALL 到 RegOpenKeyExA 来自 Dump.0040E25C
0012FB28    80000002  |hKey = HKEY_LOCAL_MACHINE
0012FB2C    0046F898  |Subkey = "SOFTWARE\HappyClock\License"
0012FB30    00000000  |Reserved = 0
0012FB34    00000001  |Access = KEY_QUERY_VALUE
0012FB38    0012FB50  \pHandle = 0012FB50

F9单步几次后,我们在堆栈窗口发现软件注册信息保存的目录“SOFTWARE\HappyClock\License”
(点“运行”,输入regedit 回车,即可调出注册表找到已保存的注册信息)
我们在该行“0012FB24  0040E262  /CALL 到 RegOpenKeyExA 来自 Dump.0040E25C”  
点右键,然后“回车”(或选择在数据窗口中跟随)


0040E24D    50                 push eax                               ; 软件重启验证,注册信息保存在注册表中。我们在这里下断。
0040E24E    6A 01              push 1
0040E250    6A 00              push 0
0040E252    68 98F84600        push Dump.0046F898                     ; ASCII "SOFTWARE\HappyClock\License"
0040E257    68 02000080        push 80000002
0040E25C    FF15 18504600      call dword ptr ds:[<&ADVAPI32.RegOpenK>; ADVAPI32.RegOpenKeyExA
0040E262    85C0               test eax,eax                           ; “在数据窗口中跟随 ”后来到这里,我们在此下断点。
0040E264    0F85 59010000      jnz Dump.0040E3C3                      ; 这里判断软件是否向注册表写入过信息
0040E26A    8D4C24 1C          lea ecx,dword ptr ss:[esp+1C]
0040E26E    8B3D 14504600      mov edi,dword ptr ds:[<&ADVAPI32.RegQu>; ADVAPI32.RegQueryValueExA
0040E274    8D9424 24020000    lea edx,dword ptr ss:[esp+224]
0040E27B    51                 push ecx
0040E27C    52                 push edx
0040E27D    50                 push eax
0040E27E    50                 push eax
0040E27F    8B4424 24          mov eax,dword ptr ss:[esp+24]
0040E283    68 90F84600        push Dump.0046F890                     ; ASCII "Name"
0040E288    50                 push eax
0040E289    FFD7               call edi
0040E28B    8B4424 14          mov eax,dword ptr ss:[esp+14]
0040E28F    8D4C24 1C          lea ecx,dword ptr ss:[esp+1C]
0040E293    8D5424 24          lea edx,dword ptr ss:[esp+24]
0040E297    51                 push ecx
0040E298    52                 push edx
0040E299    6A 00              push 0
0040E29B    6A 00              push 0
0040E29D    68 88F84600        push Dump.0046F888                     ; ASCII "Keygen"
0040E2A2    50                 push eax
0040E2A3    FFD7               call edi
0040E2A5    8B4C24 14          mov ecx,dword ptr ss:[esp+14]          ; 这里取出我们输入的假码
0040E2A9    51                 push ecx
0040E2AA    FF15 10504600      call dword ptr ds:[<&ADVAPI32.RegClose>; ADVAPI32.RegCloseKey
0040E2B0    8D7C24 24          lea edi,dword ptr ss:[esp+24]
0040E2B4    83C9 FF            or ecx,FFFFFFFF
0040E2B7    33C0               xor eax,eax
0040E2B9    F2:AE              repne scas byte ptr es:[edi]
0040E2BB    F7D1               not ecx
0040E2BD    49                 dec ecx
0040E2BE    33FF               xor edi,edi
0040E2C0    3BCF               cmp ecx,edi
0040E2C2    894C24 18          mov dword ptr ss:[esp+18],ecx
0040E2C6    897C24 10          mov dword ptr ss:[esp+10],edi
0040E2CA    7E 1F              jle short Dump.0040E2EB
0040E2CC    0FBE543C 24        movsx edx,byte ptr ss:[esp+edi+24]
0040E2D1    52                 push edx
0040E2D2    E8 FB350400        call Dump.004518D2
0040E2D7    83C4 04            add esp,4
0040E2DA    85C0               test eax,eax
0040E2DC    0F84 85000000      je Dump.0040E367
0040E2E2    8B4424 18          mov eax,dword ptr ss:[esp+18]
0040E2E6    47                 inc edi
0040E2E7    3BF8               cmp edi,eax
0040E2E9  ^ 7C E1              jl short Dump.0040E2CC
0040E2EB    8B4424 18          mov eax,dword ptr ss:[esp+18]
0040E2EF    85C0               test eax,eax
0040E2F1    74 7C              je short Dump.0040E36F
0040E2F3    8D4424 24          lea eax,dword ptr ss:[esp+24]
0040E2F7    50                 push eax
0040E2F8    56                 push esi
0040E2F9    E8 020D0500        call Dump.0045F000
0040E2FE    68 BCF84600        push Dump.0046F8BC                     ; ASCII "963251DC5A9C90D9F203A03C363BA411"
0040E303    55                 push ebp
0040E304    E8 F70C0500        call Dump.0045F000
0040E309    8B7C24 30          mov edi,dword ptr ss:[esp+30]
0040E30D    68 B4F84600        push Dump.0046F8B4                     ; ASCII "10001"
0040E312    57                 push edi
0040E313    E8 E80C0500        call Dump.0045F000
0040E318    55                 push ebp
0040E319    56                 push esi
0040E31A    E8 71FA0400        call Dump.0045DD90
0040E31F    83C4 20            add esp,20
0040E322    83F8 FF            cmp eax,-1
0040E325    75 40              jnz short Dump.0040E367
0040E327    53                 push ebx
0040E328    55                 push ebp
0040E329    57                 push edi
0040E32A    56                 push esi
0040E32B    E8 500A0500        call Dump.0045ED80
0040E330    8D8C24 34010000    lea ecx,dword ptr ss:[esp+134]
0040E337    6A 00              push 0
0040E339    51                 push ecx
0040E33A    53                 push ebx
0040E33B    68 00010000        push 100
0040E340    E8 3B040500        call Dump.0045E780
0040E345    56                 push esi
0040E346    E8 A5F40400        call Dump.0045D7F0
0040E34B    53                 push ebx
0040E34C    E8 9FF40400        call Dump.0045D7F0
0040E351    55                 push ebp
0040E352    E8 99F40400        call Dump.0045D7F0
0040E357    57                 push edi
0040E358    E8 93F40400        call Dump.0045D7F0
0040E35D    83C4 30            add esp,30
0040E360    E8 ABF40400        call Dump.0045D810
0040E365    EB 08              jmp short Dump.0040E36F
0040E367    C74424 10 01000000 mov dword ptr ss:[esp+10],1
0040E36F    8DB424 24010000    lea esi,dword ptr ss:[esp+124]
0040E376    8D8424 24020000    lea eax,dword ptr ss:[esp+224]
0040E37D    8A10               mov dl,byte ptr ds:[eax]
0040E37F    8A1E               mov bl,byte ptr ds:[esi]
0040E381    8ACA               mov cl,dl
0040E383    3AD3               cmp dl,bl
0040E385    75 1E              jnz short Dump.0040E3A5
0040E387    84C9               test cl,cl
0040E389    74 16              je short Dump.0040E3A1
0040E38B    8A50 01            mov dl,byte ptr ds:[eax+1]
0040E38E    8A5E 01            mov bl,byte ptr ds:[esi+1]
0040E391    8ACA               mov cl,dl
0040E393    3AD3               cmp dl,bl
0040E395    75 0E              jnz short Dump.0040E3A5
0040E397    83C0 02            add eax,2
0040E39A    83C6 02            add esi,2
0040E39D    84C9               test cl,cl
0040E39F  ^ 75 DC              jnz short Dump.0040E37D
0040E3A1    33C0               xor eax,eax
0040E3A3    EB 05              jmp short Dump.0040E3AA
0040E3A5    1BC0               sbb eax,eax
0040E3A7    83D8 FF            sbb eax,-1
0040E3AA    85C0               test eax,eax
0040E3AC    75 15              jnz short Dump.0040E3C3
0040E3AE    8B4C24 10          mov ecx,dword ptr ss:[esp+10]
0040E3B2    B8 01000000        mov eax,1
0040E3B7    3BC8               cmp ecx,eax
0040E3B9    74 08              je short Dump.0040E3C3
0040E3BB    8B4C24 18          mov ecx,dword ptr ss:[esp+18]
0040E3BF    85C9               test ecx,ecx
0040E3C1    75 02              jnz short Dump.0040E3C5
0040E3C3    33C0               xor eax,eax                            ; 注意这里的 xor eax,eax(如果软件没有向注册表写入信息将直接跳到这里)
0040E3C5    5F                 pop edi
0040E3C6    5E                 pop esi
0040E3C7    5D                 pop ebp
0040E3C8    5B                 pop ebx
0040E3C9    81C4 14030000      add esp,314
0040E3CF    C3                 retn


004016CB    E8 E0CA0000        call Dump.0040E1B0
004016D0    85C0               test eax,eax                           ; 退出上方注册表调用后返回到这里
004016D2    6A 00              push 0
004016D4    74 38              je short Dump.0040170E                 ; 软件暴破点!如果这里跳走,将跳到软件注册对话框函数。故修改为NOP或JNE
004016D6    A1 68654700        mov eax,dword ptr ds:[476568]          ; 思考 注册上方的test eax,eax ?
004016DB    6A 00              push 0
004016DD    6A 00              push 0
004016DF    68 78734700        push Dump.00477378                     ; ASCII "SDKTimer"
004016E4    50                 push eax
004016E5    FF15 8C554600      call dword ptr ds:[<&USER32.CreateDial>; USER32.CreateDialogParamA
004016EB    8BF0               mov esi,eax
004016ED    56                 push esi
004016EE    FF15 90554600      call dword ptr ds:[<&USER32.GetMenu>]  ; USER32.GetMenu
004016F4    8B4C24 0C          mov ecx,dword ptr ss:[esp+C]
004016F8    51                 push ecx
004016F9    56                 push esi
004016FA    FF15 94554600      call dword ptr ds:[<&USER32.ShowWindow>; USER32.ShowWindow
00401700    56                 push esi
00401701    FF15 98554600      call dword ptr ds:[<&USER32.UpdateWind>; USER32.UpdateWindow
00401707    B8 01000000        mov eax,1
0040170C    5E                 pop esi
0040170D    C3                 retn
0040170E    68 503B4000        push Dump.00403B50
00401713    6A 00              push 0
00401715    68 FCE74600        push Dump.0046E7FC                     ; ASCII "REGDLG"
0040171A    56                 push esi
0040171B    FF15 8C554600      call dword ptr ds:[<&USER32.CreateDial>; USER32.CreateDialogParamA,该Call调出软件注册对话框。
00401721    B8 01000000        mov eax,1                              
00401726    5E                 pop esi
00401727    C3                 retn


------------------------------------------------------------------------
【破解总结】教学目的:
    本次暴破软件的方法就是去掉软件启动时的注册对话框,同时让大家对软件的重启验证的注册方式有一个了解和认识。同时让大家对软件的常用API函数有一个更多的接触和了解。通过对软件的调试,我们很容易得知该软件调用注册信息框所用的API函数断点为:CreateDialogParamA 所以我们对软件直接下该断点,并向上找到跳向该Call的关键跳转,修改跳转即可达到暴破目的。
思考部分:我们注意观察这一行:004016D0    85C0    test eax,eax
该汇编语句:TEST  XXX,XXX 的意思是对两操作数做测试.(两操作数作与运算,仅修改标志位,不回送结果).
而eax的返回值来自该语句上方的call Dump.0040E1B0
上文中我让大家注意这句代码:
0040E3C3    33C0   xor eax,eax   ; 注意这里的 xor eax,eax(如果软件没有向注册表写入信息将直接跳到这里)
该汇编语句的意思是:xor eax,eax (可以简单的认为就是对EAX寄存器清零)
如果软件没有向注册表写入信息软件将直接跳到该行并执行该语句,所以我们修改这句代码即可,我使用的修改是去掉该行的异或。
两种修改方式均可达到软件暴破之目的,我们了解到软件的加密思路后,就可以有的放矢。破解方法多多,关键在于大家的多多思考,多多动手。

暴破方法整理:
01:
0040E3C3    33C0               xor eax,eax   
可修改的方案为:or eax,eax 或者 and eax,eax 或者 not eax 或者 nop掉均可(因为从该行0040E262 85C0 test eax,eax 传下来的数据中 eax的值为:00000002)

02.将0040E264    0F85 59010000      jnz Dump.0040E3C3
修改为jnz  0040E3C5 原理同上(跳过xor eax,eax 清零eax的语句 而直接到该语句的下一行代码)

03.
004016D4    74 38              je short Dump.0040170E   je修改为jne 或nop掉该语句

04.如果注册表已写入信息,可采用以下修改

0040E3AC    75 15              jnz short Dump.0040E3C3  jnz修改为jz
0040E3B9    74 08              je short Dump.0040E3C3   je修改为jne


------------------------------------------------------------------------
【版权声明】飘云阁(https://www.chinapyg.com)版权所有,转载请著名出处。
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2007-3-18 21:05:17 | 显示全部楼层
该样版还欠缺图片 一会我补充上`~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入我们

x
PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2019-3-2 15:28
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2007-3-18 21:27:45 | 显示全部楼层
    支持!我也来学习了!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-3-19 18:55:06 | 显示全部楼层
    支持~~~~Nisy 可是功德无量呀!!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-10-22 12:29
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2007-3-20 09:08:08 | 显示全部楼层
    图文并茂  将会十分吸引大家的眼睛   期待ing。。。。。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-11-22 21:56
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2007-3-23 14:07:24 | 显示全部楼层
    /:08 /:08 /:08
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-6-11 12:16
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2007-3-24 12:07:18 | 显示全部楼层
    算法分析嘛,我看不出有什么区别,模板是这样的吗/:01
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2007-3-24 13:21:28 | 显示全部楼层
    原帖由 binbinbin 于 2007-3-24 12:07 发表
    算法分析嘛,我看不出有什么区别,模板是这样的吗/:01



    恩 是的 模版其实就是破文 主要是希望大家在制作教程的时候能够心系读者 尽量的把方法和问题解释的更详细些
    PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2015-8-24 20:02
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2007-3-25 14:00:44 | 显示全部楼层
    【破文标题】开心小闹钟 2.7 Build 0107 SP1破解分析又一法
    【破文作者】Lancia
    【作者邮箱】mzdbhuyufeng@163.com
    【作者主页】https://www.chinapyg.com
    【破解工具】OD
    【破解平台】Win XP
    【软件名称】开心小闹钟 2.7 Build 0107 SP1
    【软件大小】1586KB
    【原版下载】http://www.onlinedown.net/soft/9070.htm

    【保护方式】注册码+时间限制
    【软件简介】日常生活中常常会遇到由于事务繁忙或要处理的事太多,健忘,无序的事务管理,对个人和单位造成很大麻烦 。开心小闹钟(HappyClock)就是为解决这些问题所写的。通过合理的设计,做出体贴的面向用户需要的功能,开心小闹钟还很年轻,不完善、不合理、再所难免,希望大家多提意见,一起来完善它,使其更好的为大家服务。现有功能:1、使用图形界面,内置13款皮肤,窗口形状随图形改变,外形活泼可爱,特色鲜明。2、可以设定闹铃,最大的灵活性覆盖一天24小时。3、面板功能设置,方面用户打造出更个性化的窗口界面。4、系统时间修改功能,用户不需要再通过控制面板修改时间。5、提供日历功能,可以查询今天的任意天数后是什么日期。6、提供快速提醒功能,方便临时需要闹钟的提醒。7、面板设置功能,用户操作更加灵活;8、自动保留用户设置、用户不需再为每次运行程序额外开销劳动量;9、提供多种运行选项,如保持在最前面、开机自动运行、以任务栏图标方式运行等,随用户喜爱自由设置。
    【破解声明】本人是菜鸟,以学习交流为目的,错误之处还请大侠赐教!
    ------------------------------------------------------------------------
    【破解过程】至于脱壳和找出注册码存放位置我就不重复了,具体可以参看Nisy兄弟的帖子:https://www.chinapyg.com/viewthr ... &extra=page%3D1因为我们由此可以得知注册码存放在HKEY_LOCAL_MACHINE\SOFTWARE\HappyClock\License,所在的键为Keygen,那么我们可以用OD载入脱壳后的程序,然后搜索字符串,再查找Keygen字符,得知有两个,分别对其下断,然后来到:

    0040E29D  |.  68 88F84600   PUSH Clock.0046F888                      ; |keygen
    0040E2A2  |.  50            PUSH EAX                                 ; |hKey
    0040E2A3  |.  FFD7          CALL EDI                                 ; \RegQueryValueExA
    0040E2A5  |.  8B4C24 14     MOV ECX,DWORD PTR SS:[ESP+14]
    0040E2A9  |.  51            PUSH ECX                                 ; /hKey
    0040E2AA  |.  FF15 10504600 CALL DWORD PTR DS:[<&ADVAPI32.RegCloseKe>; \RegCloseKey
    0040E2B0  |.  8D7C24 24     LEA EDI,DWORD PTR SS:[ESP+24]
    0040E2B4  |.  83C9 FF       OR ECX,FFFFFFFF
    0040E2B7  |.  33C0          XOR EAX,EAX
    0040E2B9  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
    0040E2BB  |.  F7D1          NOT ECX
    0040E2BD  |.  49            DEC ECX
    0040E2BE  |.  33FF          XOR EDI,EDI
    0040E2C0  |.  3BCF          CMP ECX,EDI
    0040E2C2  |.  894C24 18     MOV DWORD PTR SS:[ESP+18],ECX
    0040E2C6  |.  897C24 10     MOV DWORD PTR SS:[ESP+10],EDI
    0040E2CA  |.  7E 1F         JLE SHORT Clock.0040E2EB
    0040E2CC  |>  0FBE543C 24   /MOVSX EDX,BYTE PTR SS:[ESP+EDI+24]
    0040E2D1  |.  52            |PUSH EDX
    0040E2D2  |.  E8 FB350400   |CALL Clock.004518D2
    0040E2D7  |.  83C4 04       |ADD ESP,4
    0040E2DA  |.  85C0          |TEST EAX,EAX
    0040E2DC  |.  0F84 85000000 |JE Clock.0040E367
    0040E2E2  |.  8B4424 18     |MOV EAX,DWORD PTR SS:[ESP+18]
    0040E2E6  |.  47            |INC EDI
    0040E2E7  |.  3BF8          |CMP EDI,EAX
    0040E2E9  |.^ 7C E1         \JL SHORT Clock.0040E2CC
    0040E2EB  |>  8B4424 18     MOV EAX,DWORD PTR SS:[ESP+18]
    0040E2EF  |.  85C0          TEST EAX,EAX
    0040E2F1  |.  74 7C         JE SHORT Clock.0040E36F
    0040E2F3  |.  8D4424 24     LEA EAX,DWORD PTR SS:[ESP+24]
    0040E2F7  |.  50            PUSH EAX
    0040E2F8  |.  56            PUSH ESI
    0040E2F9  |.  E8 020D0500   CALL Clock.0045F000
    0040E2FE  |.  68 BCF84600   PUSH Clock.0046F8BC                      :963251dc5a9c90d9f203a03c363ba411
    0040E303  |.  55            PUSH EBP
    0040E304  |.  E8 F70C0500   CALL Clock.0045F000
    0040E309  |.  8B7C24 30     MOV EDI,DWORD PTR SS:[ESP+30]
    0040E30D  |.  68 B4F84600   PUSH Clock.0046F8B4                      ;  10001
    0040E312  |.  57            PUSH EDI
    0040E313  |.  E8 E80C0500   CALL Clock.0045F000
    0040E318  |.  55            PUSH EBP
    0040E319  |.  56            PUSH ESI
    0040E31A  |.  E8 71FA0400   CALL Clock.0045DD90
    0040E31F  |.  83C4 20       ADD ESP,20
    0040E322  |.  83F8 FF       CMP EAX,-1
    0040E325  |.  75 40         JNZ SHORT Clock.0040E367
    0040E327  |.  53            PUSH EBX
    0040E328  |.  55            PUSH EBP
    0040E329  |.  57            PUSH EDI
    0040E32A  |.  56            PUSH ESI
    0040E32B  |.  E8 500A0500   CALL Clock.0045ED80
    0040E330  |.  8D8C24 340100>LEA ECX,DWORD PTR SS:[ESP+134]
    0040E337  |.  6A 00         PUSH 0
    0040E339  |.  51            PUSH ECX
    0040E33A  |.  53            PUSH EBX
    0040E33B  |.  68 00010000   PUSH 100
    0040E340  |.  E8 3B040500   CALL Clock.0045E780
    0040E345  |.  56            PUSH ESI
    0040E346  |.  E8 A5F40400   CALL Clock.0045D7F0
    0040E34B  |.  53            PUSH EBX
    0040E34C  |.  E8 9FF40400   CALL Clock.0045D7F0
    0040E351  |.  55            PUSH EBP
    0040E352  |.  E8 99F40400   CALL Clock.0045D7F0
    0040E357  |.  57            PUSH EDI
    0040E358  |.  E8 93F40400   CALL Clock.0045D7F0
    0040E35D  |.  83C4 30       ADD ESP,30
    0040E360  |.  E8 ABF40400   CALL Clock.0045D810
    0040E365  |.  EB 08         JMP SHORT Clock.0040E36F
    0040E367  |>  C74424 10 010>MOV DWORD PTR SS:[ESP+10],1
    0040E36F  |>  8DB424 240100>LEA ESI,DWORD PTR SS:[ESP+124]
    0040E376  |.  8D8424 240200>LEA EAX,DWORD PTR SS:[ESP+224]
    0040E37D  |>  8A10          /MOV DL,BYTE PTR DS:[EAX]
    0040E37F  |.  8A1E          |MOV BL,BYTE PTR DS:[ESI]
    0040E381  |.  8ACA          |MOV CL,DL
    0040E383  |.  3AD3          |CMP DL,BL
    0040E385  |.  75 1E         |JNZ SHORT Clock.0040E3A5
    0040E387  |.  84C9          |TEST CL,CL
    0040E389  |.  74 16         |JE SHORT Clock.0040E3A1
    0040E38B  |.  8A50 01       |MOV DL,BYTE PTR DS:[EAX+1]
    0040E38E  |.  8A5E 01       |MOV BL,BYTE PTR DS:[ESI+1]
    0040E391  |.  8ACA          |MOV CL,DL
    0040E393  |.  3AD3          |CMP DL,BL
    0040E395  |.  75 0E         |JNZ SHORT Clock.0040E3A5
    0040E397  |.  83C0 02       |ADD EAX,2
    0040E39A  |.  83C6 02       |ADD ESI,2
    0040E39D  |.  84C9          |TEST CL,CL
    0040E39F  |.^ 75 DC         \JNZ SHORT Clock.0040E37D
    0040E3A1  |>  33C0          XOR EAX,EAX
    0040E3A3  |.  EB 05         JMP SHORT Clock.0040E3AA
    0040E3A5  |>  1BC0          SBB EAX,EAX
    0040E3A7  |.  83D8 FF       SBB EAX,-1
    0040E3AA  |>  85C0          TEST EAX,EAX
    0040E3AC  |.  75 15         JNZ SHORT Clock.0040E3C3
    0040E3AE  |.  8B4C24 10     MOV ECX,DWORD PTR SS:[ESP+10]
    0040E3B2  |.  B8 01000000   MOV EAX,1
    0040E3B7  |.  3BC8          CMP ECX,EAX
    0040E3B9  |.  74 08         JE SHORT Clock.0040E3C3
    0040E3BB  |.  8B4C24 18     MOV ECX,DWORD PTR SS:[ESP+18]
    0040E3BF  |.  85C9          TEST ECX,ECX
    0040E3C1  |.  75 02         JNZ SHORT Clock.0040E3C5
    0040E3C3  |>  33C0          XOR EAX,EAX
    0040E3C5  |>  5F            POP EDI
    0040E3C6  |.  5E            POP ESI
    0040E3C7  |.  5D            POP EBP
    0040E3C8  |.  5B            POP EBX
    0040E3C9  |.  81C4 14030000 ADD ESP,314
    0040E3CF  \.  C3            RETN
    ///////////////////////////////继续F8来到////////////////////////////////////////////////
    004016D0  |.  85C0          TEST EAX,EAX
    004016D2  |.  6A 00         PUSH 0                                   ; /lParam = 0
    004016D4      74 38         JE SHORT Clock.0040170E     //这里是关键跳(爆破点),修改为JNE即可。                 
    004016D6  |.  A1 68654700   MOV EAX,DWORD PTR DS:[476568]            ; |
    004016DB  |.  6A 00         PUSH 0                                   ; |pDlgProc = NULL
    004016DD  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
    004016DF  |.  68 78734700   PUSH Clock.00477378                      ; |pTemplate = "SDKTimer"
    004016E4  |.  50            PUSH EAX                                 ; |hInst => 00400000
    004016E5  |.  FF15 8C554600 CALL DWORD PTR DS:[<&USER32.CreateDialog>; \CreateDialogParamA
    004016EB  |.  8BF0          MOV ESI,EAX
    004016ED  |.  56            PUSH ESI                                 ; /hWnd
    004016EE  |.  FF15 90554600 CALL DWORD PTR DS:[<&USER32.GetMenu>]    ; \GetMenu
    004016F4  |.  8B4C24 0C     MOV ECX,DWORD PTR SS:[ESP+C]
    004016F8  |.  51            PUSH ECX                                 ; /ShowState
    004016F9  |.  56            PUSH ESI                                 ; |hWnd
    004016FA  |.  FF15 94554600 CALL DWORD PTR DS:[<&USER32.ShowWindow>] ; \ShowWindow
    00401700  |.  56            PUSH ESI                                 ; /hWnd
    00401701  |.  FF15 98554600 CALL DWORD PTR DS:[<&USER32.UpdateWindow>; \UpdateWindow
    00401707  |.  B8 01000000   MOV EAX,1
    0040170C  |.  5E            POP ESI
    0040170D  |.  C3            RETN
    0040170E  |>  68 503B4000   PUSH Clock.00403B50                      ; |pDlgProc = Clock.00403B50
    00401713  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
    00401715  |.  68 FCE74600   PUSH Clock.0046E7FC                      ; |pTemplate = "REGDLG"
    0040171A  |.  56            PUSH ESI                                 ; |hInst
    0040171B  |.  FF15 8C554600 CALL DWORD PTR DS:[<&USER32.CreateDialog>; \CreateDialogParamA     //这里程序运行起来。




    ------------------------------------------------------------------------
    【破解总结】
    ------------------------------------------------------------------------
    【版权声明】

    [ 本帖最后由 Lancia 于 2007-3-25 14:05 编辑 ]
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表