新手进阶——超详细代码过程分析
本帖最后由 晴天 于 2010-8-17 08:00 编辑大家好,我是晴天(Flash_Magic),我今天给大家带来的是破解不慌不忙的教程(不慌不忙是软件名),不慌不忙这个软件还是很受欢迎的,很多人以前发过爆破的教程,但没有对注册的过程进行分析。那我今天就带大家分析代码,让我们的破解提高一个水平。
基础知识还是要的,还没入门的可以看我的新手教程
这些都是我的详细的新手教程,在论坛搜索就可找到
废话不多,开始教程。
先介绍一下不慌不忙:大家都有过忙手忙脚最小化窗口(或关闭窗口)的经历吧!原因很简单——不想让突如其来的老板、老妈、老婆看到我们电脑屏幕上正在显示的游戏、日记、MM:-) 等属于个人隐私的东东。
本软件就能为你解决以上的烦恼,当你鼠标左、右键同时按下时,软件就能迅速隐藏正在显示的窗口,免去人工瞄准并按下每个窗口右上方的那个小得可怜的的最小化按扭之苦了。当危险解除再鼠标左、右键同时按下能使隐藏的窗口恢复。
此外程序还有关闭声音,保留某些窗口,自定义快捷键,隐藏桌面,隐藏任务栏,关闭程序等辅助功能。软件操作容易,界面简洁,不需要过多的时间摸索就能熟练使用。
开始破解
程序没有加壳,OD载入后用F12调用堆栈法或下API断点都可到达关键位置
开始分析过程
004029E0 .6A FF push -1 ;这段代码的开头
004029E2 .68 087F4000 push Unhurrie.00407F08 ;SE 处理程序安装
004029E7 .64:A1 0000000>mov eax,dword ptr fs:
004029ED .50 push eax
004029EE .64:8925 00000>mov dword ptr fs:,esp
004029F5 .83EC 54 sub esp,54
004029F8 .53 push ebx
004029F9 .56 push esi
004029FA .BB 01000000 mov ebx,1
004029FF .57 push edi
00402A00 .8BF1 mov esi,ecx
00402A02 .53 push ebx
00402A03 .E8 E04B0000 call <jmp.&MFC42.#CWnd::UpdateData_6>;取部分用户名,不知是干什么的
00402A08 .8D4C24 0C lea ecx,dword ptr ss:
00402A0C .E8 A14B0000 call <jmp.&MFC42.#CString::CString_5>
00402A11 .8D4C24 20 lea ecx,dword ptr ss:
00402A15 .C74424 68 000>mov dword ptr ss:,0
00402A1D .E8 4E4B0000 call <jmp.&MFC42.#CWnd::CWnd_567>
00402A22 .C74424 20 F89>mov dword ptr ss:,Unhurrie.0>
00402A2A .8D7E 64 lea edi,dword ptr ds:
00402A2D .68 48C64000 push Unhurrie.0040C648
00402A32 .8BCF mov ecx,edi
00402A34 .885C24 6C mov byte ptr ss:,bl
00402A38 .E8 6F4B0000 call <jmp.&MFC42.#CString::operator=>;取完整用户名
00402A3D .8B8E 14010000 mov ecx,dword ptr ds:
00402A43 .8D86 14010000 lea eax,dword ptr ds:
00402A49 .8B51 F8 mov edx,dword ptr ds:
00402A4C .85D2 test edx,edx
00402A4E .7E 0A jle short Unhurrie.00402A5A ;判断用户名是否填写,没有填写就跳向失败
00402A50 .50 push eax
00402A51 .8BCF mov ecx,edi
00402A53 .E8 9C4B0000 call <jmp.&MFC42.#CString::operator=>;取填写的注册码
00402A58 .EB 0C jmp short Unhurrie.00402A66
00402A5A >68 B8C24000 push Unhurrie.0040C2B8 ;ASCII "fuckjapan"
00402A5F .8BCF mov ecx,edi
00402A61 .E8 464B0000 call <jmp.&MFC42.#CString::operator=>
00402A66 >8B96 10010000 mov edx,dword ptr ds:
00402A6C .837A F8 17 cmp dword ptr ds:,17
00402A70 0F85 83010000 jnz Unhurrie.00402BF9 ;判断注册码是否为23位,不是23位就跳向失败
00402A76 .8D4424 10 lea eax,dword ptr ss:
00402A7A .57 push edi
00402A7B .50 push eax
00402A7C .8BCE mov ecx,esi
00402A7E .E8 1D020000 call Unhurrie.00402CA0 ;算法部分,F7跟入可以分析算法
00402A83 .50 push eax
00402A84 .8D4C24 10 lea ecx,dword ptr ss:
00402A88 .C64424 6C 02mov byte ptr ss:,2
00402A8D .E8 624B0000 call <jmp.&MFC42.#CString::operator=>
00402A92 .8D4C24 10 lea ecx,dword ptr ss:
00402A96 .885C24 68 mov byte ptr ss:,bl
00402A9A .E8 014B0000 call <jmp.&MFC42.#CString::~CString_>
00402A9F .8B4C24 0C mov ecx,dword ptr ss:
00402AA3 .8B86 10010000 mov eax,dword ptr ds:
00402AA9 .51 push ecx ; /堆栈S2=真注册码
00402AAA .50 push eax ; |堆栈S1=假注册码
00402AAB .FF15 24934000 call dword ptr ds:[<&MSVCRT._mbscmp>>; \将真的注册码与假的比较
00402AB1 .83C4 08 add esp,8
00402AB4 .85C0 test eax,eax
00402AB6 0F85 9E010000 jnz Unhurrie.00402C5A ;判断注册码是否正确,不对就跳
00402ABC .8D5424 10 lea edx,dword ptr ss: ;下面开始把注册信息写入注册表
00402AC0 .52 push edx ; /pHandle
00402AC1 .68 06000200 push 20006 ; |Access = KEY_WRITE
00402AC6 .50 push eax ; |Reserved
00402AC7 .68 8CC24000 push Unhurrie.0040C28C ; |Subkey = "Software\Microsoft\Windows\CurrentVersion"
00402ACC .68 02000080 push 80000002 ; |hKey = HKEY_LOCAL_MACHINE
00402AD1 .FF15 04904000 call dword ptr ds:[<&ADVAPI32.RegOpe>; \RegOpenKeyExA
00402AD7 .85C0 test eax,eax
00402AD9 .74 15 je short Unhurrie.00402AF0 ;判断打开注册表指定位置是否成功
00402ADB .6A 00 push 0
00402ADD .6A 00 push 0
00402ADF .68 78C24000 push Unhurrie.0040C278 ;ASCII "can't open regedit!"
00402AE4 .8BCE mov ecx,esi
00402AE6 .E8 EB4A0000 call <jmp.&MFC42.#CWnd::MessageBoxA_>; 提示写入注册信息失败
00402AEB .E9 73010000 jmp Unhurrie.00402C63
00402AF0 >51 push ecx
00402AF1 .8BCC mov ecx,esp
00402AF3 .896424 18 mov dword ptr ss:,esp
00402AF7 .57 push edi
00402AF8 .E8 A94A0000 call <jmp.&MFC42.#CString::CString_5>
00402AFD .8BCE mov ecx,esi
00402AFF .E8 5CFEFFFF call Unhurrie.00402960
00402B04 .8B0F mov ecx,dword ptr ds:
00402B06 .8B5424 10 mov edx,dword ptr ss:
00402B0A .8B3D 00904000 mov edi,dword ptr ds:[<&ADVAPI32.Reg>; ADVAPI32.RegSetValueExA
00402B10 .8B49 F8 mov ecx,dword ptr ds:
00402B13 .41 inc ecx
00402B14 .51 push ecx ; /BufSize
00402B15 .50 push eax ; |Buffer
00402B16 .53 push ebx ; |ValueType
00402B17 .6A 00 push 0 ; |Reserved = 0
00402B19 .68 64C24000 push Unhurrie.0040C264 ; |ValueName = "RegisteredBubmTzm"
00402B1E .52 push edx ; |hKey
00402B1F .FFD7 call edi ; \RegSetValueExA
00402B21 .85C0 test eax,eax
00402B23 .74 15 je short Unhurrie.00402B3A ;判断是否可以设置键值名
00402B25 .6A 00 push 0
00402B27 .6A 00 push 0
00402B29 .68 4CC24000 push Unhurrie.0040C24C ;ASCII "can't change regedit!"
00402B2E .8BCE mov ecx,esi
00402B30 .E8 A14A0000 call <jmp.&MFC42.#CWnd::MessageBoxA_>;提示写入注册信息失败
00402B35 .E9 29010000 jmp Unhurrie.00402C63
00402B3A >51 push ecx
00402B3B .8D4424 10 lea eax,dword ptr ss:
00402B3F .8BCC mov ecx,esp
00402B41 .896424 18 mov dword ptr ss:,esp
00402B45 .50 push eax
00402B46 .E8 5B4A0000 call <jmp.&MFC42.#CString::CString_5>
00402B4B .8BCE mov ecx,esi
00402B4D .E8 0EFEFFFF call Unhurrie.00402960
00402B52 .8B8E 10010000 mov ecx,dword ptr ds:
00402B58 .8B5424 10 mov edx,dword ptr ss:
00402B5C .8B49 F8 mov ecx,dword ptr ds:
00402B5F .41 inc ecx
00402B60 .51 push ecx
00402B61 .50 push eax
00402B62 .53 push ebx
00402B63 .6A 00 push 0
00402B65 .68 38C24000 push Unhurrie.0040C238 ;ASCII "RegisteredBubmZcm"
00402B6A .52 push edx
00402B6B .FFD7 call edi ;准备写入注册信息
00402B6D .85C0 test eax,eax
00402B6F .6A 00 push 0
00402B71 .74 13 je short Unhurrie.00402B86 ;判断是否写入注册信息成功
00402B73 .6A 00 push 0
00402B75 .68 4CC24000 push Unhurrie.0040C24C ;ASCII "can't change regedit!"
00402B7A .8BCE mov ecx,esi
00402B7C .E8 554A0000 call <jmp.&MFC42.#CWnd::MessageBoxA_>;提示写入注册信息失败
00402B81 .E9 DD000000 jmp Unhurrie.00402C63
00402B86 >68 90C14000 push Unhurrie.0040C190
00402B8B .51 push ecx
00402B8C .8BCC mov ecx,esp
00402B8E .896424 24 mov dword ptr ss:,esp
00402B92 .68 2CC24000 push Unhurrie.0040C22C ;ASCII "SOURCEINFO1"
00402B97 .E8 404A0000 call <jmp.&MFC42.#CString::CString_5>
00402B9C .51 push ecx
00402B9D .C64424 78 03mov byte ptr ss:,3
00402BA2 .8BCC mov ecx,esp
00402BA4 .896424 2C mov dword ptr ss:,esp
00402BA8 .68 70C14000 push Unhurrie.0040C170 ; ASCII "SOURCE_DIALOG_CN"
00402BAD .E8 2A4A0000 call <jmp.&MFC42.#CString::CString_5>
00402BB2 .8D4424 24 lea eax,dword ptr ss:
00402BB6 .8D4C24 30 lea ecx,dword ptr ss:
00402BBA .50 push eax
00402BBB .885C24 7C mov byte ptr ss:,bl
00402BBF .E8 CCF1FFFF call Unhurrie.00401D90
00402BC4 .8BC8 mov ecx,eax
00402BC6 .C64424 70 04mov byte ptr ss:,4
00402BCB .E8 70F1FFFF call Unhurrie.00401D40
00402BD0 .50 push eax
00402BD1 .8BCE mov ecx,esi
00402BD3 .E8 FE490000 call <jmp.&MFC42.#CWnd::MessageBoxA_>; 提示注册成功
00402BD8 .8D4C24 14 lea ecx,dword ptr ss:
00402BDC .885C24 68 mov byte ptr ss:,bl
00402BE0 .E8 BB490000 call <jmp.&MFC42.#CString::~CString_>
00402BE5 .8B4C24 10 mov ecx,dword ptr ss:
00402BE9 .51 push ecx ; /hKey
00402BEA .FF15 0C904000 call dword ptr ds:[<&ADVAPI32.RegClo>; \RegCloseKey
00402BF0 .8BCE mov ecx,esi ;到此注册信息写入过程结束
00402BF2 .E8 D3490000 call <jmp.&MFC42.#CDialog::OnOK_4853>
00402BF7 .EB 61 jmp short Unhurrie.00402C5A ;这个跳转跳过失败提示
00402BF9 >6A 00 push 0 ;下边开始准备提示注册失败
00402BFB .68 90C14000 push Unhurrie.0040C190
00402C00 .51 push ecx
00402C01 .8BCC mov ecx,esp
00402C03 .896424 28 mov dword ptr ss:,esp
00402C07 .68 1CC24000 push Unhurrie.0040C21C ;ASCII "SOURCEINFO17"
00402C0C .E8 CB490000 call <jmp.&MFC42.#CString::CString_5>
00402C11 .51 push ecx
00402C12 .C64424 78 05mov byte ptr ss:,5
00402C17 .8BCC mov ecx,esp
00402C19 .896424 28 mov dword ptr ss:,esp
00402C1D .68 70C14000 push Unhurrie.0040C170 ; ASCII "SOURCE_DIALOG_CN"
00402C22 .E8 B5490000 call <jmp.&MFC42.#CString::CString_5>
00402C27 .8D5424 24 lea edx,dword ptr ss:
00402C2B .8D4C24 30 lea ecx,dword ptr ss:
00402C2F .52 push edx
00402C30 .885C24 7C mov byte ptr ss:,bl
00402C34 .E8 57F1FFFF call Unhurrie.00401D90
00402C39 .8BC8 mov ecx,eax
00402C3B .C64424 70 06mov byte ptr ss:,6
00402C40 .E8 FBF0FFFF call Unhurrie.00401D40
00402C45 .50 push eax
00402C46 .8BCE mov ecx,esi
00402C48 .E8 89490000 call <jmp.&MFC42.#CWnd::MessageBoxA_>;出现错误提示
00402C4D .8D4C24 14 lea ecx,dword ptr ss:
00402C51 .885C24 68 mov byte ptr ss:,bl
00402C55 .E8 46490000 call <jmp.&MFC42.#CString::~CString_>
00402C5A >6A 00 push 0
00402C5C .8BCE mov ecx,esi
00402C5E .E8 85490000 call <jmp.&MFC42.#CWnd::UpdateData_6>
00402C63 >8D4C24 20 lea ecx,dword ptr ss:
00402C67 .C64424 68 00mov byte ptr ss:,0
00402C6C .E8 5F490000 call <jmp.&MFC42.#CButton::~CButton_>
00402C71 .8D4C24 0C lea ecx,dword ptr ss:
00402C75 .C74424 68 FFF>mov dword ptr ss:,-1
00402C7D .E8 1E490000 call <jmp.&MFC42.#CString::~CString_>
00402C82 .8B4C24 60 mov ecx,dword ptr ss:
00402C86 .5F pop edi
00402C87 .5E pop esi
00402C88 .64:890D 00000>mov dword ptr fs:,ecx
00402C8F .5B pop ebx
00402C90 .83C4 60 add esp,60
00402C93 .C3 retn ; 代码结束
代码有点乱,大家将就吧,程序的目录下也有代码分析,那里的代码比较清楚一点
另外说一下,注册信息保存在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 的RegisteredBubmTzm 和RegisteredBubmZcm这两个键值下
根据我的调试发现,只要在注册时输入任意23位注册码,并修改00402AB6的跳转,软件在写入注册信息时就写入正确的注册码,而不是用户输入的23位注册码,这个也算是这个软件的一个BUG吧。我的破解版就是利用了这个注册的BUG。
程序是明码比较,可以写内存注册机,大家可以自己尝试一下。我是考虑到有些不知道的人说我放毒(内存注册机杀毒软件一般会误报),所以不提供内存注册机
注意:使用破解版时,注册码可以任意输入,但必须是23位。破解版的图标,我改成了醒目的大眼睛图标,(其实是新浪网图标),便于区别。
附上不慌不忙软件的下载地址:http://u.115.com/file/f31f1c7dc 不慌不忙.rar
写这个帖子花了我不少时间,大家多加评分呀 哇 沙发 lz 这干嘛使的。。。 本人绝对新手 所以看不明白 嘿嘿 支持下LZ 支持下了. 支持你楼主 不错 学习了。 不错,鼓励下,建议新人对照着练习下。 学习啦~~~~~
支持下LZ.. 感谢分享