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

时间:2022-04-05 12:07:02

[反汇编练习] 160个CrackMe之014.

本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将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不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。

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

2、程序分析:

想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。

和上一节一样,打开CHM,选择第14个bjanes.exe,保存下来。运行程序,程序界面如下:

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

和之前的很多程序一样,有错误对话框。

使用PEID查看:VB 5.0 – 6.0

 

3、思路分析和破解流程

由于没壳,还有信息框,所以我们直接使用OD暂停,查看堆栈就可以跟踪到了。具体步骤:

1、打开OD,将exe拖入OD中,F9运行。

2、在Exe中输入伪码123456,点击Check it,信息框提示try again!

3、回到OD,点击暂停按钮(Ctrl+F2),然后点击K图标(Ctrl+K),可以看到此时的堆栈信息

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

选中最后一个rtcMsgBox,右键->Show Call,返回到了反汇编窗口。

4、从Call xxxrtcMsgBox的位置开始,在附近浏览代码,发现很明显有提示正确和失败的文本。

00403A1D   .^ E9 5AFDFFFF      jmp 0040377C
00403A22 > 33DB xor ebx,ebx
00403A24 > 8B35 A4104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaVa>; msvbvm60.__vbaVarDup
00403A2A . B9 04000280 mov ecx,0x80020004
00403A2F . 894D 98 mov dword ptr ss:[ebp-0x68],ecx
00403A32 . B8 0A000000 mov eax,0xA
00403A37 . 894D A8 mov dword ptr ss:[ebp-0x58],ecx
00403A3A . BF 08000000 mov edi,0x8
00403A3F . 8D95 50FFFFFF lea edx,dword ptr ss:[ebp-0xB0]
00403A45 . 8D4D B0 lea ecx,dword ptr ss:[ebp-0x50]
00403A48 . 8945 90 mov dword ptr ss:[ebp-0x70],eax
00403A4B . 8945 A0 mov dword ptr ss:[ebp-0x60],eax
00403A4E . C785 58FFFFFF F0>mov dword ptr ss:[ebp-0xA8],004022F0 ; UNICODE "Wrong serial!"
00403A58 . 89BD 50FFFFFF mov dword ptr ss:[ebp-0xB0],edi
00403A5E . FFD6 call esi ; <&MSVBVM60.__vbaVarDup>
00403A60 . 8D95 60FFFFFF lea edx,dword ptr ss:[ebp-0xA0]
00403A66 . 8D4D C0 lea ecx,dword ptr ss:[ebp-0x40]
00403A69 . C785 68FFFFFF C8>mov dword ptr ss:[ebp-0x98],004022C8 ; UNICODE "Sorry, try again!"
00403A73 . 89BD 60FFFFFF mov dword ptr ss:[ebp-0xA0],edi
00403A79 . FFD6 call esi
00403A7B . 8D45 90 lea eax,dword ptr ss:[ebp-0x70]
00403A7E . 8D4D A0 lea ecx,dword ptr ss:[ebp-0x60]
00403A81 . 50 push eax
00403A82 . 8D55 B0 lea edx,dword ptr ss:[ebp-0x50]
00403A85 . 51 push ecx
00403A86 . 52 push edx
00403A87 . 8D45 C0 lea eax,dword ptr ss:[ebp-0x40]
00403A8A . 53 push ebx
00403A8B . 50 push eax
00403A8C . FF15 30104000 call dword ptr ds:[<&MSVBVM60.#595>] ; msvbvm60.rtcMsgBox
00403A92 . 8D4D 90 lea ecx,dword ptr ss:[ebp-0x70]
00403A95 . 8D55 A0 lea edx,dword ptr ss:[ebp-0x60]
00403A98 . 51 push ecx
00403A99 . 8D45 B0 lea eax,dword ptr ss:[ebp-0x50]
00403A9C . 52 push edx
00403A9D . 8D4D C0 lea ecx,dword ptr ss:[ebp-0x40]
00403AA0 . 50 push eax
00403AA1 . 51 push ecx
00403AA2 . EB 7E jmp short 00403B22
00403AA4 > 8B35 A4104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaVa>; msvbvm60.__vbaVarDup
00403AAA . B9 04000280 mov ecx,0x80020004
00403AAF . 894D 98 mov dword ptr ss:[ebp-0x68],ecx
00403AB2 . B8 0A000000 mov eax,0xA
00403AB7 . 894D A8 mov dword ptr ss:[ebp-0x58],ecx
00403ABA . BF 08000000 mov edi,0x8
00403ABF . 8D95 50FFFFFF lea edx,dword ptr ss:[ebp-0xB0]
00403AC5 . 8D4D B0 lea ecx,dword ptr ss:[ebp-0x50]
00403AC8 . 8945 90 mov dword ptr ss:[ebp-0x70],eax
00403ACB . 8945 A0 mov dword ptr ss:[ebp-0x60],eax
00403ACE . C785 58FFFFFF A4>mov dword ptr ss:[ebp-0xA8],004022A4 ; UNICODE "Correct serial!"
00403AD8 . 89BD 50FFFFFF mov dword ptr ss:[ebp-0xB0],edi
00403ADE . FFD6 call esi ; <&MSVBVM60.__vbaVarDup>
00403AE0 . 8D95 60FFFFFF lea edx,dword ptr ss:[ebp-0xA0]
00403AE6 . 8D4D C0 lea ecx,dword ptr ss:[ebp-0x40]
00403AE9 . C785 68FFFFFF 58>mov dword ptr ss:[ebp-0x98],00402258 ; UNICODE "Good job, tell me how you do that!"
00403AF3 . 89BD 60FFFFFF mov dword ptr ss:[ebp-0xA0],edi
00403AF9 . FFD6 call esi
00403AFB . 8D55 90 lea edx,dword ptr ss:[ebp-0x70]
00403AFE . 8D45 A0 lea eax,dword ptr ss:[ebp-0x60]
00403B01 . 52 push edx
00403B02 . 8D4D B0 lea ecx,dword ptr ss:[ebp-0x50]
00403B05 . 50 push eax
00403B06 . 51 push ecx
00403B07 . 8D55 C0 lea edx,dword ptr ss:[ebp-0x40]
00403B0A . 53 push ebx
00403B0B . 52 push edx
00403B0C . FF15 30104000 call dword ptr ds:[<&MSVBVM60.#595>] ; msvbvm60.rtcMsgBox

5、从这段代码开始,继续向上寻找,发现je/jg/jmp等跳转时选中这一行,查看跳转的位置,分析一下大概流程:

00403787      0F8F 17030000    jg 00403AA4                              ;  // 这个直接跳到正确,关键跳转
0040378D . 8B17 mov edx,dword ptr ds:[edi]
0040378F . 57 push edi
00403790 . FF92 08030000 call dword ptr ds:[edx+0x308]
00403796 . 50 push eax
00403797 . 8D45 D4 lea eax,dword ptr ss:[ebp-0x2C]
0040379A . 50 push eax
0040379B . FF15 2C104000 call dword ptr ds:[<&MSVBVM60.__vbaObjSe>; msvbvm60.__vbaObjSet
004037A1 . 8BD8 mov ebx,eax
004037A3 . 8D55 E4 lea edx,dword ptr ss:[ebp-0x1C]
004037A6 . 52 push edx
004037A7 . 53 push ebx
004037A8 . 8B0B mov ecx,dword ptr ds:[ebx]
004037AA . FF91 A0000000 call dword ptr ds:[ecx+0xA0]
004037B0 . 85C0 test eax,eax
004037B2 . DBE2 fclex
004037B4 . 7D 12 jge short 004037C8 ; // 不是
004037B6 . 68 A0000000 push 0xA0
004037BB . 68 44224000 push 00402244
004037C0 . 53 push ebx
004037C1 . 50 push eax
004037C2 . FF15 24104000 call dword ptr ds:[<&MSVBVM60.__vbaHresu>; msvbvm60.__vbaHresultCheckObj
004037C8 > 8B07 mov eax,dword ptr ds:[edi]
004037CA . 57 push edi
004037CB . FF90 08030000 call dword ptr ds:[eax+0x308]
004037D1 . 8D4D D0 lea ecx,dword ptr ss:[ebp-0x30]
004037D4 . 50 push eax
004037D5 . 51 push ecx
004037D6 . FF15 2C104000 call dword ptr ds:[<&MSVBVM60.__vbaObjSe>; msvbvm60.__vbaObjSet
004037DC . 8BF8 mov edi,eax
004037DE . 8D45 DC lea eax,dword ptr ss:[ebp-0x24]
004037E1 . 50 push eax
004037E2 . 57 push edi
004037E3 . 8B17 mov edx,dword ptr ds:[edi]
004037E5 . FF92 A0000000 call dword ptr ds:[edx+0xA0]
004037EB . 85C0 test eax,eax
004037ED . DBE2 fclex
004037EF . 7D 12 jge short 00403803 ; // 不是
004037F1 . 68 A0000000 push 0xA0
004037F6 . 68 44224000 push 00402244
004037FB . 57 push edi
004037FC . 50 push eax
004037FD . FF15 24104000 call dword ptr ds:[<&MSVBVM60.__vbaHresu>; msvbvm60.__vbaHresultCheckObj
00403803 > 0FBF7D E8 movsx edi,word ptr ss:[ebp-0x18]
00403807 . 8B55 DC mov edx,dword ptr ss:[ebp-0x24]
0040380A . B9 01000000 mov ecx,0x1
0040380F . 894D C8 mov dword ptr ss:[ebp-0x38],ecx
00403812 . 894D B8 mov dword ptr ss:[ebp-0x48],ecx
00403815 . 8D4D B0 lea ecx,dword ptr ss:[ebp-0x50]
00403818 . B8 02000000 mov eax,0x2
0040381D . 51 push ecx
0040381E . 57 push edi
0040381F . 52 push edx
00403820 . 8945 C0 mov dword ptr ss:[ebp-0x40],eax
00403823 . 8945 B0 mov dword ptr ss:[ebp-0x50],eax
00403826 . FF15 44104000 call dword ptr ds:[<&MSVBVM60.#631>] ; msvbvm60.rtcMidCharBstr
0040382C . 8BD0 mov edx,eax
0040382E . 8D4D D8 lea ecx,dword ptr ss:[ebp-0x28]
00403831 . FFD6 call esi
00403833 . 50 push eax
00403834 . FF15 1C104000 call dword ptr ds:[<&MSVBVM60.#516>] ; msvbvm60.rtcAnsiValueBstr
0040383A . 8B4D E4 mov ecx,dword ptr ss:[ebp-0x1C]
0040383D . 33DB xor ebx,ebx
0040383F . 66:3D 3900 cmp ax,0x39
00403843 . 8D45 C0 lea eax,dword ptr ss:[ebp-0x40]
00403846 . 50 push eax
00403847 . 57 push edi
00403848 . 0F9FC3 setg bl
0040384B . 51 push ecx
0040384C . F7DB neg ebx
0040384E . FF15 44104000 call dword ptr ds:[<&MSVBVM60.#631>] ; msvbvm60.rtcMidCharBstr
00403854 . 8BD0 mov edx,eax
00403856 . 8D4D E0 lea ecx,dword ptr ss:[ebp-0x20]
00403859 . FFD6 call esi
0040385B . 50 push eax
0040385C . FF15 1C104000 call dword ptr ds:[<&MSVBVM60.#516>] ; msvbvm60.rtcAnsiValueBstr
00403862 . 33D2 xor edx,edx
00403864 . 66:3D 3000 cmp ax,0x30
00403868 . 0F9CC2 setl dl
0040386B . F7DA neg edx
0040386D . 8D45 D8 lea eax,dword ptr ss:[ebp-0x28]
00403870 . 23DA and ebx,edx
00403872 . 8D4D DC lea ecx,dword ptr ss:[ebp-0x24]
00403875 . 50 push eax
00403876 . 8D55 E0 lea edx,dword ptr ss:[ebp-0x20]
00403879 . 51 push ecx
0040387A . 8D45 E4 lea eax,dword ptr ss:[ebp-0x1C]
0040387D . 52 push edx
0040387E . 50 push eax
0040387F . 6A 04 push 0x4
00403881 . FF15 90104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeS>; msvbvm60.__vbaFreeStrList
00403887 . 8D4D D0 lea ecx,dword ptr ss:[ebp-0x30]
0040388A . 8D55 D4 lea edx,dword ptr ss:[ebp-0x2C]
0040388D . 51 push ecx
0040388E . 52 push edx
0040388F . 6A 02 push 0x2
00403891 . FF15 18104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeO>; msvbvm60.__vbaFreeObjList
00403897 . 8D45 B0 lea eax,dword ptr ss:[ebp-0x50]
0040389A . 8D4D C0 lea ecx,dword ptr ss:[ebp-0x40]
0040389D . 50 push eax
0040389E . 51 push ecx
0040389F . 6A 02 push 0x2
004038A1 . FF15 0C104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeV>; msvbvm60.__vbaFreeVarList
004038A7 . 83C4 2C add esp,0x2C
004038AA . 66:85DB test bx,bx
004038AD . 0F85 6F010000 jnz 00403A22 ; // 不是
004038B3 . 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004038B6 . 50 push eax
004038B7 . 8B10 mov edx,dword ptr ds:[eax]
004038B9 . FF92 08030000 call dword ptr ds:[edx+0x308]
004038BF . 50 push eax
004038C0 . 8D45 D4 lea eax,dword ptr ss:[ebp-0x2C]
004038C3 . 50 push eax
004038C4 . FF15 2C104000 call dword ptr ds:[<&MSVBVM60.__vbaObjSe>; msvbvm60.__vbaObjSet
004038CA . 8BD8 mov ebx,eax
004038CC . 8D55 E4 lea edx,dword ptr ss:[ebp-0x1C]
004038CF . 52 push edx
004038D0 . 53 push ebx
004038D1 . 8B0B mov ecx,dword ptr ds:[ebx]
004038D3 . FF91 A0000000 call dword ptr ds:[ecx+0xA0]
004038D9 . 85C0 test eax,eax
004038DB . DBE2 fclex
004038DD . 7D 12 jge short 004038F1 ; // 选中5,不是
004038DF . 68 A0000000 push 0xA0
004038E4 . 68 44224000 push 00402244
004038E9 . 53 push ebx
004038EA . 50 push eax
004038EB . FF15 24104000 call dword ptr ds:[<&MSVBVM60.__vbaHresu>; msvbvm60.__vbaHresultCheckObj
004038F1 > 66:8B45 E8 mov ax,word ptr ss:[ebp-0x18]
004038F5 . 8B1D 74104000 mov ebx,dword ptr ds:[<&MSVBVM60.#536>] ; msvbvm60.rtcStrFromVar
004038FB . 66:35 0200 xor ax,0x2
004038FF . 8D4D A0 lea ecx,dword ptr ss:[ebp-0x60]
00403902 . 0F80 A4020000 jo 00403BAC ; // 选中4,不是
00403908 . 51 push ecx
00403909 . 66:8945 A8 mov word ptr ss:[ebp-0x58],ax
0040390D . C745 A0 02000000 mov dword ptr ss:[ebp-0x60],0x2
00403914 . FFD3 call ebx ; <&MSVBVM60.#536>
00403916 . 8BD0 mov edx,eax
00403918 . 8D4D D8 lea ecx,dword ptr ss:[ebp-0x28]
0040391B . FFD6 call esi
0040391D . 8B45 E4 mov eax,dword ptr ss:[ebp-0x1C]
00403920 . 8D55 C0 lea edx,dword ptr ss:[ebp-0x40]
00403923 . 52 push edx
00403924 . 57 push edi
00403925 . 50 push eax
00403926 . C745 C8 01000000 mov dword ptr ss:[ebp-0x38],0x1
0040392D . C745 C0 02000000 mov dword ptr ss:[ebp-0x40],0x2
00403934 . FF15 44104000 call dword ptr ds:[<&MSVBVM60.#631>] ; msvbvm60.rtcMidCharBstr
0040393A . 8BD0 mov edx,eax
0040393C . 8D4D E0 lea ecx,dword ptr ss:[ebp-0x20]
0040393F . FFD6 call esi
00403941 . 50 push eax
00403942 . FF15 1C104000 call dword ptr ds:[<&MSVBVM60.#516>] ; msvbvm60.rtcAnsiValueBstr
00403948 . 8D4D B0 lea ecx,dword ptr ss:[ebp-0x50]
0040394B . 66:8945 B8 mov word ptr ss:[ebp-0x48],ax
0040394F . 51 push ecx
00403950 . C745 B0 02000000 mov dword ptr ss:[ebp-0x50],0x2
00403957 . FFD3 call ebx
00403959 . 8BD0 mov edx,eax
0040395B . 8D4D DC lea ecx,dword ptr ss:[ebp-0x24]
0040395E . FFD6 call esi
00403960 . 50 push eax
00403961 . FF15 84104000 call dword ptr ds:[<&MSVBVM60.__vbaR8Str>; msvbvm60.__vbaR8Str
00403967 . DC25 D8104000 fsub qword ptr ds:[0x4010D8]
0040396D . 8D55 90 lea edx,dword ptr ss:[ebp-0x70]
00403970 . 6A 01 push 0x1
00403972 . 52 push edx
00403973 . C785 30FFFFFF 05>mov dword ptr ss:[ebp-0xD0],0x8005
0040397D . DD9D 38FFFFFF fstp qword ptr ss:[ebp-0xC8]
00403983 . DFE0 fstsw ax
00403985 . A8 0D test al,0xD
00403987 . 0F85 1A020000 jnz 00403BA7 ; // 选中3,查看,也不是
0040398D . 8B45 D8 mov eax,dword ptr ss:[ebp-0x28]
00403990 . C745 D8 00000000 mov dword ptr ss:[ebp-0x28],0x0
00403997 . 8945 98 mov dword ptr ss:[ebp-0x68],eax
0040399A . 8D45 80 lea eax,dword ptr ss:[ebp-0x80]
0040399D . 50 push eax
0040399E . C745 90 08000000 mov dword ptr ss:[ebp-0x70],0x8
004039A5 . FF15 B0104000 call dword ptr ds:[<&MSVBVM60.#619>] ; msvbvm60.rtcRightCharVar
004039AB . 8D8D 30FFFFFF lea ecx,dword ptr ss:[ebp-0xD0]
004039B1 . 8D55 80 lea edx,dword ptr ss:[ebp-0x80]
004039B4 . 51 push ecx
004039B5 . 52 push edx
004039B6 . FF15 A0104000 call dword ptr ds:[<&MSVBVM60.__vbaVarTs>; msvbvm60.__vbaVarTstNe
004039BC . 8BF8 mov edi,eax
004039BE . 8D45 D8 lea eax,dword ptr ss:[ebp-0x28]
004039C1 . 8D4D DC lea ecx,dword ptr ss:[ebp-0x24]
004039C4 . 50 push eax
004039C5 . 8D55 E0 lea edx,dword ptr ss:[ebp-0x20]
004039C8 . 51 push ecx
004039C9 . 8D45 E4 lea eax,dword ptr ss:[ebp-0x1C]
004039CC . 52 push edx
004039CD . 50 push eax
004039CE . 6A 04 push 0x4
004039D0 . FF15 90104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeS>; msvbvm60.__vbaFreeStrList
004039D6 . 83C4 14 add esp,0x14
004039D9 . 8D4D D4 lea ecx,dword ptr ss:[ebp-0x2C]
004039DC . FF15 C4104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeO>; msvbvm60.__vbaFreeObj
004039E2 . 8D4D 80 lea ecx,dword ptr ss:[ebp-0x80]
004039E5 . 8D55 90 lea edx,dword ptr ss:[ebp-0x70]
004039E8 . 51 push ecx
004039E9 . 8D45 A0 lea eax,dword ptr ss:[ebp-0x60]
004039EC . 52 push edx
004039ED . 8D4D B0 lea ecx,dword ptr ss:[ebp-0x50]
004039F0 . 50 push eax
004039F1 . 8D55 C0 lea edx,dword ptr ss:[ebp-0x40]
004039F4 . 51 push ecx
004039F5 . 52 push edx
004039F6 . 6A 05 push 0x5
004039F8 . FF15 0C104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeV>; msvbvm60.__vbaFreeVarList
004039FE . 83C4 18 add esp,0x18
00403A01 . 66:85FF test di,di
00403A04 . 75 1C jnz short 00403A22 ; // 选中2,不是
00403A06 . 8B7D 08 mov edi,dword ptr ss:[ebp+0x8]
00403A09 . B8 01000000 mov eax,0x1
00403A0E . 66:0345 E8 add ax,word ptr ss:[ebp-0x18]
00403A12 . 0F80 94010000 jo 00403BAC ; // 选中1,查看跳转,不是
00403A18 . 8945 E8 mov dword ptr ss:[ebp-0x18],eax
00403A1B . 33DB xor ebx,ebx
00403A1D .^ E9 5AFDFFFF jmp 0040377C

到这段代码最上的位置时,发现回调到正确文本的位置,所以我么可以很肯定,这个跳转时关键跳转,改为jmp强制跳转就可以了。我们试试,选中这一行->空格键->将jg 00403AA4改为jmp 00403AA4,记得左下角的Nop填充打钩。然后回到程序,再次点击check it,发现仍然提示失败!

5、继续向上看:

004036D3   .  FF15 24104000    call dword ptr ds:[<&MSVBVM60.__vbaHresu>;  msvbvm60.__vbaHresultCheckObj
004036D9 > 8B45 E4 mov eax,dword ptr ss:[ebp-0x1C]
004036DC . 50 push eax ; // eax="123123"
004036DD . FF15 08104000 call dword ptr ds:[<&MSVBVM60.__vbaLenBs>; msvbvm60.__vbaLenBstr
004036E3 . 33C9 xor ecx,ecx
004036E5 . 83F8 09 cmp eax,0x9 ; // 比较字符串长度与0x9,否则直接失败
004036E8 . 0F95C1 setne cl ; // cl=1
004036EB . F7D9 neg ecx ; // 取补,-1
004036ED . 8BF1 mov esi,ecx
004036EF . 8D4D E4 lea ecx,dword ptr ss:[ebp-0x1C]
004036F2 . FF15 C0104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeS>; msvbvm60.__vbaFreeStr
004036F8 . 8D4D D4 lea ecx,dword ptr ss:[ebp-0x2C]
004036FB . FF15 C4104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeO>; msvbvm60.__vbaFreeObj
00403701 . 66:3BF3 cmp si,bx
00403704 0F85 1A030000 jnz 00403A24 ; // 这个会直接跳到失败
0040370A . 8B17 mov edx,dword ptr ds:[edi]
0040370C . 57 push edi
0040370D . FF92 08030000 call dword ptr ds:[edx+0x308]

到这里发现它使用cmp比较和jnz进行字符串长度判断,如果不等于9则直接跳转到失败!所以,文本的长度必须为9。我们重新输入伪码123123123,点击check it,哈哈哈!成功了!

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

当然,你也可以将jnz跳转也修改了!这样字符串长度也不用必须是9了。

 

4、注册机的探索

注册码判断的内容在关键跳转的上面,我们大概分析一下:

0040373F   .  FF15 24104000 call dword ptr ds:[<&MSVBVM60.__vbaHresu>;  msvbvm60.__vbaHresultCheckObj
00403745 > 8B45 E4 mov eax,dword ptr ss:[ebp-0x1C]
00403748 . 50 push eax ; // "123123123"
00403749 . FF15 08104000 call dword ptr ds:[<&MSVBVM60.__vbaLenBs>; msvbvm60.__vbaLenBstr
0040374F . 8BC8 mov ecx,eax ; // eax = 9
00403751 . FF15 50104000 call dword ptr ds:[<&MSVBVM60.__vbaI2I4>>; msvbvm60.__vbaI2I4
00403757 . 8D4D E4 lea ecx,dword ptr ss:[ebp-0x1C] ; // ecx = "123123123"
0040375A . 8985 14FFFFFF mov dword ptr ss:[ebp-0xEC],eax ; // eax = 9
00403760 . C745 E8 01000>mov dword ptr ss:[ebp-0x18],0x1
00403767 . FF15 C0104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeS>; msvbvm60.__vbaFreeStr
0040376D . 8D4D D4 lea ecx,dword ptr ss:[ebp-0x2C]
00403770 . FF15 C4104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeO>; msvbvm60.__vbaFreeObj
00403776 . 8B35 AC104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaSt>; msvbvm60.__vbaStrMove
0040377C > 66:8B8D 14FFF>mov cx,word ptr ss:[ebp-0xEC] ; // cx =eax
00403783 . 66:394D E8 cmp word ptr ss:[ebp-0x18],cx ; // cx与0x1比较
00403787 0F8F 17030000 jg 00403AA4 ; // 这个直接跳到正确,关键跳转

这块算法只进行了一个比较,将文本长度和0x1比较,大于则成功!但是,由于在这之前又进行了文本长度校验,长度必须为9,所以按照正常逻辑,这是永远不可能提示正确的!

SO,这个程序没有注册码,只能爆破!

 

BY  笨笨D幸福