傻人有傻福 发表于 2008-3-28 22:41:22

一个不输入正确注册码,注册按钮就是灰色的软件的简单分析

【破文标题】一个不输入正确注册码,注册按钮就是灰色的软件的简单分析
【破文作者】水平太菜,就不写了名字了*^_^*
【作者邮箱】
【作者主页】
【破解工具】PEID+DEDE+OD
【破解平台】Windows XP
【软件名称】
【软件大小】
【原版下载】
【保护方式】注册码
【软件简介】
【破解声明】只为讨论、学习与分享破解技术,勿用于非法用途,请多多支持软件开发者!
------------------------------------------------------------------------
【破解过程】    首先先说明一下,上面的软件名称和原版下载我没有写,原因是我们学破解的目的是研究和学习,并不是为了破解而破解,我发破文的目的是把我的一些思路心得和大家分享一下,共同学习、共同进步。如果想要这个软件调试的话请PM我,我会把软件下载地址告诉你,请不要看了我的破文之后没有任何收获就只会发布一个破解成果(破解成果留着自己用,请不要发布,作者写个软件也不容易)
    我的破解总结中还附带了几个问题,希望大侠能指点一下。
    好了,开始我们的破解之旅了,就像我标题说的“一个不输入正确注册码,注册按钮就是灰色的软件”,给大家一个直观的感受什么是灰色按钮吧,如图1
http://i.namipan.com/files/f465ee3a7bb95fdb71d8f877e144153354d85186b81300002a10/0/1.jpg
这个软件有“4”个序列号输入框,注册按钮是灰色的,如果你输入的序列号是错误的话,这个灰色按钮是不被激活的,那我们如何下手呢?其实一开始我也是不知道的,直到我看到疑难交流区有一篇关于按钮激活的求助,链接地址:https://www.chinapyg.com/viewthread.php?tid=26173&extra=page%3D5,我看了一下回答的几位大侠的回答(特别是 小邪 大侠的回答),当时只是稍微记了一下。后来刚好就碰上了,呵呵!
    这个软件无壳,DELPHI程序,注册按钮是灰色的,按照我的习惯,DEDE载入看看,查看一下注册窗口的事件,这时灵感就来了,根据上面的小邪大侠的思路:“每隔一断时间就会检查是否正确”,我把关注的焦点放到了Timer事件上,为什么是Timer事件呢?相信接触过编程的都知道有个Timer,它的作用刚好满足“每隔一断时间”的要求,Timer事件一共有4个,其中比较关键的有2个,我们现在来看一下:
Timer2:
00048CCC0/.55               push ebp
0048CCC1|.8BEC               mov ebp,esp
0048CCC3|.33C9               xor ecx,ecx
0048CCC5|.51               push ecx
0048CCC6|.51               push ecx
0048CCC7|.51               push ecx
0048CCC8|.51               push ecx
0048CCC9|.51               push ecx
0048CCCA|.51               push ecx
0048CCCB|.51               push ecx
0048CCCC|.51               push ecx
0048CCCD|.53               push ebx
0048CCCE|.8BD8               mov ebx,eax
0048CCD0|.33C0               xor eax,eax
0048CCD2|.55               push ebp
0048CCD3|.68 DFCD4800      push ztks30.0048CDDF
0048CCD8|.64:FF30            push dword ptr fs:
0048CCDB|.64:8920            mov dword ptr fs:,esp
0048CCDE|.8D45 FC            lea eax,
0048CCE1|.50               push eax
0048CCE2|.8D55 F8            lea edx,
0048CCE5|.8B83 14030000      mov eax,dword ptr ds:
0048CCEB|.E8 F8B1FBFF      call ztks30.00447EE8               ;取第一段注册码
0048CCF0|.8B45 F8            mov eax,                  ;第一段注册码放到EAX中
0048CCF3|.B9 02000000      mov ecx,2                            ;ECX置2
0048CCF8|.BA 01000000      mov edx,1                            ;EDX置1
0048CCFD|.E8 0A7FF7FF      call ztks30.00404C0C               ;判断注册码格式,并截取这段注册码第1-2位
0048CD02|.8D45 FC            lea eax,
0048CD05|.50               push eax
0048CD06|.8D45 F4            lea eax,
0048CD09|.50               push eax
0048CD0A|.8D55 F0            lea edx,
0048CD0D|.8B83 18030000      mov eax,dword ptr ds:
0048CD13|.E8 D0B1FBFF      call ztks30.00447EE8               ;取第二段注册码
0048CD18|.8B45 F0            mov eax,                  ;第二段注册码放到EAX中
0048CD1B|.B9 01000000      mov ecx,1                            ;ECX置1
0048CD20|.BA 05000000      mov edx,5                            ;EDX置5
0048CD25|.E8 E27EF7FF      call ztks30.00404C0C               ;判断注册码格式,并截取这段注册码最后一位
0048CD2A|.8B55 F4            mov edx,
0048CD2D|.58               pop eax
0048CD2E|.E8 817CF7FF      call ztks30.004049B4               ;合并上面截取的注册码,顺序为第一段第1-2位第2段最后一位
0048CD33|.8B45 FC            mov eax,                  ;合并后的字符串放到EAX中
0048CD36|.50               push eax
0048CD37|.8D45 EC            lea eax,
0048CD3A|.50               push eax
0048CD3B|.8D55 E8            lea edx,
0048CD3E|.8B83 20030000      mov eax,dword ptr ds:
0048CD44|.E8 9FB1FBFF      call ztks30.00447EE8               ;取第四段注册码
0048CD49|.8B45 E8            mov eax,                  ;第四段注册码放到EAX中
0048CD4C|.B9 03000000      mov ecx,3                            ;ECX置3
0048CD51|.BA 04000000      mov edx,4                            ;EDX置4
0048CD56|.E8 B17EF7FF      call ztks30.00404C0C               ;判断注册码格式,并截取这段注册码最后3位
0048CD5B|.8B55 EC            mov edx,                  ;截取后的字符串放到EDX中
0048CD5E|.58               pop eax                              ;弹出上面第1、2段合并的字符串
0048CD5F|.E8 947DF7FF      call ztks30.00404AF8               ;最重要的比较CALL,比较的就是上面第1、2段的合并码和第4段的最后3位
0048CD64|.75 44            jnz short ztks30.0048CDAA            ;关键跳
0048CD66|.8D55 E4            lea edx,
0048CD69|.8B83 14030000      mov eax,dword ptr ds:
0048CD6F|.E8 74B1FBFF      call ztks30.00447EE8
0048CD74|.837D E4 00         cmp ,0
0048CD78|.74 30            je short ztks30.0048CDAA
0048CD7A|.8D55 E0            lea edx,
0048CD7D|.8B83 20030000      mov eax,dword ptr ds:
0048CD83|.E8 60B1FBFF      call ztks30.00447EE8
0048CD88|.837D E0 00         cmp ,0
0048CD8C|.74 1C            je short ztks30.0048CDAA
0048CD8E|.B2 01            mov dl,1
0048CD90|.8B83 24030000      mov eax,dword ptr ds:
0048CD96|.E8 6DB0FBFF      call ztks30.00447E08
0048CD9B|.B2 01            mov dl,1
0048CD9D|.8B83 2C030000      mov eax,dword ptr ds:
0048CDA3|.8B08               mov ecx,dword ptr ds:
0048CDA5|.FF51 64            call dword ptr ds:
0048CDA8|.EB 1A            jmp short ztks30.0048CDC4
0048CDAA|>33D2               xor edx,edx
0048CDAC|.8B83 2C030000      mov eax,dword ptr ds:
0048CDB2|.8B08               mov ecx,dword ptr ds:
0048CDB4|.FF51 64            call dword ptr ds:
0048CDB7|.33D2               xor edx,edx
0048CDB9|.8B83 24030000      mov eax,dword ptr ds:
0048CDBF|.E8 44B0FBFF      call ztks30.00447E08
0048CDC4|>33C0               xor eax,eax
0048CDC6|.5A               pop edx
0048CDC7|.59               pop ecx
0048CDC8|.59               pop ecx
0048CDC9|.64:8910            mov dword ptr fs:,edx
0048CDCC|.68 E6CD4800      push ztks30.0048CDE6
0048CDD1|>8D45 E0            lea eax,
0048CDD4|.BA 08000000      mov edx,8
0048CDD9|.E8 3279F7FF      call ztks30.00404710
0048CDDE\.C3               retn
稍微说明一下:上面的图1已经显示了这个软件有“4”个注册码输入框,我从左到右把它称为第1-4段。比较的就是第一段前2位合并上第2段最后一位这样组成了一个字符串1,另一个字符串是第4段的最后三位,这两部分要相等。同时对注册码的格式有要求,分别是第一段:4位,第2段:5位,第三段:3位,第四段:6位,反正就是每个框填满就是了。这几个要求符合之后,还会有个小惊喜哦,暂时卖个关子,我们这4个框的问题还没有解决呢。
如果你试着往框里面输东东的话你会发现第3个注册框输完之后第四个框就输不了了,这时Timer1事件登场了,噔噔噔噔。。。。。。。
-------------------------------------------------------------------------------------------------------
Timer1:
0048CC44/.55               push ebp
0048CC45|.8BEC               mov ebp,esp
0048CC47|.6A 00            push 0
0048CC49|.53               push ebx
0048CC4A|.8BD8               mov ebx,eax
0048CC4C|.33C0               xor eax,eax
0048CC4E|.55               push ebp
0048CC4F|.68 A9CC4800      push ztks30.0048CCA9
0048CC54|.64:FF30            push dword ptr fs:
0048CC57|.64:8920            mov dword ptr fs:,esp
0048CC5A|.8D55 FC            lea edx,
0048CC5D|.8B83 1C030000      mov eax,dword ptr ds:
0048CC63|.E8 80B2FBFF      call ztks30.00447EE8               ;取第三段注册码
0048CC68|.8B45 FC            mov eax,                  ;第三段注册码放到EAX
0048CC6B|.BA BCCC4800      mov edx,ztks30.0048CCBC            ;ASCII "6CX"
0048CC70|.E8 837EF7FF      call ztks30.00404AF8               ;比较第三段注册码和6CX是否相等,也就是说第三段注册码就是6CX
0048CC75|.75 0F            jnz short ztks30.0048CC86            ;关键跳
0048CC77|.33D2               xor edx,edx
0048CC79|.8B83 20030000      mov eax,dword ptr ds:
0048CC7F|.E8 E0FAFAFF      call ztks30.0043C764
0048CC84|.EB 0D            jmp short ztks30.0048CC93
0048CC86|>B2 01            mov dl,1
0048CC88|.8B83 20030000      mov eax,dword ptr ds:
0048CC8E|.E8 D1FAFAFF      call ztks30.0043C764
0048CC93|>33C0               xor eax,eax
0048CC95|.5A               pop edx
0048CC96|.59               pop ecx
0048CC97|.59               pop ecx
0048CC98|.64:8910            mov dword ptr fs:,edx
0048CC9B|.68 B0CC4800      push ztks30.0048CCB0
0048CCA0|>8D45 FC            lea eax,
0048CCA3|.E8 447AF7FF      call ztks30.004046EC
0048CCA8\.C3               retn
再稍微说明一下:这段就是说第三段的注册码就是6CX了,为什么是6CX呢?呵呵,拿到软件你就明白了
-------------------------------------------------------------------------------------------------------
我上面说卖个关子,现在我们来开启这个关子吧,如图2
http://i.namipan.com/files/ec1842eddd68d2e2739e25a9c07fa51f4eb86b81e71a00000912/0/1.jpg
大家看到了吧,注册按钮现在已经激活了,同时冒出了第5个输入框,这也是我为什么上面4个输入框中的4打了个引号的原因了,这个软件其实一共有5个输入框,同时注册按钮可以用了,我还是用DEDE来“定位”注册按钮事件。
注册按钮事件:
0048CDEC/.55               push ebp
0048CDED|.8BEC               mov ebp,esp
0048CDEF|.B9 05000000      mov ecx,5
0048CDF4|>6A 00            /push 0
0048CDF6|.6A 00            |push 0
0048CDF8|.49               |dec ecx
0048CDF9|.^ 75 F9            \jnz short ztks30.0048CDF4
0048CDFB|.51               push ecx
0048CDFC|.53               push ebx
0048CDFD|.8BD8               mov ebx,eax
0048CDFF|.33C0               xor eax,eax
0048CE01|.55               push ebp
0048CE02|.68 C8CF4800      push ztks30.0048CFC8
0048CE07|.64:FF30            push dword ptr fs:
0048CE0A|.64:8920            mov dword ptr fs:,esp
0048CE0D|.8D45 F8            lea eax,
0048CE10|.50               push eax
0048CE11|.8D55 F4            lea edx,
0048CE14|.8B83 14030000      mov eax,dword ptr ds:
0048CE1A|.E8 C9B0FBFF      call ztks30.00447EE8               ;取第一段注册码
0048CE1F|.8B45 F4            mov eax,                  ;第一段注册码放到EAX中
0048CE22|.B9 01000000      mov ecx,1
0048CE27|.BA 03000000      mov edx,3
0048CE2C|.E8 DB7DF7FF      call ztks30.00404C0C
0048CE31|.FF75 F8            push
0048CE34|.8D45 F0            lea eax,
0048CE37|.50               push eax
0048CE38|.8D55 EC            lea edx,
0048CE3B|.8B83 18030000      mov eax,dword ptr ds:
0048CE41|.E8 A2B0FBFF      call ztks30.00447EE8               ;取第二段注册码
0048CE46|.8B45 EC            mov eax,                  ;第二段注册码放到EAX中
0048CE49|.B9 02000000      mov ecx,2
0048CE4E|.BA 02000000      mov edx,2
0048CE53|.E8 B47DF7FF      call ztks30.00404C0C               ;判断注册码格式,并截取这段注册码第2、3位
0048CE58|.FF75 F0            push
0048CE5B|.8D45 E8            lea eax,
0048CE5E|.50               push eax
0048CE5F|.8D55 E4            lea edx,
0048CE62|.8B83 20030000      mov eax,dword ptr ds:
0048CE68|.E8 7BB0FBFF      call ztks30.00447EE8               ;取第4段注册码
0048CE6D|.8B45 E4            mov eax,                  ;第四段注册码放到EAX中
0048CE70|.B9 03000000      mov ecx,3
0048CE75|.BA 01000000      mov edx,1
0048CE7A|.E8 8D7DF7FF      call ztks30.00404C0C               ;判断注册码格式,并截取这段注册码前3位
0048CE7F|.FF75 E8            push
0048CE82|.8D45 FC            lea eax,
0048CE85|.BA 03000000      mov edx,3
0048CE8A|.E8 DD7BF7FF      call ztks30.00404A6C               ;合并截取的注册码,顺序为第一段注册码的第一位、第二段的第2-3位、第四段的第1-3位
0048CE8F|.8B45 FC            mov eax,
0048CE92|.50               push eax
0048CE93|.8D45 E0            lea eax,
0048CE96|.50               push eax
0048CE97|.8D55 DC            lea edx,
0048CE9A|.8B83 24030000      mov eax,dword ptr ds:
0048CEA0|.E8 43B0FBFF      call ztks30.00447EE8               ;取第五段注册码
0048CEA5|.8B45 DC            mov eax,                  ;第五段注册码放到EAX中
0048CEA8|.B9 03000000      mov ecx,3
0048CEAD|.BA 01000000      mov edx,1
0048CEB2|.E8 557DF7FF      call ztks30.00404C0C
0048CEB7|.8D45 E0            lea eax,
0048CEBA|.50               push eax
0048CEBB|.8D45 D8            lea eax,
0048CEBE|.50               push eax
0048CEBF|.8D55 D4            lea edx,
0048CEC2|.8B83 24030000      mov eax,dword ptr ds:
0048CEC8|.E8 1BB0FBFF      call ztks30.00447EE8               ;取第五段注册码
0048CECD|.8B45 D4            mov eax,                   ;第五段注册码放到EAX中
0048CED0|.B9 03000000      mov ecx,3
0048CED5|.BA 05000000      mov edx,5
0048CEDA|.E8 2D7DF7FF      call ztks30.00404C0C               ;判断注册码格式,并截取这段注册码最后3位
0048CEDF|.8B55 D8            mov edx,
0048CEE2|.58               pop eax
0048CEE3|.E8 CC7AF7FF      call ztks30.004049B4               ;再截取第五段注册码前3位,并合并第五段注册码最后三位
0048CEE8|.8B55 E0            mov edx,                  ;第五段截取合并后放到EDX中
0048CEEB|.58               pop eax                              ;弹出上面第1、2、4段注册码分割合并后的值放到EAX中
0048CEEC|.E8 077CF7FF      call ztks30.00404AF8               ;上面的那2个比较,又是那个比较CALL
0048CEF1|.75 0C            jnz short ztks30.0048CEFF            ;关键跳
0048CEF3|.8B83 30030000      mov eax,dword ptr ds:
0048CEF9|.8078 40 00         cmp byte ptr ds:,0
0048CEFD|.75 04            jnz short ztks30.0048CF03
0048CEFF|>33C0               xor eax,eax
0048CF01|.EB 02            jmp short ztks30.0048CF05
0048CF03|>B0 01            mov al,1
0048CF05|>3C 01            cmp al,1
0048CF07|.0F85 91000000      jnz ztks30.0048CF9E
0048CF0D|.33D2               xor edx,edx
0048CF0F|.8B83 14030000      mov eax,dword ptr ds:
0048CF15|.E8 EEAEFBFF      call ztks30.00447E08
0048CF1A|.33D2               xor edx,edx
0048CF1C|.8B83 18030000      mov eax,dword ptr ds:
0048CF22|.E8 E1AEFBFF      call ztks30.00447E08
0048CF27|.33D2               xor edx,edx
0048CF29|.8B83 1C030000      mov eax,dword ptr ds:
0048CF2F|.E8 D4AEFBFF      call ztks30.00447E08
0048CF34|.33D2               xor edx,edx
0048CF36|.8B83 20030000      mov eax,dword ptr ds:
0048CF3C|.E8 C7AEFBFF      call ztks30.00447E08
0048CF41|.33D2               xor edx,edx
0048CF43|.8B83 24030000      mov eax,dword ptr ds:
0048CF49|.E8 BAAEFBFF      call ztks30.00447E08
0048CF4E|.33D2               xor edx,edx
0048CF50|.8B83 30030000      mov eax,dword ptr ds:
0048CF56|.E8 352DFAFF      call ztks30.0042FC90
0048CF5B|.33D2               xor edx,edx
0048CF5D|.8B83 34030000      mov eax,dword ptr ds:
0048CF63|.E8 282DFAFF      call ztks30.0042FC90
0048CF68|.B2 01            mov dl,1
0048CF6A|.8B83 54030000      mov eax,dword ptr ds:
0048CF70|.E8 93AEFBFF      call ztks30.00447E08
0048CF75|.B2 01            mov dl,1
0048CF77|.8B83 28030000      mov eax,dword ptr ds:
0048CF7D|.E8 86AEFBFF      call ztks30.00447E08
0048CF82|.33D2               xor edx,edx
0048CF84|.8B83 2C030000      mov eax,dword ptr ds:
0048CF8A|.E8 79AEFBFF      call ztks30.00447E08
0048CF8F|.B2 01            mov dl,1
0048CF91|.8B83 60030000      mov eax,dword ptr ds:
0048CF97|.E8 6CAEFBFF      call ztks30.00447E08
0048CF9C|.EB 0F            jmp short ztks30.0048CFAD
0048CF9E|>B8 DCCF4800      mov eax,ztks30.0048CFDC
0048CFA3|.E8 300AFAFF      call ztks30.0042D9D8
0048CFA8|.E8 CB75F7FF      call ztks30.00404578
0048CFAD|>33C0               xor eax,eax
0048CFAF|.5A               pop edx
0048CFB0|.59               pop ecx
0048CFB1|.59               pop ecx
0048CFB2|.64:8910            mov dword ptr fs:,edx
0048CFB5|.68 CFCF4800      push ztks30.0048CFCF
0048CFBA|>8D45 D4            lea eax,
0048CFBD|.BA 0B000000      mov edx,0B
0048CFC2|.E8 4977F7FF      call ztks30.00404710
0048CFC7\.C3               retn
我还是再啰嗦一下:这段代码和Timer2事件挺相似的,主要不同的地方在于取某段注册码的位置,怎么取的我上面已经说明了。我想有些朋友可能会问,你怎么知道在某一段注册码中是取哪些位置的注册码呢?我稍微说下:
call ztks30.00404C0C这个CALL我在上面的解释是:判断注册码格式,并截取这段注册码的xxx位,我这么说可能不太准确,如果有错误的地方还请大侠多多指点一下。我们注意看下,这个CALL上面基本都有这样2行代码:
mov ecx,x
mov edx,x ;x代表某个数值。为什么在CALL之前要做这么一件事呢?应该是为CALL传递参数吧,那么传递什么参数呢?如果我们进CALL里面稍微看下,再返回来整体的看一下就会想到,ECX传递的是取“几”位注册码,EDX传递的是从“哪”一位开始截取注册码(我的理解是这样的,如果有误的话还请大侠多指点一下)。
-------------------------------------------------------------------------------------------------------
经过了上面的分析,看来大功应该要告成了,可是作者又和我们开了一个玩笑,如图3:
http://i.namipan.com/files/eb9036ce197174ce84e310e3671069bad52f3626d8210000953d/0/1.jpg
还要验证用户名啊,不过成功就在眼前,绝不能放弃,何况最困难的时期已经度过了,千万不能在这里退却!
还是继续祭出法宝DEDE 找一下验证用户名的注册按钮事件:
0048D6AC/.55               push ebp
0048D6AD|.8BEC               mov ebp,esp
0048D6AF|.6A 00            push 0
0048D6B1|.6A 00            push 0
0048D6B3|.6A 00            push 0
0048D6B5|.53               push ebx
0048D6B6|.8BD8               mov ebx,eax
0048D6B8|.33C0               xor eax,eax
0048D6BA|.55               push ebp
0048D6BB|.68 95D74800      push ztks30.0048D795
0048D6C0|.64:FF30            push dword ptr fs:
0048D6C3|.64:8920            mov dword ptr fs:,esp
0048D6C6|.8B83 30030000      mov eax,dword ptr ds:
0048D6CC|.8078 40 00         cmp byte ptr ds:,0
0048D6D0|.0F85 95000000      jnz ztks30.0048D76B
0048D6D6|.8D45 FC            lea eax,
0048D6D9|.50               push eax
0048D6DA|.8D55 F8            lea edx,
0048D6DD|.8B83 28030000      mov eax,dword ptr ds:
0048D6E3|.E8 00A8FBFF      call ztks30.00447EE8               ;取用户名
0048D6E8|.8B45 F8            mov eax,                  ;用户名放到EAX中
0048D6EB|.E8 BC72F7FF      call ztks30.004049AC
0048D6F0|.48               dec eax
0048D6F1|.50               push eax
0048D6F2|.8D55 F4            lea edx,
0048D6F5|.8B83 28030000      mov eax,dword ptr ds:
0048D6FB|.E8 E8A7FBFF      call ztks30.00447EE8               ;取用户名
0048D700|.8B45 F4            mov eax,                  ;用户名放到EAX中
0048D703|.B9 02000000      mov ecx,2
0048D708|.5A               pop edx
0048D709|.E8 FE74F7FF      call ztks30.00404C0C               ;判断用户名格式,并截取这用户名最后2位
0048D70E|.8B45 FC            mov eax,                  ;最后2位用户名放到EAX中
0048D711|.BA ACD74800      mov edx,ztks30.0048D7AC            ;ASCII "70"
0048D716|.E8 DD73F7FF      call ztks30.00404AF8               ;还是那个比较CALL,比较用户名最后两位是否和70相等
0048D71B|.75 4E            jnz short ztks30.0048D76B            ;关键跳
0048D71D|.E8 46CFF7FF      call ztks30.0040A668
0048D722|.83C4 F8            add esp,-8
0048D725|.DD1C24             fstp qword ptr ss:
0048D728|.9B               wait
0048D729|.8B83 58030000      mov eax,dword ptr ds:
0048D72F|.E8 3072FAFF      call ztks30.00434964
0048D734|.B8 B8D74800      mov eax,ztks30.0048D7B8            ;ASCII "08:20:02"
0048D739|.E8 56E4F7FF      call ztks30.0040BB94
0048D73E|.83C4 F8            add esp,-8                           ; /
0048D741|.DD1C24             fstp qword ptr ss:            ; |Arg1 (8-byte)
0048D744|.9B               wait                                 ; |
0048D745|.8B83 5C030000      mov eax,dword ptr ds:       ; |
0048D74B|.E8 F07FFAFF      call ztks30.00435740               ; \ztks30.00435740
0048D750|.B8 CCD74800      mov eax,ztks30.0048D7CC            ;ASCII "c:\windows\winksre"
0048D755|.E8 EAF1FFFF      call ztks30.0048C944
0048D75A|.B8 E8D74800      mov eax,ztks30.0048D7E8
0048D75F|.E8 7402FAFF      call ztks30.0042D9D8
0048D764|.E8 0F6EF7FF      call ztks30.00404578
0048D769|.EB 0F            jmp short ztks30.0048D77A
0048D76B|>B8 30D84800      mov eax,ztks30.0048D830
0048D770|.E8 6302FAFF      call ztks30.0042D9D8
0048D775|.E8 FE6DF7FF      call ztks30.00404578
0048D77A|>33C0               xor eax,eax
0048D77C|.5A               pop edx
0048D77D|.59               pop ecx
0048D77E|.59               pop ecx
0048D77F|.64:8910            mov dword ptr fs:,edx
0048D782|.68 9CD74800      push ztks30.0048D79C
0048D787|>8D45 F4            lea eax,
0048D78A|.BA 03000000      mov edx,3
0048D78F|.E8 7C6FF7FF      call ztks30.00404710
0048D794\.C3               retn
其实就是验证用户名最后两位和字符70是否一样,一样就注册成功了。
------------------------------------------------------------------------
【破解总结】今天这个软件也是一个比较有代表型的软件,“不输入正确注册码,注册按钮就是灰色”,我的破解思路就是通过对Timer事件的分析来达到关键部分,这是我破解这个软件所总结的一点心得,不敢私藏,愿与像我这样的菜鸟分享。
同时我要向大侠再请教一下,这个软件刚好是DELPHI的,刚好用DEDE看到一些事件,哪天要是碰上个不是DELPHI的,或者是反DEDE的类似的程序,那应该如何下手解决呢?这个希望大侠能稍微指点一下,不胜感激!
                                          感谢PYG的无私培养
------------------------------------------------------------------------
【版权声明】破文版权归我,转载版权归你。欢迎转载,盗版不究。如果能帮我改正和补充一下的话我
会更高兴的*^_^*

[ 本帖最后由 傻人有傻福 于 2008-3-28 22:44 编辑 ]

magic659117852 发表于 2008-3-28 23:03:42

/:001 再次顶楼主...

支持把原程序发出来 /:018   /:018

傻人有傻福 发表于 2008-3-28 23:32:37

原帖由 magic659117852 于 2008-3-28 23:03 发表 https://www.chinapyg.com/images/common/back.gif
/:001 再次顶楼主...

支持把原程序发出来 /:018   /:018
想调试的话 PM我为什么不发软件地址的原因我也已经说明了

ThanksBoy 发表于 2008-3-28 23:42:22

我要啊发给我啊
谢谢啊

ddxy 发表于 2008-3-28 23:57:13

谢谢楼主分享,内容已经收藏!

wiliiwin 发表于 2008-3-29 00:21:03

不错啊 很经典哦 好喜欢 收藏了

glassfox 发表于 2008-3-29 00:34:44

非常好的破文!支持!!可以发我一份源程序么?
[email protected]谢谢!

杨家将 发表于 2008-3-29 01:14:57

DEDE?没用过。/:L

ttt0001 发表于 2008-3-29 07:05:52

分析的很详细,学习了,谢谢楼主!发一份来练习一下!
[email protected]

GGLHY 发表于 2008-3-31 16:56:08

谢谢楼主分享,对我等菜鸟很有帮助的!
页: [1] 2
查看完整版本: 一个不输入正确注册码,注册按钮就是灰色的软件的简单分析