[I]by:dsong @ 看雪论坛[bbs.pediy.com][/I]
==================== 声明 ====================
以下内容是给想要学习破解的人看的,里面有我个人经历以及破解时的阻碍和想法。
所以请伸手党们快快离开.
我也是个菜鸟,所以这篇文章中的程序是不包含花指令、VM、混淆等的保护的,代码可读性是较好的,但是又由于是年轻的版本,所以破解的时候和2005年前后的程序肯定又有了一些不同之处。当然高手就快快绕过,这种给学过一点破解的人看可能会有些帮助。当然0基础不能直接看,另找更简单、更老的程序吧。
====================写在前面====================
这篇文章我在吾爱破解论坛已经发过了,顺便在这里也发一下...... (算是"转"我自己的帖,呵呵。)我之前也发过一个帖,但是那个不适合初学者看,因为讲得很不清楚,一些东西怎么得出的我都没说。而且当时有个暗桩没有去除,现在我去除了,但是方法我先不说,等有人回帖说了方法后,我再说我自己的方法。
还有在吾爱我发现有很多伸手党,这篇文章发到看雪来不知会不会出现
真正的"交流分享"的效果呢?
我本来其实不是很想写出来的,但经过考虑,还是放出来吧。但愿软件官方不会把他们程序改复杂的......(因为我下载了垃圾公司的软件,发现它的程序反调试加了好多,我的OD撑不住,而吾爱的OD我又不会设置......老是不能正常运行。垃圾公司的我做了一个Loader,不完美的,因为下了断点它会检测到,所以不打算继续尝试了。还有一个FlashDecompilerTrillix,我还在研究怎么脱掉它的穿山甲壳呢,因为它的脱壳和天草黑鹰教程里面的穿山甲壳很不一样......唉,学习的路还很长啊。)
====================破解步骤====================
(一)彻底去掉程序注册弹框+未注册水印
<方法一>简单方法,低级
这个方法非常简单,但是有些破解初学者(指已经看完了黑鹰初级的)就会有卡掉的地方,我们来具体分析看看。
首先,载入OD,程序有点大,得等一会。
从一个初学者角度来看,第一个是做什么呢,查壳(废话,这是必须的)得:Microsoft Visual C++ 8 [Overlay] * . 恩,很好,没加壳。(而且根据后面分析,代码可读性很好)
下面一个才是真的初学者才做的,查找字符串!看到结果有6542个字符串,是不是很心动呢?我们来看注册提示窗口,标题:欢迎使用......;内容:未注册......。哈,找到重点了。但是一看字符串就傻眼了,基本都是英文,没有什么有用的中文字。而且英文的什么unregistered也都查不到。然后,到了这里,有一半的初学者就阵亡了,很可能把程序扔进回收站了。然后另一半很聪明,让程序先跑起来(这就是今天要讲的方法),然后弹框出现,就在 OD按暂停,看堆栈。[或者你直接Ctrl+N看函数下段,问题是你能够断下来吗?那么多函数你要一个个试?;-)算了,告诉你这个程序你要想拦截到有用的,找函数结尾是W的下段。]
调用堆栈
地址 堆栈 函数例程 / 参数 调用来自 框架
0012F0F0 77D191BE 包含 ntdll.KiFastSystemCallRet USER32.77D191BC 0012F10C
0012F0F4 77D191F1 USER32.77D191B2 USER32.77D191EC 0012F10C
0012F110 7882183C USER32.GetMessageW mfc100u.78821836 0012F10C
0012F114 00144BD0 pMsg = 00144BD0
0012F118 00000000 hWnd = NULL
0012F11C 00000000 MsgFilterMin = 0
0012F120 00000000 MsgFilterMax = 0
0012F12C 78837E81 mfc100u.7882186D mfc100u.78837E7C 0012F154
0012F158 787D5B04 mfc100u.78837DB9 mfc100u.787D5AFF 0012F154
0012F15C 00000004 Arg1 = 00000004
0012F1A4 0047F76B ? <jmp.&mfc100u.#3627> XXXXXXX7.0047F766 0012F1A0
0012FF1C 788477C6 XXXXXXX7.0047DD60 mfc100u.788477C3 0012FF18
0012FF30 0063C2DB ? XXXXXXX7.0063EBBC XXXXXXX7.0063C2D6 0012FF2C
找哪个好呢?我也不知道;-). 反正我找的是:
0012F110 7882183C USER32.GetMessageW mfc100u.78821836 0012F10C
这个,右键,显示调用。
从段头到段尾:
7882181D CC int3
7882181E CC int3
7882181F CC int3
78821820 CC int3
78821821 CC int3
78821822 8BFF mov edi,edi
78821824 56 push esi
78821825 57 push edi
78821826 E8 DD80F0FF call mfc100u.78729908
7882182B 8BF0 mov esi,eax
7882182D 33C0 xor eax,eax
7882182F 50 push eax
78821830 50 push eax
78821831 50 push eax
78821832 8D7E 30 lea edi,dword ptr ds:[esi+30]
78821835 57 push edi
78821836 FF15 F8185F78 call dword ptr ds:[<&USER32.GetMessageW>; USER32.GetMessageW //到了这里
7882183C 85C0 test eax,eax
7882183E 74 25 je short mfc100u.78821865
78821840 817E 34 6A030000 cmp dword ptr ds:[esi+34],36A
78821847 74 19 je short mfc100u.78821862
78821849 57 push edi
7882184A E8 02010000 call mfc100u.78821951
7882184F 59 pop ecx
78821850 85C0 test eax,eax
78821852 75 0E jnz short mfc100u.78821862
78821854 57 push edi
78821855 FF15 241A5F78 call dword ptr ds:[<&USER32.TranslateMe>; USER32.TranslateMessage
7882185B 57 push edi
7882185C FF15 201A5F78 call dword ptr ds:[<&USER32.DispatchMes>; USER32.DispatchMessageW
78821862 33C0 xor eax,eax
78821864 40 inc eax
78821865 5F pop edi
78821866 5E pop esi
78821867 C3 retn
然后又有一半菜鸟像我以前一样,一看,唉,居然没有跳转跳过这里!然后反复捣鼓弄不好,就扔进回收站了。(回收站你好辛苦,还有多少空间啊?)
其实,这里是一个整个Call都导致了弹窗发生。所以直接retn处下断,重新运行程序到这个位置,再F8,到达上一层Call!
新世界:
78837DB4 CC int3
78837DB5 CC int3
78837DB6 CC int3
78837DB7 CC int3
78837DB8 CC int3
78837DB9 8BFF mov edi,edi
78837DBB 55 push ebp
78837DBC 8BEC mov ebp,esp
78837DBE 83EC 18 sub esp,18
78837DC1 53 push ebx
78837DC2 56 push esi
78837DC3 33DB xor ebx,ebx
78837DC5 57 push edi
78837DC6 43 inc ebx
78837DC7 33FF xor edi,edi
78837DC9 F645 08 04 test byte ptr ss:[ebp+8],4
78837DCD 8BF1 mov esi,ecx
78837DCF 895D F4 mov dword ptr ss:[ebp-C],ebx
78837DD2 897D F8 mov dword ptr ss:[ebp-8],edi
78837DD5 74 0F je short mfc100u.78837DE6
78837DD7 E8 8A210100 call mfc100u.78849F66
78837DDC 895D FC mov dword ptr ss:[ebp-4],ebx
78837DDF A9 00000010 test eax,10000000
78837DE4 74 03 je short mfc100u.78837DE9
78837DE6 897D FC mov dword ptr ss:[ebp-4],edi
78837DE9 FF76 20 push dword ptr ds:[esi+20]
78837DEC FF15 1C185F78 call dword ptr ds:[<&USER32.GetParent>] ; USER32.GetParent
78837DF2 834E 58 18 or dword ptr ds:[esi+58],18
78837DF6 8945 EC mov dword ptr ss:[ebp-14],eax
78837DF9 E8 0A1BEFFF call mfc100u.78729908
78837DFE 8B1D 30185F78 mov ebx,dword ptr ds:[<&USER32.UpdateWi>; USER32.UpdateWindow
78837E04 83C0 30 add eax,30
78837E07 8945 F0 mov dword ptr ss:[ebp-10],eax
78837E0A EB 6B jmp short mfc100u.78837E77
78837E0C 57 push edi
78837E0D 57 push edi
78837E0E 57 push edi
78837E0F 57 push edi
78837E10 FF75 F0 push dword ptr ss:[ebp-10]
78837E13 FF15 281A5F78 call dword ptr ds:[<&USER32.PeekMessage>; USER32.PeekMessageW
78837E19 85C0 test eax,eax
78837E1B 75 5F jnz short mfc100u.78837E7C
78837E1D 397D FC cmp dword ptr ss:[ebp-4],edi
78837E20 74 11 je short mfc100u.78837E33
78837E22 6A 01 push 1
78837E24 8BCE mov ecx,esi
78837E26 E8 D8230100 call mfc100u.7884A203
78837E2B FF76 20 push dword ptr ds:[esi+20]
78837E2E FFD3 call ebx
78837E30 897D FC mov dword ptr ss:[ebp-4],edi
78837E33 F645 08 01 test byte ptr ss:[ebp+8],1
78837E37 75 1C jnz short mfc100u.78837E55
78837E39 397D EC cmp dword ptr ss:[ebp-14],edi
78837E3C 74 17 je short mfc100u.78837E55
78837E3E 397D F8 cmp dword ptr ss:[ebp-8],edi
78837E41 75 12 jnz short mfc100u.78837E55
78837E43 FF76 20 push dword ptr ds:[esi+20]
78837E46 57 push edi
78837E47 68 21010000 push 121
78837E4C FF75 EC push dword ptr ss:[ebp-14]
78837E4F FF15 54185F78 call dword ptr ds:[<&USER32.SendMessage>; USER32.SendMessageW
78837E55 F645 08 02 test byte ptr ss:[ebp+8],2
78837E59 75 19 jnz short mfc100u.78837E74
78837E5B FF75 F8 push dword ptr ss:[ebp-8]
78837E5E 57 push edi
78837E5F 68 6A030000 push 36A
78837E64 FF76 20 push dword ptr ds:[esi+20]
78837E67 FF15 54185F78call dword ptr ds:[<&USER32.SendMessage>; USER32.SendMessageW
78837E6D FF45 F8 inc dword ptr ss:[ebp-8]
78837E70 85C0 test eax,eax
78837E72 75 03 jnz short mfc100u.78837E77
78837E74 897D F4 mov dword ptr ss:[ebp-C],edi
78837E77 397D F4 cmp dword ptr ss:[ebp-C],edi
78837E7A ^ 75 90 jnz short mfc100u.78837E0C
78837E7C E8 EC99FEFF call mfc100u.7882186D
78837E81 85C0 test eax,eax
78837E83 74 62 je short mfc100u.78837EE7
78837E85 397D FC cmp dword ptr ss:[ebp-4],edi
78837E88 74 25 je short mfc100u.78837EAF
78837E8A 8B45 F0 mov eax,dword ptr ss:[ebp-10]
78837E8D 8B40 04 mov eax,dword ptr ds:[eax+4]
78837E90 3D 18010000 cmp eax,118
78837E95 74 07 je short mfc100u.78837E9E
78837E97 3D 04010000 cmp eax,104
78837E9C 75 11 jnz short mfc100u.78837EAF
78837E9E 6A 01 push 1
78837EA0 8BCE mov ecx,esi
78837EA2 E8 5C230100 call mfc100u.7884A203
78837EA7 FF76 20 push dword ptr ds:[esi+20]
78837EAA FFD3 call ebx
78837EAC 897D FC mov dword ptr ss:[ebp-4],edi
78837EAF 8B06 mov eax,dword ptr ds:[esi]
78837EB1 8BCE mov ecx,esi
78837EB3 FF90 90000000call dword ptr ds:[eax+90]
78837EB9 85C0 test eax,eax
78837EBB 74 35 je short mfc100u.78837EF2
78837EBD FF75 F0 push dword ptr ss:[ebp-10]
78837EC0 E8 209BFEFF call mfc100u.788219E5
78837EC5 59 pop ecx
78837EC6 85C0 test eax,eax
78837EC8 74 0A je short mfc100u.78837ED4
78837ECA C745 F4 01000000mov dword ptr ss:[ebp-C],1
78837ED1 897D F8 mov dword ptr ss:[ebp-8],edi
78837ED4 57 push edi
78837ED5 57 push edi
78837ED6 57 push edi
78837ED7 57 push edi
78837ED8 FF75 F0 push dword ptr ss:[ebp-10]
78837EDB FF15 281A5F78call dword ptr ds:[<&USER32.PeekMessage>; USER32.PeekMessageW
78837EE1 85C0 test eax,eax
78837EE3 ^ 75 97 jnz short mfc100u.78837E7C
78837EE5 ^ EB 90 jmp short mfc100u.78837E77
78837EE7 57 push edi
78837EE8 E8 D976F6FF call mfc100u.7879F5C6
78837EED 83C8 FF or eax,FFFFFFFF
78837EF0 EB 07 jmp short mfc100u.78837EF9
78837EF2 8366 58 E7 and dword ptr ds:[esi+58],FFFFFFE7
78837EF6 8B46 60 mov eax,dword ptr ds:[esi+60]
78837EF9 5F pop edi
78837EFA 5E pop esi
78837EFB 5B pop ebx
78837EFC C9 leave
78837EFD C2 0400 retn 4
聪明的你这时应该也注意到,这个新世界也没什么用,所以再在retn处F4,再走出一层!
(这时候,OD显示运行,需要对程序按下“继续”以后,OD才会再次回到你的手中!)
新新世界(由于前面太大,为了避免被认为恶意灌水,所以就浓缩成六个点吧):
......
787D5AE0 /74 3A je short mfc100u.787D5B1C
787D5AE2 |F646 58 10 test byte ptr ds:[esi+58],10
787D5AE6 |74 1E je short mfc100u.787D5B06
787D5AE8 |6A 04 push 4
787D5AEA |5B pop ebx
787D5AEB |8BCE mov ecx,esi
787D5AED |E8 74440700 call mfc100u.78849F66
787D5AF2 |A9 00010000 test eax,100
787D5AF7 |74 03 je short mfc100u.787D5AFC
787D5AF9 |6A 05 push 5
787D5AFB |5B pop ebx
787D5AFC |53 push ebx
787D5AFD |8BCE mov ecx,esi
787D5AFF |E8 B5220600 call mfc100u.78837DB9
787D5B04 33DB xor ebx,ebx ; 我们到了这里
787D5B06 |395E 20 cmp dword ptr ds:[esi+20],ebx
787D5B09 |74 11 je short mfc100u.787D5B1C
787D5B0B |68 97000000 push 97
787D5B10 |53 push ebx
787D5B11 |53 push ebx
787D5B12 |53 push ebx
787D5B13 |53 push ebx
787D5B14 |53 push ebx
787D5B15 |8BCE mov ecx,esi
787D5B17 |E8 A4460700 call mfc100u.7884A1C0
787D5B1C \834D FC FF or dword ptr ss:[ebp-4],FFFFFFFF
787D5B20 EB 25 jmp short mfc100u.787D5B47
787D5B22 8B4D D4 mov ecx,dword ptr ss:[ebp-2C]
787D5B25 85C9 test ecx,ecx
787D5B27 74 05 je short mfc100u.787D5B2E
787D5B29 E8 7C530100 call mfc100u.787EAEAA
787D5B2E 8B45 E4 mov eax,dword ptr ss:[ebp-1C]
787D5B31 8348 60 FF or dword ptr ds:[eax+60],FFFFFFFF
787D5B35 834D FC FF or dword ptr ss:[ebp-4],FFFFFFFF
787D5B39 B8 3F5B7D78 mov eax,mfc100u.787D5B3F
787D5B3E C3 retn
到了这里有两条路,第一条是给那些看到跳转跳过了就非常敏感的人,而第二条是给想要看新新新世界的人。
1)第一条路:
哈,终于有跳转跳过这里了,可是有两个呢,我们该改哪一个?为了便于分析,我们在此(787D5AE0)设置断点。(或者就是说,我们都尝试一下。)
-如果我们改:787D5AE0 /74 3A je short mfc100u.787D5B1C 的跳转(让它跳),那么得到的结果是:注册提示框(果然)没有了,截个图嘞发现水印还有 ;-(
-如果我们改:787D5AE6 /74 1E je short mfc100u.787D5B06 的跳转(让它跳),那么得到的结果是:注册提示框(果然)没有了,截个图嘞发现水印还是有 T-T
所以,我们任意改一个,然后就是去掉水印的事了。
这个没法用暂停法了,我们Ctrl+N看看。
LoadBitmap没有参考命令;Createbitmap断不下啊。有好多都没有参考的命令那!!!算了,我懒得找了。
(但是这种方法会把其他的弹出框也跳掉,这是绝对不行的!!所以还是别尝试了吧 = = )
2)第二条路:
新新新世界:(怎么到的不用我说了吧)
0047F719 |. /75 04 jnz short XXXXXXX7.0047F71F ; 这里一跳就惨了
0047F71B |. |85C0 test eax,eax
0047F71D |. |75 63 jnz short XXXXXXX7.0047F782 ; 跳过了提示框Call了
0047F71F |> \8B4B 20 mov ecx,dword ptr ds:[ebx+20]
0047F722 |. 6A 00 push 0 ; /Arg3 = 00000000
0047F724 |. 56 push esi ; |Arg2
0047F725 |. 51 push ecx ; |Arg1
0047F726 |. 8D8D 70FEFFFF lea ecx,dword ptr ss:[ebp-190] ; |
0047F72C |. E8 7FDC0A00 call XXXXXXX7.0052D3B0 ; \
0047F731 |. 68 70C86500 push XXXXXXX7.0065C870
0047F736 |. 8D8B 54010000 lea ecx,dword ptr ds:[ebx+154]
0047F73C |. C645 FC 20 mov byte ptr ss:[ebp-4],20
0047F740 |. FF15 E08C6500 call dword ptr ds:[<&mfc100u.#2614>] ; mfc100u.78650031
0047F746 |. 85C0 test eax,eax
0047F748 |. 7E 16 jle short XXXXXXX7.0047F760
0047F74A |. B8 1D000000 mov eax,1D
0047F74F |. 8D56 FF lea edx,dword ptr ds:[esi-1]
0047F752 |. 3BC2 cmp eax,edx
0047F754 |. 1BC0 sbb eax,eax
0047F756 |. F7D0 not eax
0047F758 |. 23C6 and eax,esi
0047F75A |. 8983 20030000 mov dword ptr ds:[ebx+320],eax
0047F760 |> 8D8D 70FEFFFF lea ecx,dword ptr ss:[ebp-190]
0047F766 |. E8 3FBB1B00 call <jmp.&mfc100u.#3627>
0047F76B |. 8D8D 70FEFFFF lea ecx,dword ptr ss:[ebp-190]
0047F771 |. C645 FC 19 mov byte ptr ss:[ebp-4],19
0047F775 |. E8 86DC0A00 call XXXXXXX7.0052D400
0047F77A |. 85FF test edi,edi
0047F77C |. 0F85 A6000000 jnz XXXXXXX7.0047F828
0047F782 |> 83BB 10030000 0>cmp dword ptr ds:[ebx+310],0
可以看到,我们只要改这一句:
0047F71D |. |75 63 jnz short XXXXXXX7.0047F782
改成jmp就OK!没有提示框,没有水印了!!!
查看一下帮助,关于,发现:序列号,授权给后面都是空的,中间提示你临时授权逾期XXXX.XX.XX。XXXX.XX.XX这个日期就是你今天的日期,你明天看,就是明天的日期,总之"临时授权"永不过期,总是没有弹框和水印的。但是"临时授权"看着有点不舒服,你可以用PE Explorer改,但是毕竟......于是想要完美就到方法二。
<方法二>复杂方法,高级
用这种方法一定要看懂汇编,并且了解到VC++程序拿eax来比较的经验。(那是黑鹰高级里说的吧)
Ctrl+N, 看到这里:
名称位于 XXXXXXX7,项目 2825
地址=00656004
区段=.rdata
类型=导入 (已知)
名称=ADVAPI32.RegOpenKeyExW
程序读取注册表来验证的(这个对于熟悉程序注册方法的人有效,所以买个注册码也是有用的,虽然说我没买,但是以前网上都是注册版,用用就知道了)。所以可以通过这个函数来找到。
右键,每个参考下断点。
运行,堆栈:
第一次:
0012F418 80000002 |hKey = HKEY_LOCAL_MACHINE
0012F41C 003FCD98 |Subkey = "SOFTWARE\Hyperionics\HyperSnap 7"
0012F420 00000000 |Reserved = 0
0012F424 00020019 |Access = KEY_READ
0012F428 0012F438 \pHandle = 0012F438
感觉那么快有点不像(而且我跟踪以后也证明了不是,这里节省时间就......),虽然说打开这个很可疑,但是我们还是等等。
第二次:
0012ED14 80000000 |hKey = HKEY_CLASSES_ROOT
0012ED18 0065B968 |Subkey = "Applications\HprSnap7.exe\shell\open\command"
0012ED1C 00000000 |Reserved = 0
0012ED20 00020019 |Access = KEY_READ
0012ED24 0012ED38 \pHandle = 0012ED38
明显不是,跳过。
第三次:
0012EFC0 80000001 |hKey = HKEY_CURRENT_USER
0012EFC4 0012F0F0 |Subkey = "Identities\{CEB6AF0B-CA39-31BF-B518-527AD6AE017B}"
0012EFC8 00000000 |Reserved = 0
0012EFCC 00020019 |Access = KEY_READ
0012EFD0 0012EFE0 \pHandle = 0012EFE0
仍然明显不是,跳过。
第四次:
0012EFE4 80000000 |hKey = HKEY_CLASSES_ROOT
0012EFE8 0012F050 |Subkey = "CLSID\{CEB6AF0B-C9A3-1B3F-B185-D6A527AE017B}\VERSION"
0012EFEC 00000000 |Reserved = 0
0012EFF0 00020019 |Access = KEY_READ
0012EFF4 0012F000 \pHandle = 0012F000
还是不是,汗。
第五次:
0012EFE4 80000001 |hKey = HKEY_CURRENT_USER
0012EFE8 0012F0F0 |Subkey = "Identities\{CEB6AF0B-CA39-31BF-B518-527AD6AE017B}"
0012EFEC 00000000 |Reserved = 0
0012EFF0 00020019 |Access = KEY_READ
0012EFF4 0012F000 \pHandle = 0012F000
一样,不是。
第六次:
0012EFE0 80000000 |hKey = HKEY_CLASSES_ROOT
0012EFE4 0012F050 |Subkey = "CLSID\{CEB6AF0B-C9A3-1B3F-B185-D6A527AE017B}\VERSION"
0012EFE8 00000000 |Reserved = 0
0012EFEC 00020019 |Access = KEY_READ
0012EFF0 0012F000 \pHandle = 0012F000
过。
第七次:
0012F0D8 80000001 |hKey = HKEY_CURRENT_USER
0012F0DC 0065C2E0 |Subkey = "Control Panel\International"
0012F0E0 00000000 |Reserved = 0
0012F0E4 00020019 |Access = KEY_READ
0012F0E8 0012F114 \pHandle = 0012F114
额......
第八次:
0012E500 80000001 |hKey = HKEY_CURRENT_USER
0012E504 01779B38 |Subkey = "Software\Hyperionics\HyperSnap 7"
0012E508 00000000 |Reserved = 0
0012E50C 00020019 |Access = KEY_READ
0012E510 0012E528 \pHandle = 0012E528
啊啊啊,我终于等到你了!就是你~
另一个世界:
005294A5 |. /74 09 je short XXXXXXX7.005294B0
005294A7 |. |8D4D F0 lea ecx,dword ptr ss:[ebp-10]
005294AA |. |FF15 4C8B6500 call dword ptr ds:[<&mfc100u.#3846>] ; mfc100u.786486E5
005294B0 |> \8D4D E8 lea ecx,dword ptr ss:[ebp-18]
005294B3 |. 51 push ecx
005294B4 |. 68 19000200 push 20019
005294B9 |. 57 push edi
005294BA |. 8D4D 0C lea ecx,dword ptr ss:[ebp+C]
005294BD |. FF15 E88C6500 call dword ptr ds:[<&mfc100u.#1450>] ; mfc100u.7879FCE7
005294C3 |. 8B55 08 mov edx,dword ptr ss:[ebp+8] ; ||
005294C6 |. 50 push eax ; ||Subkey
005294C7 |. 52 push edx ; ||hKey
005294C8 |. FF15 04606500 call dword ptr ds:[<&ADVAPI32.RegOpenKe>; |\RegOpenKeyExW
005294CE |. 85C0 test eax,eax ; |
005294D0 |. 0F85 96000000 jnz XXXXXXX7.0052956C ; |
005294D6 |. 68 00100000 push 1000 ; |/size = 1000 (4096.)
005294DB |. FF15 607C6500 call dword ptr ds:[<&MSVCR100.malloc>] ; |\malloc
005294E1 |. 8BF0 mov esi,eax ; |
005294E3 |. 8D45 F0 lea eax,dword ptr ss:[ebp-10] ; |
005294E6 |. 50 push eax ; |Arg3
005294E7 |. 8D4D E4 lea ecx,dword ptr ss:[ebp-1C] ; |
005294EA |. 68 081D6700 push XXXXXXX7.00671D08 ; |Arg2 = 00671D08
005294EF |. 51 push ecx ; |Arg1
005294F0 |. C745 EC 0010000>mov dword ptr ss:[ebp-14],1000 ; |
005294F7 |. E8 440BF4FF call XXXXXXX7.0046A040 ; \XXXXXXX7.0046A040
005294FC |. 83C4 10 add esp,10
005294FF |. 8D55 EC lea edx,dword ptr ss:[ebp-14]
00529502 |. 52 push edx
00529503 |. 56 push esi
00529504 |. 57 push edi
00529505 |. 57 push edi
00529506 |. 8BC8 mov ecx,eax
00529508 |. FF15 E88C6500 call dword ptr ds:[<&mfc100u.#1450>] ; mfc100u.7879FCE7
0052950E |. 8B3D 38606500 mov edi,dword ptr ds:[<&ADVAPI32.RegQue>; |ADVAPI32.RegQueryValueExW
00529514 |. 50 push eax ; |ValueName
00529515 |. 8B45 E8 mov eax,dword ptr ss:[ebp-18] ; |
00529518 |. 50 push eax ; |hKey
00529519 |. FFD7 call edi ; \RegQueryValueExW
0052951B |. 85C0 test eax,eax
0052951D |. 8D4D E4 lea ecx,dword ptr ss:[ebp-1C]
00529520 |. 0F94C3 sete bl
00529523 |. FF15 288D6500 call dword ptr ds:[<&mfc100u.#902>] ; mfc100u.78704421
00529529 |. 84DB test bl,bl
0052952B |. 74 0A je short XXXXXXX7.00529537
0052952D |. 8B4D EC mov ecx,dword ptr ss:[ebp-14]
00529530 |. 8B55 10 mov edx,dword ptr ss:[ebp+10]
00529533 |. 890A mov dword ptr ds:[edx],ecx
00529535 |. EB 22 jmp short XXXXXXX7.00529559
00529537 |> 8B4D E8 mov ecx,dword ptr ss:[ebp-18]
0052953A |. 8D45 EC lea eax,dword ptr ss:[ebp-14]
0052953D |. 50 push eax
0052953E |. 56 push esi
0052953F |. 6A 00 push 0
00529541 |. 6A 00 push 0
00529543 |. 68 081D6700 push XXXXXXX7.00671D08 ; UNICODE "Key"
00529548 |. 51 push ecx
00529549 |. FFD7 call edi
0052954B |. 8B55 10 mov edx,dword ptr ss:[ebp+10]
0052954E |. F7D8 neg eax
00529550 |. 1BC0 sbb eax,eax
00529552 |. F7D0 not eax
00529554 |. 2345 EC and eax,dword ptr ss:[ebp-14]
00529557 |. 8902 mov dword ptr ds:[edx],eax
00529559 |> 8B45 10 mov eax,dword ptr ss:[ebp+10]
0052955C |. 8B08 mov ecx,dword ptr ds:[eax]
0052955E |. C6040E 00 mov byte ptr ds:[esi+ecx],0
00529562 |. 8B55 E8 mov edx,dword ptr ss:[ebp-18]
00529565 |. 52 push edx ; /hKey
00529566 |. FF15 00606500 call dword ptr ds:[<&ADVAPI32.RegCloseK>; \RegCloseKey
0052956C |> 8D4D F0 lea ecx,dword ptr ss:[ebp-10]
0052956F |. FF15 288D6500 call dword ptr ds:[<&mfc100u.#902>] ; mfc100u.78704421
00529575 |. 8D4D 0C lea ecx,dword ptr ss:[ebp+C]
00529578 |. FF15 288D6500 call dword ptr ds:[<&mfc100u.#902>] ; mfc100u.78704421
0052957E |. 8BC6 mov eax,esi
00529580 |. 8B4D F4 mov ecx,dword ptr ss:[ebp-C]
00529583 |. 64:890D 0000000>mov dword ptr fs:[0],ecx
0052958A |. 59 pop ecx
0052958B |. 5F pop edi
0052958C |. 5E pop esi
0052958D |. 5B pop ebx
0052958E |. 8BE5 mov esp,ebp
00529590 |. 5D pop ebp
00529591 \. C3 retn
走过第一条路的人应该知道了,要到外面一层去。没走过的人你们偷懒了(;-<),我也偷懒了,不再重复写了。;+)
另一个新世界:
//(我懒得放了,行吗?)......(浓缩成6个点)
//[都是用来分析判断你注册是否合法的算法。具体分析略过,有兴趣自己看看吧。]
//我们要注意的是最后:
0052C8D8 > \8B45 EC mov eax,dword ptr ss:[ebp-14] ;运行到这里
0052C8DB . 8B4D F4 mov ecx,dword ptr ss:[ebp-C]
0052C8DE . 64:890D 0000000>mov dword ptr fs:[0],ecx
0052C8E5 . 59 pop ecx
0052C8E6 . 5F pop edi
0052C8E7 . 5E pop esi
0052C8E8 . 5B pop ebx
0052C8E9 . 8BE5 mov esp,ebp
0052C8EB . 5D pop ebp
0052C8EC . C2 1000 retn 10
注释:
堆栈 ss:[0012E584]=00000000
eax=00000000
Jump from 0052C8CC
我们要用到eax的经验了,我们知道我们没有注册,而eax这样就被置0,所以,我们就要让它是1. 我们可以先试试,执行到下一句时我们改1. 明显的,没有注册弹框,也没有水印了。于是我们找对位置了。
把这一句 mov eax,dword ptr ss:[ebp-14] 直接改成 mov eax,1 保存即可。
但是方法二也有它的问题。就要来到第二大步了。
(二)去掉点击帮助——关于时的程序异常退出问题
这是用了“<方法二>复杂方法,高级”的人才会有的步骤,它是程序中的“暗桩”。我在原创发布区里的文章也有提到过,由于它某个地方push进的是空的,没有它合法注册文件的标志,所以导致内存异常的。
既然你都有信心和兴趣研究<方法二>了,那接下来就是留给你的一个问题:如何去掉暗桩? ;-)
相信聪明的你一定会比我找到更好的解决方案。这里先暂时卖个关子,不打消你的兴趣,让你自己研究研究。
====================写在后面====================
希望大家通过这个破解经历,在破解现在“年轻”软件时有更丰富的经验。写这篇文章的目的是,让破解爱好者们对于破解年轻的软件(这个也算是大公司出的软件)开拓一下思路,因为老的教程里面有些注册什么的都已经过时了,什么查找字符串之类的东西对于资源在另一个dll里的程序就不适用了。自己也是偶然发现,原来,有些爆破点离我们是这样的近,而我们却在太深的地方找了。
还有,我给大家提供的下载安装包是7.28.05的,而我这个破解思路是按照7.28.02写的,目的就是为了防止你Ctrl+G(你懂得,其实我也干过这种事 = = )。(不过两个程序应该地址都不一样吧。如果一样就是官方偷懒了,我也没办法了。)
写给其他像我一样努力奋斗的菜鸟们:
如果你能够看完这篇文章,说明你拥有了足够的耐心去完成破解了,恭喜你。如果你说:“哎呀,内容太多,我看不下去了。”那么请你跳过“写在前面”、“写在后面”、“关于”,这三部分内容我承认有些是我太啰嗦了;如果你还说你看不下去,那么,你就去下载附件自己(跟着我的文章)玩,这样确实更直接;如果你还觉得不耐烦,那么我想说,唉,耐心是破解的关键啊。你知道我研究出来这些东西,只是一晃儿的事而已吗?至少我还没这么强。
还有,欢迎大家回帖一起来交流一下哈!
====================关于我/我的想法====================
我是一名初中生,现在在读初一。从6年级开始,我就开始学习逆向相关方面的知识了。黑鹰初级已经看完,现在在看高级。
由于学业压力较大,所以平时我也很难抽出时间来研究逆向,只有到寒暑假之际才能发展一下自己的兴趣爱好。我也不知我自己是怎样迷上逆向的,哦对了,就是因为垃圾公司的软件网上找不到破解,我才下决心要好好学习反汇编的。如今经过了一年不到的学习(其实真正学习的时间不多啊),终于能够破解这一个网上也是没有了破解版的软件。
而且我学习环境不佳,我的电脑内存512MB,CPU我也不知道是多老的了,而且最要命的是我每次用了磁盘1GB空间后,必须重启.(因为我安装了SD,这不是我想安装的,但是真的迫不得已。调试软件得关杀软,关了杀软就不知会发生什么事了,所以必须要有一个强大的还原。而我磁盘空间不够,真的每次只能用1GB,于是我网上找教程的都是费劲千辛万苦找到一课一课分开的,然后一个一个下载下来看。下完了还得立即吸收,否则重启就没有了。)
其实我也挺想学病毒分析的,但是我安装了虚拟机(当然是精简版)以后再用,它提示我CPU不支持,试了各种方法无果,我只能重启电脑了。......
最令我庆幸的是我找到了吾爱和看雪两大论坛,并且现在都有了帐号(看雪还没转正呢,吾爱的是我赶上开放注册了)。这让我十分兴奋,对破解的兴趣也更加浓郁了。
学习反汇编后,也总算是明白了为什么破解补丁会报毒了,以及国产杀毒软件的垃圾。自己破解的东西肯定是无毒的,杀软就报毒了。果断去用大蜘蛛检测,没有毒。从此以后我决定要用国外的杀软了。(因为听说国产杀软遇到真正的病毒就给跪了,不是病毒的狂报毒,是吗?)
但是这对我的同学们来说是他们无法理解的。我直接爆破一个程序给他们用,他们就说三鹿零报毒......额......这非要我加一个免杀壳他们才不乱说话吗?(呵呵,其实我也能理解......)
说了那么多,都是对往事回忆的感慨。最后,
我希望能与大家一起学习交流,共同进步!
安装程序下载地址:
http://pan.baidu.com/s/1eQIgl3s
提取密码:9bfw
视频附上了!
地址:http://pan.baidu.com/s/1bnGQ0SB
提取密码:yc27
P.S.: 现在视频教程都附上了,如果你还说你看不下去视频教程,那么我彻底没法了。你可以认为我说明的能力不够。......
[课程]FART 脱壳王!加量不加价!FART作者讲授!