44018723 发表于 2014-7-2 19:49

[反汇编练习] 160个CrackMe之025


[反汇编练习] 160个CrackMe之025.本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西。其中,文章中按照如下逻辑编排(解决如下问题):1、使用什么环境和工具2、程序分析3、思路分析和破解流程4、注册机的探索----------------------------------提醒各位看客: 如果文章中的逻辑看不明白,那你一定是没有亲手操刀!OD中的跳转提示很强大,只要你跟踪了,不用怎么看代码就理解了!----------------------------------1、工具和环境:WinXP SP3 + 52Pojie六周年纪念版OD + PEID + 汇编金手指。160个CrackMe的打包文件。下载地址: http://pan.baidu.com/s/1xUWOY 密码: jbnq注:1、Win7系统对于模块和程序开启了随机初始地址的功能,会给分析带来很大的负担,所以不建议使用Win7进行分析。2、以上工具都是在52PoJie论坛下的原版程序,NOD32不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。http://images.cnitblog.com/blog/573547/201406/192147191763366.png2、程序分析:想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。和上一节一样,打开CHM,选择第25个CodeZero.1.exe,保存下来。运行程序,程序界面如下:http://images.cnitblog.com/blog/573547/201407/021921147307514.png

3、思路分析和破解流程又见信息框,我很高兴啊!PEID: Microsoft Visual Basic 5.0 / 6.0和以前的一样,直接上步骤:1、打开OD,将exe拖到OD窗口中,等程序暂停后,直接点击运行按钮(F9),不用理会。2、在exe中输入Key:123123。点击OK按钮,弹出错误信息框,不要关闭。3、在OD中点击暂停按钮(Ctrl+F12),再点击堆栈K按钮(Ctrl+K),可以看到当前堆栈情况。….图省略了4、选择 rtcMsgBox ,右键->Show call。向上浏览代码,很容易就发现了提示文本:
0040576E   . /74 2A         je short 0040579A                        ;// 关键跳转
00405770   . |E8 CDB9FFFF   call <jmp.&MSVBVM50.__vbaVarDup>
00405775   . |8D55 94       lea edx,dword ptr ss:
00405778   . |8D4D D4       lea ecx,dword ptr ss:
0040577B   . |C745 9C B4264>mov dword ptr ss:,004026B4   ;UNICODE "Congratulations! you've really made it :-)"
00405782   . |8975 94       mov dword ptr ss:,esi
00405785   . |E8 B8B9FFFF   call <jmp.&MSVBVM50.__vbaVarDup>
0040578A   . |8D45 A4       lea eax,dword ptr ss:
0040578D   . |50            push eax
0040578E   . |8D45 B4       lea eax,dword ptr ss:
00405791   . |50            push eax
00405792   . |8D45 C4       lea eax,dword ptr ss:
00405795   . |50            push eax
00405796   . |6A 40         push 0x40
00405798   . |EB 28         jmp short 004057C2
0040579A   > \E8 A3B9FFFF   call <jmp.&MSVBVM50.__vbaVarDup>
0040579F   .C745 9C 10274>mov dword ptr ss:,00402710   ;UNICODE "Invalid unlock code, please try again."
004057A6   >8D55 94       lea edx,dword ptr ss:
004057A9   .8D4D D4       lea ecx,dword ptr ss:
004057AC   .8975 94       mov dword ptr ss:,esi
004057AF   .E8 8EB9FFFF   call <jmp.&MSVBVM50.__vbaVarDup>
004057B4   .8D45 A4       lea eax,dword ptr ss:
004057B7   .50            push eax
004057B8   .8D45 B4       lea eax,dword ptr ss:
004057BB   .50            push eax
004057BC   .8D45 C4       lea eax,dword ptr ss:
004057BF   .50            push eax
004057C0   .6A 10         push 0x10
004057C2   >8D45 D4       lea eax,dword ptr ss:
004057C5   .50            push eax
004057C6   .E8 7DB9FFFF   call <jmp.&MSVBVM50.#595>


别的就不多说了,关键跳转为 je short 0040579A ,爆破很简单,选中这句汇编,右键->Binary->Fill with NOPs。试一试,哈哈,成功了!
4、注册机的探索我们继续向上分析,特别是 __vbsStrcmp 函数附近:
00405683   .E8 D2BAFFFF   call <jmp.&MSVBVM50.__vbaHresultCheckObj>
00405688   >FF75 E8       push dword ptr ss:
0040568B   .68 14264000   push 00402614                            ;// 空的
00405690   .E8 D1BAFFFF   call <jmp.&MSVBVM50.__vbaStrCmp>
00405695   .8BF8          mov edi,eax
00405697   .8D4D E8       lea ecx,dword ptr ss:
0040569A   .F7DF          neg edi
0040569C   .1BFF          sbb edi,edi
0040569E   .47            inc edi
0040569F   .F7DF          neg edi
004056A1   .E8 AEBAFFFF   call <jmp.&MSVBVM50.__vbaFreeStr>
004056A6   .8D4D E4       lea ecx,dword ptr ss:
004056A9   .E8 A0BAFFFF   call <jmp.&MSVBVM50.__vbaFreeObj>
004056AE   .66:3BFB       cmp di,bx
004056B1   .74 38         je short 004056EB                        ;// 检测字符是否为空
004056B3   .6A 0A         push 0xA
004056B5   .B9 04000280   mov ecx,0x80020004
004056BA   .58            pop eax
004056BB   .894D AC       mov dword ptr ss:,ecx
004056BE   .6A 08         push 0x8
004056C0   .894D BC       mov dword ptr ss:,ecx
004056C3   .5E            pop esi
004056C4   .8D55 84       lea edx,dword ptr ss:
004056C7   .8D4D C4       lea ecx,dword ptr ss:
004056CA   .8945 A4       mov dword ptr ss:,eax
004056CD   .8945 B4       mov dword ptr ss:,eax
004056D0   .C745 8C 68264>mov dword ptr ss:,00402668   ;VB Crack-Me 1.0 by CodeZero
004056D7   .8975 84       mov dword ptr ss:,esi
004056DA   .E8 63BAFFFF   call <jmp.&MSVBVM50.__vbaVarDup>
004056DF   .C745 9C 1C264>mov dword ptr ss:,0040261C   ;Please enter the registation code.
004056E6   .E9 BB000000   jmp 004057A6
004056EB   >FF75 08       push dword ptr ss:            ;// UNICODE "致@"
004056EE   .FFD6          call esi
004056F0   .50            push eax
004056F1   .8D45 E4       lea eax,dword ptr ss:
004056F4   .50            push eax
004056F5   .E8 66BAFFFF   call <jmp.&MSVBVM50.__vbaObjSet>
004056FA   .8BF0          mov esi,eax
004056FC   .8D4D E8       lea ecx,dword ptr ss:
004056FF   .51            push ecx
00405700   .56            push esi
00405701   .8B06          mov eax,dword ptr ds:
00405703   .FF90 A0000000 call dword ptr ds:
00405709   .3BC3          cmp eax,ebx
0040570B   .7D 11         jge short 0040571E
0040570D   .68 A0000000   push 0xA0
00405712   .68 00264000   push 00402600
00405717   .56            push esi
00405718   .50            push eax
00405719   .E8 3CBAFFFF   call <jmp.&MSVBVM50.__vbaHresultCheckObj>
0040571E   >FF75 E8       push dword ptr ss:             ;// "123123"
00405721   .68 A4264000   push 004026A4                            ;55555
00405726   .E8 3BBAFFFF   call <jmp.&MSVBVM50.__vbaStrCmp>         ;// 文本内容比较
0040572B   .8BF0          mov esi,eax
0040572D   .8D4D E8       lea ecx,dword ptr ss:
00405730   .F7DE          neg esi
00405732   .1BF6          sbb esi,esi
00405734   .46            inc esi
00405735   .F7DE          neg esi
00405737   .E8 18BAFFFF   call <jmp.&MSVBVM50.__vbaFreeStr>
0040573C   .8D4D E4       lea ecx,dword ptr ss:
0040573F   .E8 0ABAFFFF   call <jmp.&MSVBVM50.__vbaFreeObj>
00405744   .6A 0A         push 0xA
00405746   .66:3BF3       cmp si,bx
00405749   .58            pop eax
0040574A   .B9 04000280   mov ecx,0x80020004
0040574F   .6A 08         push 0x8
00405751   .894D AC       mov dword ptr ss:,ecx
00405754   .5E            pop esi
00405755   .894D BC       mov dword ptr ss:,ecx
00405758   .8945 A4       mov dword ptr ss:,eax
0040575B   .8945 B4       mov dword ptr ss:,eax
0040575E   .C745 8C 68264>mov dword ptr ss:,00402668   ;VB Crack-Me 1.0 by CodeZero
00405765   .8975 84       mov dword ptr ss:,esi
00405768   .8D55 84       lea edx,dword ptr ss:
0040576B   .8D4D C4       lea ecx,dword ptr ss:
0040576E      74 2A         je short 0040579A                        ;// 关键跳转
00405770   .E8 CDB9FFFF   call <jmp.&MSVBVM50.__vbaVarDup>
00405775   .8D55 94       lea edx,dword ptr ss:
00405778   .8D4D D4       lea ecx,dword ptr ss:
0040577B   .C745 9C B4264>mov dword ptr ss:,004026B4   ;Congratulations! you've really made it :-)
00405782   .8975 94       mov dword ptr ss:,esi
00405785   .E8 B8B9FFFF   call <jmp.&MSVBVM50.__vbaVarDup>
0040578A   .8D45 A4       lea eax,dword ptr ss:
0040578D   .50            push eax
0040578E   .8D45 B4       lea eax,dword ptr ss:
00405791   .50            push eax
00405792   .8D45 C4       lea eax,dword ptr ss:
00405795   .50            push eax
00405796   .6A 40         push 0x40
00405798   .EB 28         jmp short 004057C2
0040579A   >E8 A3B9FFFF   call <jmp.&MSVBVM50.__vbaVarDup>
0040579F   .C745 9C 10274>mov dword ptr ss:,00402710   ;Invalid unlock code, please try again.
004057A6   >8D55 94       lea edx,dword ptr ss:
004057A9   .8D4D D4       lea ecx,dword ptr ss:
004057AC   .8975 94       mov dword ptr ss:,esi
004057AF   .E8 8EB9FFFF   call <jmp.&MSVBVM50.__vbaVarDup>
004057B4   .8D45 A4       lea eax,dword ptr ss:
004057B7   .50            push eax
004057B8   .8D45 B4       lea eax,dword ptr ss:
004057BB   .50            push eax
004057BC   .8D45 C4       lea eax,dword ptr ss:
004057BF   .50            push eax
004057C0   .6A 10         push 0x10
004057C2   >8D45 D4       lea eax,dword ptr ss:
004057C5   .50            push eax
004057C6   .E8 7DB9FFFF   call <jmp.&MSVBVM50.#595>                ;// 返回到这里


很容易地发现了 对比文本的内容, 和 。55555 这个文本是固定的,所以注册码也是固定的 55555 。但是,这个程序的本意不是搜寻注册码,而是去掉第一个倒计时界面,所以,其实我们的任务还未完成。这个问题的关键是寻找创建窗口的代码位置,然后修改弹窗流程就可以了!
在OD中尝试了很多地方,都无法找到。所以,使用VB反编译工具试试看:

没办法,都无法跟踪到代码,实在没办法了!我们试试一个VB事件跟踪事件的软件:
遗憾的是,仍然无法找到窗口创建的代码位置。所以,只有到此结束!
BY   笨笨D幸福

小楠 发表于 2014-7-2 20:24

见证了一个大神的成才之路!

tony2526 发表于 2014-7-2 19:56

谢谢楼主分享,同意楼上看法,能出视频教程最好

shuguang 发表于 2014-7-2 19:51

建议出视频的。好理解,做课件又省事。

纵横、叼蛮意 发表于 2014-7-3 12:49

shuguang 发表于 2014-7-19 17:41

通过VBExplorer工具我们可以看到有3个窗口。
查看属性的一些信息可以确定。
form1为输入注册码的窗口,为主窗口。
form2为倒记时的窗口
form3为点击关于按钮时弹出的窗口(这个没什么用)
form1有三个事件。
我们找到form_load事件。地址00405905 。我想去掉form2的启动。结果没成功。

找到个方法能跳过倒记时但跳不过那个窗口。
查找form2有6个记时器,我改了其中一个倒记时时间5改为0.结果它又启动的后面的记时器进行验证。(改一个没用,要嘛全改)
倒记时完成后有个按钮事件。地址004059c2。跳向它的来源发现它的下面有6个事件是依次跳向记时器的。
我们在它跳到第1个记时器时改为按钮1的事件 00402345      E9 7B370000   jmp   004059C2
这样他就跳过5秒倒记时了。
00402330   .816C24 04 570>sub   dword ptr ss:,0x57
00402338   .E9 85360000   jmp   004059C2                         ;这个条向注册窗口
0040233D   .816C24 04 330>sub   dword ptr ss:,0x33
00402345      E9 7B370000   jmp   00405AC5                         ;跳向记时器1
0040234A   .816C24 04 3F0>sub   dword ptr ss:,0x3F
00402352   .E9 77380000   jmp   00405BCE                         ;跳向记时器2
00402357   .816C24 04 430>sub   dword ptr ss:,0x43
0040235F   .E9 73390000   jmp   00405CD7                         ;跳向记时器3
00402364   .816C24 04 470>sub   dword ptr ss:,0x47
0040236C   .E9 6F3A0000   jmp   00405DE0                         ;跳向记时器4
00402371   .816C24 04 4B0>sub   dword ptr ss:,0x4B
00402379   .E9 6B3B0000   jmp   00405EE9                         ;跳向记时器5
0040237E   .816C24 04 530>sub   dword ptr ss:,0x53
00402386   .E9 673C0000   jmp   00405FF2                         ;跳向记时器6

44018723 发表于 2014-7-19 19:26

shuguang 发表于 2014-7-19 17:41
通过VBExplorer工具我们可以看到有3个窗口。
查看属性的一些信息可以确定。
form1为输入注册码的窗口,为 ...

{:1_921:}很厉害啊!加油!

fcxfly 发表于 2014-9-10 13:52

shuguang 发表于 2014-7-19 17:41
通过VBExplorer工具我们可以看到有3个窗口。
查看属性的一些信息可以确定。
form1为输入注册码的窗口,为 ...

直接在 00405905 处把 push ebp 改成 retn 就可以跳过nag窗口了.

彬之酷吻 发表于 2014-10-20 22:50

shuguang 发表于 2014-7-19 17:41
通过VBExplorer工具我们可以看到有3个窗口。
查看属性的一些信息可以确定。
form1为输入注册码的窗口,为 ...

我想问下大神,你是怎么找到跳向计时器的代码的

彬之酷吻 发表于 2014-10-20 22:53

fcxfly 发表于 2014-9-10 13:52
直接在 00405905 处把 push ebp 改成 retn 就可以跳过nag窗口了.

你是怎样找到弹nag窗口的call的,大神。
页: [1]
查看完整版本: [反汇编练习] 160个CrackMe之025