- UID
- 2198
注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主
该用户从未签到
|
楼主 |
发表于 2007-3-18 11:34:36
|
显示全部楼层
【破文标题】开心小闹钟 2.7 Build 0107 SP1 简单分析
【破文作者】Nisy[PYG]
【作者邮箱】[email protected]
【作者主页】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)版权所有,转载请著名出处。 |
|