1 picad2006update200707加密狗的爆破
——无狗也能打狗,菜鸟笨拙破解
标 题: picad2006update200707加密狗的爆破
作 者: chinglq
时 间: 2007-09-25
链 接:
详细信息:
【破解工具】OD v1.10汉化第二版
【破解平台】xpsp2
【破解目的】解密练习
【软件名称】PICAD2006
【原版下载】http://www.picad.com.cn/4_download.htm
【软件简介】官网上共三个文件:Picad2006 [24.5M]、Picad2006Update [1.5M]、Picad2006Update200707。依次安装。
适合机械类专业用的国产CAD软件,保护方式是:加密狗或注册码。属于功能限制类。
1. 破解过程:
首先用PEiD检测,无壳,是VC++6.0编的。
依据程序启动提示,用OD装载后,来到这里:
0051869B |. /74 24 je short 005186C1
0051869D |. |6A 00 push 0 ; 最远的必经之路
0051869F |. |6A 00 push 0
005186A1 |. |68 0080CF00 push 0CF8000
005186A6 |. |68 12270000 push 2712
005186AB |. |8B55 F0 mov edx, dword ptr [ebp-10]
005186AE |. |8B02 mov eax, dword ptr [edx]
005186B0 |. |8B4D F0 mov ecx, dword ptr [ebp-10]
005186B3 |. |FF90 C0000000 call dword ptr [eax+C0]
005186B9 |. |85C0 test eax, eax
005186BB |. |0F85 88000000 jnz 00518749 ; 第一段
005186C1 |> \837D F0 00 cmp dword ptr [ebp-10], 0
--------------------------------
00518744 |. E9 26020000 jmp 0051896F ; 绕道
00518749 |> E8 4C7E0600 call 0058059A ; 断点 按F7追进
0051874E |. 85C0 test eax, eax
00518750 |. 0F95C0 setne al
00518753 |. 8B4D F0 mov ecx, dword ptr [ebp-10]
00518756 |. 8881 C4000000 mov byte ptr [ecx+C4], al
0051875C |. 8B55 F0 mov edx, dword ptr [ebp-10]
0051875F |. 33C0 xor eax, eax
00518761 |. 8A82 C4000000 mov al, byte ptr [edx+C4]
00518767 |. 85C0 test eax, eax
00518769 |. 0F84 A8000000 je 00518817 ; 最后一道防线 -->jne 00518817
0051876F |. 6A 31 push 31
00518771 |. 8D4D C0 lea ecx, dword ptr [ebp-40]
00518774 |. E8 A75C0400 call 0055E420
00518779 |. 50 push eax ; |Title
0051877A |. 68 DC506000 push 006050DC ; |没有加密授权,无法使用存盘等功能!
0051877F |. 8B4D F0 mov ecx, dword ptr [ebp-10] ; |
00518782 |. 8B51 20 mov edx, dword ptr [ecx+20] ; |
00518785 |. 52 push edx ; |hOwner
00518786 |. FF15 C44A5D00 call dword ptr [<&USER32.MessageBoxA>] ; \MessageBoxA
0051878C |. 83F8 02 cmp eax, 2
0051878F |. 0F85 82000000 jnz 00518817
00518795 |. 8B45 F0 mov eax, dword ptr [ebp-10]
首先在最远的必经之路下断点,在0051869D-005186BB、00518749-00518769这两段各有一个CALL,第一次调试发现第一段的CALL没什么,
所以改断点到00518749的CALL(也只有这一个地方啦),由此追进:
0058059A /$ 55 push ebp
0058059B |. 8BEC mov ebp, esp
--------------------------------------
00580681 |. 50 push eax ; /IniFileName
00580682 |. 6A 28 push 28 ; |BufSize = 28 (40.)
00580684 |. 8D85 C4FBFFFF lea eax, dword ptr [ebp-43C] ; |
0058068A |. 50 push eax ; |ReturnBuffer
0058068B |. 68 B8676200 push 006267B8 ; |Default = ""
00580690 |. 68 78DE6000 push 0060DE78 ; |Key = "HeatBeat"
00580695 |. 68 84DE6000 push 0060DE84 ; |Section = "RockInfo"
0058069A |. FF15 84315D00 call dword ptr [<&KERNEL32.GetPrivateProfileStrin>; \GetPrivateProfileStringA
---------------------------------------------
00580772 |. 50 push eax ; /IniFileName
00580773 |. 6A 14 push 14 ; |BufSize = 14 (20.)
00580775 |. 8D8D A4FBFFFF lea ecx, dword ptr [ebp-45C] ; |
0058077B |. 51 push ecx ; |ReturnBuffer
0058077C |. 68 C0676200 push 006267C0 ; |Default = ""
00580781 |. 68 C0DE6000 push 0060DEC0 ; |Key = "RockType"
00580786 |. 68 CCDE6000 push 0060DECC ; |Section = "RockInfo"
0058078B |. FF15 84315D00 call dword ptr [<&KERNEL32.GetPrivateProfileStrin>; \GetPrivateProfileStringA
00580791 |. C645 FC 00 mov byte ptr [ebp-4], 0
00580795 |. 8D8D 94FBFFFF lea ecx, dword ptr [ebp-46C]
0058079B |. E8 BC000300 call <jmp.&MFC42.#800_CString::~CString>
005807A0 |. 8D95 A4FBFFFF lea edx, dword ptr [ebp-45C]
005807A6 |. 52 push edx ; /s
005807A7 |. FF15 F43E5D00 call dword ptr [<&MSVCRT.atol>] ; \atol
005807AD |. 83C4 04 add esp, 4
005807B0 |. 8985 C0FBFFFF mov dword ptr [ebp-440], eax
005807B6 |. 8B85 C0FBFFFF mov eax, dword ptr [ebp-440]
005807BC |. 8945 C8 mov dword ptr [ebp-38], eax
005807BF |. 8D8D C0FBFFFF lea ecx, dword ptr [ebp-440]
005807C5 |. 51 push ecx ; /Arg1
005807C6 |. E8 F5180300 call 005B20C0 ; \Picad.005B20C0 ; 按F7追进
005807CB |. 8985 BCFBFFFF mov dword ptr [ebp-444], eax
005807D1 |. 83BD BCFBFFFF 00 cmp dword ptr [ebp-444], 0
005807D8 |. 0F85 89000000 jnz 00580867
----------------------------------------------------------------
0058083E |. 50 push eax ; /FileName
0058083F |. 8D95 C4FBFFFF lea edx, dword ptr [ebp-43C] ; |
00580845 |. 52 push edx ; |String
00580846 |. 68 E8DE6000 push 0060DEE8 ; |Key = "RockType"
0058084B |. 68 F4DE6000 push 0060DEF4 ; |Section = "RockInfo"
00580850 |. FF15 B4315D00 call dword ptr [<&KERNEL32.WritePrivateProfileStr>; \WritePrivateProfileStringA
-----------------------------------------------
005808FC |. 8BE5 mov esp, ebp
005808FE |. 5D pop ebp
005808FF \. C3 retn
呵呵!看到了Key = "RockType"和Section = "RockInfo",还有读写配置文件呢!狗来啦!狗来啦!查仔细点,好啦,就在005807C6那里
。追进:
005B20C0 /$ 6A FF push -1
005B20C2 |. 68 29275D00 push 005D2729 ; SE 处理程序安装
005B20C7 |. 64:A1 00000000 mov eax, dword ptr fs:[0]
005B20CD |. 50 push eax
005B20CE |. 64:8925 00000000 mov dword ptr fs:[0], esp
005B20D5 |. 81EC 0C040000 sub esp, 40C
005B20DB |. 56 push esi
005B20DC |. E8 6BE8FFFF call <jmp.&MFC42.#1168_AfxGetModuleState>
005B20E1 |. 8B40 04 mov eax, dword ptr [eax+4]
005B20E4 |. 8D4C24 0C lea ecx, dword ptr [esp+C]
005B20E8 |. 68 00040000 push 400 ; /BufSize = 400 (1024.)
005B20ED |. 51 push ecx ; |PathBuffer
005B20EE |. 8B50 6C mov edx, dword ptr [eax+6C] ; |
005B20F1 |. 52 push edx ; |hModule
005B20F2 |. FF15 88315D00 call dword ptr [<&KERNEL32.GetModuleFileNameA>] ; \GetModuleFileNameA
005B20F8 |. 8D4424 0C lea eax, dword ptr [esp+C]
005B20FC |. B9 28D86200 mov ecx, 0062D828
005B2101 |. 50 push eax
005B2102 |. E8 51E8FFFF call <jmp.&MFC42.#860_CString::operator=>
005B2107 |. 6A 5C push 5C
005B2109 |. B9 28D86200 mov ecx, 0062D828
005B210E |. E8 AFEDFFFF call <jmp.&MFC42.#5683_CString::ReverseFind>
005B2113 |. 40 inc eax
005B2114 |. 8D4C24 04 lea ecx, dword ptr [esp+4]
005B2118 |. 50 push eax
005B2119 |. 6A 00 push 0
005B211B |. 51 push ecx
005B211C |. B9 28D86200 mov ecx, 0062D828
005B2121 |. E8 78EDFFFF call <jmp.&MFC42.#4278_CString::Mid>
005B2126 |. 50 push eax
005B2127 |. B9 28D86200 mov ecx, 0062D828
005B212C |. C78424 1C040000 00000000 mov dword ptr [esp+41C], 0
005B2137 |. E8 B0E7FFFF call <jmp.&MFC42.#858_CString::operator=>
005B213C |. 83CE FF or esi, FFFFFFFF
005B213F |. 8D4C24 04 lea ecx, dword ptr [esp+4]
005B2143 |. 89B424 18040000 mov dword ptr [esp+418], esi
005B214A |. E8 0DE7FFFF call <jmp.&MFC42.#800_CString::~CString>
005B214F |. 8B0D 2CD86200 mov ecx, dword ptr [62D82C] ; 得到狗标记
005B2155 |. 85C9 test ecx, ecx
005B2157 |. 75 3F jnz short 005B2198 ; -->nop nop
005B2159 |. 6A 04 push 4
005B215B |. E8 2CE7FFFF call <jmp.&MFC42.#823_operator new>
005B2160 |. 83C4 04 add esp, 4
005B2163 |. 894424 08 mov dword ptr [esp+8], eax
005B2167 |. 85C0 test eax, eax
005B2169 |. C78424 18040000 01000000 mov dword ptr [esp+418], 1
005B2174 |. 74 09 je short 005B217F
005B2176 |. 8BC8 mov ecx, eax
005B2178 |. E8 33020000 call 005B23B0
005B217D |. EB 02 jmp short 005B2181
005B217F |> 33C0 xor eax, eax
005B2181 |> 8BC8 mov ecx, eax
005B2183 |. 89B424 18040000 mov dword ptr [esp+418], esi
005B218A |. 85C0 test eax, eax
005B218C |. 890D 2CD86200 mov dword ptr [62D82C], ecx ; 写狗标记
005B2192 |. 75 04 jnz short 005B2198 ; -->nop nop
005B2194 |. 8BC6 mov eax, esi
005B2196 |. EB 1A jmp short 005B21B2 ; 有狗就跳
005B2198 |> 8BB424 20040000 mov esi, dword ptr [esp+420]
005B219F |. 8B16 mov edx, dword ptr [esi]
005B21A1 |. 52 push edx
005B21A2 |. E8 29020000 call 005B23D0 ; \Picad.005B23D0 ; 注册码比较
005B21A7 |. 33C9 xor ecx, ecx
005B21A9 |. 8906 mov dword ptr [esi], eax
005B21AB |. 85C0 test eax, eax
005B21AD |. 0F9CC1 setl cl
005B21B0 |. 8BC1 mov eax, ecx
005B21B2 |> 8B8C24 10040000 mov ecx, dword ptr [esp+410]
005B21B9 |. 5E pop esi
005B21BA |. 64:890D 00000000 mov dword ptr fs:[0], ecx
005B21C1 |. 81C4 18040000 add esp, 418
005B21C7 \. C2 0400 retn 4
呵呵,狗检验和注册检验都有!还必须先检查狗,有狗就不管注册。无狗才查注册,且费时较长。由于启动检验只是作以警告,功能使用时
还要另行检验,这一部分就让它跳过费时的注册检验能快速启动就行了,共改动三处跳转。重要的是发现了狗标记[62D82C],这个地方隐藏着
关键性的东西。无狗破解不可能知道正确内容,但爆破是不用管内容的。只要在调用它时,报喜不报忧就行。这样,在整个程序搜索一下,共
有六处,分为四段程序。上面有两个,下面一段有两个:
005B21D0 /$ 56 push esi
005B21D1 |. 8B35 2CD86200 mov esi, dword ptr [62D82C]
005B21D7 |. 85F6 test esi, esi
005B21D9 |. 74 10 je short 005B21EB
005B21DB |. 8BCE mov ecx, esi
005B21DD |. E8 DE010000 call 005B23C0
005B21E2 |. 56 push esi ; /block
005B21E3 |. E8 9EE6FFFF call <jmp.&MFC42.#825_operator delete> ; \free
005B21E8 |. 83C4 04 add esp, 4
005B21EB |> C705 2CD86200 00000000 mov dword ptr [62D82C], 0
005B21F5 |. 33C0 xor eax, eax
005B21F7 |. 5E pop esi
005B21F8 \. C3 retn
这段程序调用就赋零清空,估计是初始化时用的。可以不用理它,再看看下面两段:
005B2200 $ 8B0D 2CD86200 mov ecx, dword ptr [62D82C]
005B2206 . 85C9 test ecx, ecx
005B2208 75 04 jnz short 005B220E ---\ B800000000 mov eax, 0
005B220A . 83C8 FF or eax, FFFFFFFF ---/
005B220D . C3 retn
005B220E > E9 4D050000 jmp 005B2760
............................
005B2760 > \8B09 mov ecx, dword ptr [ecx]
005B2762 . 85C9 test ecx, ecx
005B2764 74 05 je short 005B276B
005B2766 . 8B01 mov eax, dword ptr [ecx]
005B2768 . FF60 0C jmp dword ptr [eax+C]
005B276B > 83C8 FF or eax, FFFFFFFF
005B276E . C3 retn
------------------------------------------------------------------------
005B2390 /$ 8B0D 2CD86200 mov ecx, dword ptr [62D82C]
005B2396 |. 85C9 test ecx, ecx
005B2398 |. 74 05 je short 005B239F ---\ E8D1030000 call 005B2770
005B239A |. E8 D1030000 call 005B2770 | B800000000 mov eax, 0
005B239F |> 83C8 FF or eax, FFFFFFFF ---/
005B23A2 \. C3 retn
终于来到关键地方了!这两段调用了狗标记的值,还输出成功与否的EAX值。那就动手吧,在前边就动,令EAX=0就行。改好程序试一下:
启动特快,功能限制解除,显示“您使用的是硬加密,可以不注册软件。”,哈哈哈!欣喜若狂!……慢着!嘭!弹出一个对话框:“加密锁
失效,无法使用存盘等功能!”,蒙了!难道还有暗桩?甭急,先检查检查。各项功能依然能够使用,原来是虚惊一场。这好办,打开OD先看看
:
0050C598 /. 55 push ebp
0050C599 |. 8BEC mov ebp, esp
0050C59B |. 51 push ecx
0050C59C |. 894D FC mov dword ptr [ebp-4], ecx
0050C59F |. E8 FCD90900 call 005A9FA0 ; 好象是检测注册与否
0050C5A4 |. 833D 30D86200 00 cmp dword ptr [62D830], 0
0050C5AB |. 7E 33 jle short 0050C5E0
0050C5AD |. A1 EC496200 mov eax, dword ptr [6249EC]
0050C5B2 |. 83C0 01 add eax, 1 ; 记数器
0050C5B5 |. A3 EC496200 mov dword ptr [6249EC], eax
0050C5BA |. A1 30D86200 mov eax, dword ptr [62D830]
0050C5BF |. D1E0 shl eax, 1
0050C5C1 |. 99 cdq
0050C5C2 |. B9 1E000000 mov ecx, 1E
0050C5C7 |. F7F9 idiv ecx
0050C5C9 |. 3905 EC496200 cmp dword ptr [6249EC], eax
0050C5CF |. 7C 0F jl short 0050C5E0
0050C5D1 |. E8 BA5D0A00 call 005B2390 ; 检测狗标记
0050C5D6 |. C705 EC496200 00000000 mov dword ptr [6249EC], 0
0050C5E0 |> 8B55 FC mov edx, dword ptr [ebp-4]
0050C5E3 |. 33C0 xor eax, eax
0050C5E5 |. 8A82 C4000000 mov al, byte ptr [edx+C4]
0050C5EB |. 85C0 test eax, eax
0050C5ED |. 74 3F je short 0050C62E
0050C5EF |. 8B0D F0496200 mov ecx, dword ptr [6249F0]
0050C5F5 |. 83C1 01 add ecx, 1 ; 记数器
0050C5F8 |. 890D F0496200 mov dword ptr [6249F0], ecx
0050C5FE |. 833D F0496200 1E cmp dword ptr [6249F0], 1E
0050C605 |. 7C 27 jl short 0050C62E
0050C607 |. C705 F0496200 00000000 mov dword ptr [6249F0], 0
0050C611 |. E8 EA5B0A00 call 005B2200 ; 检测狗标记
0050C616 |. 85C0 test eax, eax
0050C618 |. 75 14 jnz short 0050C62E
0050C61A |. 6A 10 push 10
0050C61C |. 68 A04E6000 push 00604EA0 ; ASCII "PICAD"
0050C621 |. 68 A84E6000 push 00604EA8 ; 加密锁失效,无法使用存盘等功能!
0050C626 |. 8B4D FC mov ecx, dword ptr [ebp-4]
0050C629 |. E8 10450A00 call <jmp.&MFC42.#4224_CWnd::MessageBoxA>
0050C62E |> 8B55 08 mov edx, dword ptr [ebp+8]
0050C631 |. 52 push edx ; /Arg1
0050C632 |. 8B4D FC mov ecx, dword ptr [ebp-4] ; |
0050C635 |. E8 F60C0000 call 0050D330 ; \Picad.0050D330
0050C63A |. 8BE5 mov esp, ebp
0050C63C |. 5D pop ebp
0050C63D \. C2 0400 retn 4
先分析一下:看到两个熟悉的CALL,检测狗标记的,还有两个记数器,大概是定时检测狗的。未改动不见它出来,改后便频繁出现,莫非
检测方式不同?下好断点,调试一下。程序连续不断反复运行,果然是定时检测狗(和注册标志)的。第一个CALL就使EAX=1,以后都是入1出0
,难怪后面应付不了。为了满足入0出0,入1出1的需要,看来得重新修改那关键两段程序了。在程序中不改变EAX的值,直接让它跳到返回语句。改动如下:
005B2208 7504 jne 005B220E ---> ; EB03 jmp short 005B220D
。。。。。。。。。。。。。。。。。。。。。。。。
005B2398 7405 je 005B239F ---> ; EB08 jmp short 005B23A2
再一试,大功告成,全部OK!
好啦,抄下地址,打开UltraEdit-32改吧:
00518769 0F84 A8000000 ---> 0F85 A8000000
005B2157 753F ---> 9090
005B2192 7504 ---> 9090
005B2208 7504 ---> EB03
005B2398 7405 ---> EB08
2. 过程总结
这是菜鸟学破解的处女作,不懂汇编,只知道跳转和赋值,方法粗苯至极,让行家见笑了。还请多多指教!
确定关键CALL的方法极不正规:依据EAX值,入0出1,则不正常,需要按F7追进。望能指点正道!
尽管不懂汇编,但有VB编程基础,查看跳转,还算凑合。菜鸟也能打狗,实乃万幸也!
方法苯拙,让方家见笑。若能指点巧妙正规的方法,本人不胜感激!
本文权作中秋献礼,祝大家中秋快乐!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课