一个VBCrackme详解~~!!!
【文章标题】: 一个VBCrackme详解【文章作者】: creantan
【作者邮箱】: crackfun@126.com
【下载地址】: http://bbs.52pojie.cn/read.php?tid-12264.html
--------------------------------------------------------------------------------
【详细过程】
PEID VBCrackme无壳。。。
OD载入,F9运行,发现程序直接退出(信息一)。
重新加载,根据信息一我们下ExitProcess断点,再次运行。。OD断下来。。这时看堆栈ExitProcess调用来自MSVBVM60.DLL(信息二)。。。
重新加载,根据信息二 查找-》所有模块间的调用。。我们可以找到如下信息:
004044B7 CALL DWORD PTR DS:[<&MSVBVM60.__vbaEnd>]MSVBVM60.__vbaEnd
00404759 CALL DWORD PTR DS:[<&MSVBVM60.__vbaEnd>]MSVBVM60.__vbaEnd
00404877 CALL DWORD PTR DS:[<&MSVBVM60.__vbaEnd>]MSVBVM60.__vbaEnd
都下F2断点。。
F9运行程序
00404757 . EB 06JMP SHORT Crackme.0040475F
00404759 > FF15 18104000CALL DWORD PTR DS:[<&MSVBVM60.__vbaEnd>] ;MSVBVM60.__vbaEnd//在这里被断下
0040475F > 8B03 MOV EAX,DWORD PTR DS:
往上看。。。
004046D0 . 66:85F6TEST SI,SI
004046D3 . 0F84 80000000JE Crackme.00404759//跳到__vbaEnd
再往上看。。。
0040468B . FF15 D0104000CALL DWORD PTR DS:[<&MSVBVM60.__vbaLateM>;MSVBVM60.__vbaLateMemCallLd
00404691 . 83C4 20ADD ESP,20
00404694 . 50 PUSH EAX
00404695 . 8D45 80LEA EAX,DWORD PTR SS:
00404698 . 50 PUSH EAX
00404699 . FF15 64104000CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarTs>;MSVBVM60.__vbaVarTstEq
0040469F . 8D4D D4LEA ECX,DWORD PTR SS:
004046A2 . 8BF0 MOV ESI,EAX //SI由EAX赋值
从这里我们可以发现的信息是:00404699这个Call对0040468B这个Call的返回值与00404698 EAX进行比较。。。
我们在0040468B下断。。。
重新加载运行。。断在0040468B处。。这时看堆栈:
0012FA58 00836F50
0012FA5C 00402858UNICODE "FileExists"
0012FA60 00000001
0012FA64 00000008
0012FA68 0012FA78
0012FA6C 0015BAFCUNICODE "E:\Crackme-28362.dat"
0012FA70 001A05A2
0012FA74 0012FB20
重这里我们可以发现原来在0040468B的Call是用来检测 E:\Crackme-28362.dat文件是否存在的。。。
我们根据此信息在E盘根目录下建立该文件。里面随便填什么。。。我填的是(creantan)
(不一定就在E盘根目录下,如果你的Crackme放在F盘,那就在F盘的根目录下建立该文件就可以了。。)
重新加载运行有反应了。。。
随便输入一串字符点Check。。发现OD断在004044B7处
004044AF . FF90 04070000CALL DWORD PTR DS: ; call 402513
004044B5 . EB 06JMP SHORT Crackme.004044BD
004044B7 > FF15 18104000CALL DWORD PTR DS:[<&MSVBVM60.__vbaEnd>] ;MSVBVM60.__vbaEnd
我们往上看
00404480 . 52 PUSH EDX // "creantan"文件中我们填入的信息
00404481 . 68 18284000PUSH Crackme.00402818 // 1
00404486 . FF15 60104000CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCm>;MSVBVM60.__vbaStrCmp
0040448C . 8BF0 MOV ESI,EAX
。。。。
。。。。
004044A7 . 66:85F6TEST SI,SI
004044AA . 74 0BJE SHORT Crackme.004044B7//眺往 MSVBVM60.__vbaEnd
我们发现004044AA跳转由00404486比较决定,也就是说你在文件中填入的信息与1进行比较,为了不让它跳转我们把文件中信息改成1。
重新加载运行。。。输入:creantan
弹出窗口显示"Not more than 5 letters or numbers"。
我们可以重这里下手bp rtcMsgBox。。运行没被断下来。。换个断点。bp ShowWindow。
OD断下后执行到用户代码。。我们可以看到
00404925 > \8B55 EC mov edx, dword ptr
00404928 .52pushedx; /String
00404929 .FF15 14104000 calldword ptr [<&MSVBVM60.__vbaLenBs>; \__vbaLenBstr
0040492F .33C9xor ecx, ecx
00404931 .83F8 05 cmp eax, 5 //输入位数与5比较
00404934 .0F9FC1setgcl
00404937 .F7D9neg ecx
00404939 .8BF1mov esi, ecx
0040493B .8D4D EC lea ecx, dword ptr
0040493E .FF15 EC104000 calldword ptr [<&MSVBVM60.__vbaFreeS>;MSVBVM60.__vbaFreeStr
00404944 .8D4D E8 lea ecx, dword ptr
00404947 .FF15 E8104000 calldword ptr [<&MSVBVM60.__vbaFreeO>;MSVBVM60.__vbaFreeObj
0040494D .66:3BF7 cmp si, di
00404950 .0F84 84000000 je004049DA//位数不超过5就跳走
到这里我们可以开始找真码了。。。
00404950 .0F84 84000000 je004049DA
。。。
004049DA > E8 31000000CALL Crackme.00404A10
F7跟入。。。
。。。。。。
。。。。。。
00404AB4 > \8B45 EC mov eax, dword ptr
00404AB7 .8D55 C0 lea edx, dword ptr
00404ABA .8945 D8 mov dword ptr , eax
00404ABD .52pushedx; /Length8
00404ABE .8D45 D0 lea eax, dword ptr ; |
00404AC1 .6A 01 push1; |Start = 1//取第一个字符
00404AC3 .8D4D B0 lea ecx, dword ptr ; |
00404AC6 .50pusheax; |dString8
00404AC7 .51pushecx; |RetBUFFER
00404AC8 .C745 C8 01000>mov dword ptr , 1; |
00404ACF .C745 C0 02000>mov dword ptr , 2; |
00404AD6 .897D EC mov dword ptr , edi; |
00404AD9 .C745 D0 08000>mov dword ptr , 8; |
00404AE0 .FF15 50104000 calldword ptr [<&MSVBVM60.#632>] ; \rtcMidCharVar
00404AE6 .8D55 B0 lea edx, dword ptr
00404AE9 .8D45 80 lea eax, dword ptr
00404AEC .52pushedx; /var18
00404AED .50pusheax; |var28
00404AEE .C745 88 942A4>mov dword ptr , 00402A94 ; |o //与"O"进行比较
00404AF5 .C745 80 08800>mov dword ptr , 8008 ; |
00404AFC .FF15 64104000 calldword ptr [<&MSVBVM60.__vbaVarTs>; \__vbaVarTstEq
。。。。。。
0404D50 . FF15 50104000CALL DWORD PTR DS:[<&MSVBVM60.#632>] ;MSVBVM60.rtcMidCharVar
。。。。。。
00404D5E . C745 88 9C2A40>MOV DWORD PTR SS:,Crackme.00402A9C //第二位与00402A9C ("B")进行比较
00404D65 . C745 80 088000>MOV DWORD PTR SS:,8008
00404D6C . FF15 64104000CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarTstEq>];MSVBVM60.__vbaVarTstEq
。。。。。。
。。。。。。
00404FC0 . FF15 50104000CALL DWORD PTR DS:[<&MSVBVM60.#632>] ;MSVBVM60.rtcMidCharVar
。。。。。。
00404FCE . C745 88 A42A40>MOV DWORD PTR SS:,Crackme.00402AA4//第三位与00402AA4("S")进行比较
00404FD5 . C745 80 088000>MOV DWORD PTR SS:,8008
00404FDC . FF15 64104000CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarTstEq>];MSVBVM60.__vbaVarTstEq
。。。。。。
。。。。。。
00405216 . BE 01000000MOV ESI,1
。。。。。。
。。。。。。
00405231 . FF15 50104000CALL DWORD PTR DS:[<&MSVBVM60.#632>] ;MSVBVM60.rtcMidCharVar
。。。。。。
。。。。。。
0040523F . 8975 88MOV DWORD PTR SS:,ESI//第四位与("1")进行比较
00405242 . C745 80 028000>MOV DWORD PTR SS:,8002
00405249 . FF15 64104000CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarTstEq>];MSVBVM60.__vbaVarTstEq
。。。。。。
。。。。。。
004054A0 . FF15 50104000CALL DWORD PTR DS:[<&MSVBVM60.#632>] ;MSVBVM60.rtcMidCharVar
004054A6 . 8D55 B0LEA EDX,DWORD PTR SS:
004054A9 . 8D45 80LEA EAX,DWORD PTR SS:
004054AC . 52 PUSH EDX
004054AD . 50 PUSH EAX
004054AE . C745 88 AC2A40>MOV DWORD PTR SS:,Crackme.00402AAC //第五位与402AAC("D")
004054B5 . C745 80 088000>MOV DWORD PTR SS:,8008
004054BC . FF15 64104000CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarTstEq>];MSVBVM60.__vbaVarTstEq
所以真码就是("OBS1D")了。。。。
你输入真码GOOD信息只显示一次,第二次点Check就显示Bad了。。。
还可以这样输:第一次输入OB点CHECK显示Bad,然后输入OBS点CHECK显示GOOD
--------------------------------------------------------------------------------
【版权声明】: 本文原创于creantan, 转载请注明作者并保持文章的完整, 谢谢! 做一个语音教程就更好了。 不錯樓主寫的很詳盡學習了 :lol 写的不错啊 重新加载,根据信息二 查找-》所有模块间的调用。。我们可以找到如下信息:
学习了。。谢谢 学习了,谢谢楼主。 新手,不是很明白? 对不起,你访问的地址已更换;请点下面的文字连接转入首页搜索——载入中,请稍侯...
楼主能否给出crackme下载地址? 写的不错 很好,很受用,感谢楼主
页:
[1]
2