[原创]VB卡刀辅助快速定位破解
由于一些原因, 两年没发破文了, 如今还是菜鸟, 都是做的笔记 就发下菜文
今天的练手程序比较适合新手,感觉有点意思,就有了今天的破文了
入门同学不妨试试看
是一个剑灵卡刀的辅助 VB程序的, 没什么技术含量, 高手飘过 

======== 症状 ==========
1.ANTI进程
2.打开软件会显示“试用版本”
3.输入假码注册结束后,会打开网页
4.文件时间效验
5.ANTI注册
实战:
载入OD , F9运行看看 , 发现原来的进程退出了,自动新开了一个进程出来了!
///解除 ANTI进程 ===================================
首先, 我们尝试对创建进程函数 CreateProcessA / CreateProcessW 进行下断,重新运行,发现断下来了 看堆栈:
0012F8E4 7350CEBF /CALL to CreateProcessW from msvbvm60.7350CEB9 0012F8E8 00000000 |ModuleFileName = NULL 0012F8EC 00169CFC |CommandLine = "C:\Documents and Settings\Administrator\桌面\剑灵卡刀(全职业) v4 09A\卡刀.exe" 0012F8F0 00000000 |pProcessSecurity = NULL 0012F8F4 00000000 |pThreadSecurity = NULL 0012F8F8 00000000 |InheritHandles = FALSE 0012F8FC 00000000 |CreationFlags = 0 0012F900 00000000 |pEnvironment = NULL 0012F904 00000000 |CurrentDir = NULL 0012F908 0012F91C |pStartupInfo = 0012F91C 0012F90C 0012F960 \pProcessInfo = 0012F960 0012F910 7353EA4C msvbvm60.__vbaFreeVar 0012F914 00000008 0012F918 7351C1FB msvbvm60.rtcRandomize 0012F91C 00000044 0012F920 00000000 ...... 0012F968 00000000 0012F96C 0012FA60 0012F970 /0012FA60 0012F974 |0041DA05 RETURN to 卡刀.0041DA05 from msvbvm60.rtcShell
对0012F974行右键 跟踪到反汇编窗口:
// ****** ANTI进程 ****** // (名字随便起的.. )
找到有这里 ,我们手动 修改 那个跳为JMP,
0041D9DC > \DD45 BC fld qword ptr [ebp-0x44] ; 0041D9DF . DC1D C0124000 fcomp qword ptr [0x4012C0] 0041D9E5 . DFE0 fstsw ax 0041D9E7 . F6C4 41 test ah,0x41 0041D9EA . /75 45 jnz short 卡刀.0041DA31 ; //改JMP跳过 ★ 0041D9EC . |8D4D B8 lea ecx,dword ptr [ebp-0x48] 0041D9EF . |894D 88 mov dword ptr [ebp-0x78],ecx 0041D9F2 . |C745 80 08400000 mov dword ptr [ebp-0x80],0x4008 0041D9F9 . |6A 01 push 0x1 0041D9FB . |8D55 80 lea edx,dword ptr [ebp-0x80] 0041D9FE . |52 push edx 0041D9FF . |FF15 E8104000 call dword ptr [<&MSVBVM60.#600>] ; // 这里会打开新进程 0041DA05 . |DDD8 fstp st ; // 返回到这里 0041DA07 . |FF15 28104000 call dword ptr [<&MSVBVM60.__vbaEnd>] ; __vbaEnd 0041DA0D . |FF15 68104000 call dword ptr [<&MSVBVM60.__vbaExitProc>; msvbvm60.__vbaExitProc 0041DA13 . |9B wait 0041DA14 . |68 96DA4100 push 卡刀.0041DA96 0041DA19 . |EB 59 jmp short 卡刀.0041DA74
以0041D9DC ~ 0041D9E7 的HEX 作为特征码搜索:
DD 45 BC DC 1D C0 12 40 00 DF E0 搜索一下看看其他地方还有没??然后又发现一处 :
0041D62C > \DD45 BC fld qword ptr [ebp-0x44] 0041D62F . DC1D C0124000 fcomp qword ptr [0x4012C0] 0041D635 . DFE0 fstsw ax 0041D637 . F6C4 41 test ah,0x41 0041D63A . 75 45 jnz short 卡刀.0041D681 ; //一样改JMP跳过 ★ 0041D63C . 8D4D B8 lea ecx,dword ptr [ebp-0x48] 0041D63F . 894D 88 mov dword ptr [ebp-0x78],ecx 0041D642 . C745 80 08400000 mov dword ptr [ebp-0x80],0x4008 0041D649 . 6A 01 push 0x1 0041D64B . 8D55 80 lea edx,dword ptr [ebp-0x80] 0041D64E . 52 push edx 0041D64F . FF15 E8104000 call dword ptr [<&MSVBVM60.#600>] ; msvbvm60.rtcShell 0041D655 . DDD8 fstp st ; | 0041D657 . FF15 28104000 call dword ptr [<&MSVBVM60.__vbaEnd>] ; \__vbaEnd 0041D65D . FF15 68104000 call dword ptr [<&MSVBVM60.__vbaExitProc>; msvbvm60.__vbaExitProc 0041D663 . 9B wait 0041D664 . 68 E6D64100 push 卡刀.0041D6E6 0041D669 . EB 59 jmp short 卡刀.0041D6C4 0041D66B . C785 7CFFFFFF 0100>mov dword ptr [ebp-0x84],0x1 0041D675 . 8D85 7CFFFFFF lea eax,dword ptr [ebp-0x84] 0041D67B . 50 push eax 0041D67C . E8 8F000000 call 卡刀.0041D710 0041D681 > FF15 68104000 call dword ptr [<&MSVBVM60.__vbaExitProc>; msvbvm60.__vbaExitProc
///爆破注册 ===================================
VB程序没加壳,我们爆破试试, 首先根据症状2打开界面后,搜索相关字符,查找“试用”,可以看到 :
发现有几处敏感的字符:
当前版本为试用版本,试用时间15分钟
当前版本为试用版本,试用时间10分钟
当前版本为已注册版本,永久使用
....
随便点一个上面的字符串进去跟踪 , 这里我选择 永久使用那来下手 来到:
00413910 . /75 10 jnz short 卡刀.00413922 ; //这个会跳过注册,这里NOP
00413912 . |BA 20674000 mov edx,卡刀.00406720 ; 当前版本为已注册版本,永久使用
00413917 . |8D4E 60 lea ecx,dword ptr [esi+0x60]
然后往上翻一路看,就找相关的敏感字串与跳过它的大跳(无short的跳) 。
我们尝试JMP跳过那些代码,注册前的跳NOP掉 ,流程如下:
004130B5 . /0F84 C8000000 je 卡刀.00413183 ; //改JMP跳过 ★
..更新的代码..
00413239 . /0F85 7E010000 jnz 卡刀.004133BD ; //改JMP跳过 ★
..当前版本为试用版本,试用时间15分钟 的代码..
00413459 . /0F84 DC010000 je 卡刀.0041363B ; //改JMP跳过 ★
..当前版本为试用版本,试用时间10分钟 的代码..
00413910 . /75 10 jnz short 卡刀.00413922 ; //NOP掉 ★
00413912 . |BA 20674000 mov edx,卡刀.00406720 ; 当前版本为已注册版本,永久使用
00413917 . |8D4E 60 lea ecx,dword ptr [esi+0x60]
然后F9运行 ,发现已经显示为注册版本了 。
///解除 ANTI注册 ===================================
但不一会就有两个提示,最后一个提示“使用时间已到,请续费”的信息框,点确认后程序就会退出了!并打开一个网页 。
方法:我们对应可下这几个断点:rtcMsgBox ,__vbaEnd ,rtcShell 其中一个都可以。
** 这里我选rtcMsgBox下断,
重新载入程序,重新前面的修改后 F9运行 ,在堆栈窗口右键跟随到这里:
第一个提示:
00415FA7 . FF15 7C104000 call dword ptr [<&MSVBVM60.#595>] ; msvbvm60.rtcMsgBox
00415FAD . 8D45 A4 lea eax,dword ptr [ebp-0x5C]
第二个提示:
0041600F . 51 push ecx
00416010 . FF15 7C104000 call dword ptr [<&MSVBVM60.#595>] ; //BAD信息框
对应如下:
// ****** anti注册的函数 ****** //
跟踪进入 ,修改从头部跳到尾部返回即可:
//* 入口处*// 00415E00 > \55 push ebp ; //改 JMP 004160CE ★ 00415E01 . 8BEC mov ebp,esp 00415E03 . 83EC 0C sub esp,0xC 00415E06 . 68 A6154000 push <jmp.&MSVBVM60.__vbaExceptHandler> ; SE handler installation 00415E0B . 64:A1 00000000 mov eax,dword ptr fs:[0] 00415E11 . 50 push eax ; 00415E12 . 64:8925 00000000 mov dword ptr fs:[0],esp ... 00415FDA . 8945 AC mov dword ptr [ebp-0x54],eax 00415FDD . 8945 BC mov dword ptr [ebp-0x44],eax 00415FE0 . C745 8C 006B4000 mov dword ptr [ebp-0x74],卡刀.00406B00 ; 提醒 00415FE7 . 895D 84 mov dword ptr [ebp-0x7C],ebx 00415FEA . FFD6 call esi ; 00415FEC . 8D55 94 lea edx,dword ptr [ebp-0x6C] 00415FEF . 8D4D D4 lea ecx,dword ptr [ebp-0x2C] 00415FF2 . C745 9C E46A4000 mov dword ptr [ebp-0x64],卡刀.00406AE4 ; 使用时间已到,请续费 00415FF9 . 895D 94 mov dword ptr [ebp-0x6C],ebx 00415FFC . FFD6 call esi ; 00415FFE . 8D4D A4 lea ecx,dword ptr [ebp-0x5C] 00416001 . 8D55 B4 lea edx,dword ptr [ebp-0x4C] 00416004 . 51 push ecx 00416005 . 8D45 C4 lea eax,dword ptr [ebp-0x3C] 00416008 . 52 push edx 00416009 . 50 push eax 0041600A . 8D4D D4 lea ecx,dword ptr [ebp-0x2C] 0041600D . 6A 1A push 0x1A 0041600F . 51 push ecx 00416010 . FF15 7C104000 call dword ptr [<&MSVBVM60.#595>] ; //BAD信息框 00416016 . 8D55 A4 lea edx,dword ptr [ebp-0x5C] 00416019 . 8D45 B4 lea eax,dword ptr [ebp-0x4C] ... 004160BE . 8B4D EC mov ecx,dword ptr [ebp-0x14] 004160C1 . 5F pop edi ; 004160C2 . 5E pop esi ; 004160C3 . 64:890D 00000000 mov dword ptr fs:[0],ecx 004160CA . 5B pop ebx ; 004160CB . 8BE5 mov esp,ebp 004160CD . 5D pop ebp 004160CE . C2 0400 retn 0x4 ; //JMP到这里,段尾就直接返回了
对于这种调用固定的函数去检测的,同样这个函数还可能会有其他检测的,我们采用直接JMP到函数返回处即可!
找到关键处了,重新载入,重新上面的修改后,我们取消所有断点 OD运行后发现程序已经没有问题了,说明我们的思路是正确!^_^
但新问题来了,保存覆盖到本地文件上就运行到滚动条显示“载入系统文件..”那儿就自动退出了。...估计是被检测到修改了。。
这种情况一般是程序带文件自校验 ,我们通常会对CreateFileA / CreateFileW 下断,发现没有断下 。
方法一:找“载入文件”的字符串的关键所在
方法二:对__vbaEnd下段找退出的地方
方法三:使用VB万能断点尝试 , 万能断点特征码:816C2404????????E9??????
根据新症状 滚动条显示,我们用方法一,搜索字符串找“载入系统文件”在下面,还有几个超可疑的字串:

我们双击字符“卡刀.exe”来到段首处下断,
///解除 文件时间效验 ===================================
// ****** 文件时间效验函数 ****** //
修改从头部跳到尾部返回即可:
//* 入口处*// 0041E960 > \55 push ebp ; // JMP 0041EAC7 ★ 0041E961 . 8BEC mov ebp,esp 0041E963 . 83EC 08 sub esp,0x8 0041E966 . 68 A6154000 push <jmp.&MSVBVM60.__vbaExceptHandler> ; SE handler installation 0041E96B . 64:A1 00000000 mov eax,dword ptr fs:[0] 0041E971 . 50 push eax 0041E972 . 64:8925 00000000 mov dword ptr fs:[0],esp 0041E979 . 83EC 7C sub esp,0x7C 0041E97C . 53 push ebx 0041E97D . 56 push esi 0041E97E . 57 push edi 0041E97F . 8965 F8 mov dword ptr [ebp-0x8],esp 0041E982 . C745 FC 90154000 mov dword ptr [ebp-0x4],卡刀4.00401590 0041E989 . 33C0 xor eax,eax 0041E98B . 8D8D 78FFFFFF lea ecx,dword ptr [ebp-0x88] 0041E991 . 8945 E0 mov dword ptr [ebp-0x20],eax 0041E994 . 8945 D0 mov dword ptr [ebp-0x30],eax 0041E997 . 8945 BC mov dword ptr [ebp-0x44],eax 0041E99A . 8945 B8 mov dword ptr [ebp-0x48],eax 0041E99D . 8945 A8 mov dword ptr [ebp-0x58],eax 0041E9A0 . 8945 98 mov dword ptr [ebp-0x68],eax 0041E9A3 . 8945 88 mov dword ptr [ebp-0x78],eax 0041E9A6 . 8D45 BC lea eax,dword ptr [ebp-0x44] 0041E9A9 . 50 push eax 0041E9AA . 8D55 A8 lea edx,dword ptr [ebp-0x58] 0041E9AD . BF 08000000 mov edi,0x8 0041E9B2 . 51 push ecx 0041E9B3 . 52 push edx 0041E9B4 . C745 80 74794000 mov dword ptr [ebp-0x80],卡刀4.00407974 ; 卡刀.exe <- 找到这儿 0041E9BB . 89BD 78FFFFFF mov dword ptr [ebp-0x88],edi 0041E9C1 . FF15 2C114000 call dword ptr [<&MSVBVM60.__vbaVarCat>] .... 0041E9E7 . FF15 74114000 call dword ptr [<&MSVBVM60.#577>] ; // rtcFileDateTime //取文件创建时间 0041E9ED . 8D95 78FFFFFF lea edx,dword ptr [ebp-0x88] 0041E9F3 . 8D4D 98 lea ecx,dword ptr [ebp-0x68] 0041E9F6 . C745 80 88794000 mov dword ptr [ebp-0x80],卡刀.00407988 ; YYYYMMDDHHMMSS 0041E9FD . 89BD 78FFFFFF mov dword ptr [ebp-0x88],edi 0041EA03 . FF15 A0114000 call dword ptr [<&MSVBVM60.__vbaVarDup>] ; 0041EA09 . 6A 01 push 0x1 0041EA0B . 8D45 98 lea eax,dword ptr [ebp-0x68] 0041EA0E . 6A 01 push 0x1 0041EA10 . 8D4D A8 lea ecx,dword ptr [ebp-0x58] 0041EA13 . 50 push eax 0041EA14 . 8D55 88 lea edx,dword ptr [ebp-0x78] 0041EA17 . 51 push ecx 0041EA18 . 52 push edx 0041EA19 . FF15 50104000 call dword ptr [<&MSVBVM60.#660>] //msvbvm60.rtcVarFromFormatVar //格式化时间 步过后的堆栈信息: 0012FA48 73519A69 msvbvm60.__vbaObjSet 0012FA4C 00164988 0012FA50 00F41314 0012FA54 00000000 0012FA58 00000008 0012FA5C 001603A0 0012FA60 00407988 UNICODE "YYYYMMDDHHMMSS" 0012FA64 774FD010 RETURN to ole32.774FD010 from ntdll.RtlSizeHeap 0012FA68 00120008 0012FA6C 00F41314 0012FA70 00169A44 UNICODE "20140411044417" //__vbaVarTstEq判断2个variant, 如果"相等", 则返回-1(vb中boolean类型,用-1表示true,用0表示false) 0041EA4C . C745 80 AC794000 mov dword ptr [ebp-0x80],卡刀.004079AC ; //原时间串 20140409122418 0041EA53 . 52 push edx 0041EA54 . 50 push eax 0041EA55 . C785 78FFFFFF 0880>mov dword ptr [ebp-0x88],0x8008 0041EA5F . FF15 B4104000 call dword ptr [<&MSVBVM60.__vbaVarTstEq>] ; 两个时间值比较 0041EA65 . 66:F7D8 neg ax 0041EA68 . 1BC0 sbb eax,eax 0041EA6A . 68 ABEA4100 push 卡刀.0041EAAB ..... 0041EAA8 . FFD6 call esi ; <&MSVBVM60.__vbaFreeVar> 0041EAAA . C3 retn 0041EAAB . 8B4D 0C mov ecx,dword ptr [ebp+0xC] 0041EAAE . 66:8B55 CC mov dx,word ptr [ebp-0x34] 0041EAB2 . 5F pop edi 0041EAB3 . 5E pop esi 0041EAB4 . 66:8911 mov word ptr [ecx],dx 0041EAB7 . 8B4D F0 mov ecx,dword ptr [ebp-0x10] 0041EABA . 33C0 xor eax,eax 0041EABC . 64:890D 00000000 mov dword ptr fs:[0],ecx 0041EAC3 . 5B pop ebx 0041EAC4 . 8BE5 mov esp,ebp 0041EAC6 . 5D pop ebp 0041EAC7 . C2 0800 retn 0x8 ; //跳到这里,尾部
步过到0041E587程序就结束了,很明显0041E57A就是调用效验函数的,对付效验函数不要手软的,
老样子在调用的地方0041E57A下断,重新载入运行,F7进入函数,修改从头跳到尾
0041E57A . FF92 04070000 call dword ptr [edx+0x704] ; //这调用效验文件函数的
0041E580 . 66:837D B0 00 cmp word ptr [ebp-0x50],0x0 ; //返回到这里
0041E585 . 75 06 jnz short 卡刀.0041E58D ; //改JMP ★
0041E587 . FF15 28104000 call dword ptr [<&MSVBVM60.__vbaEnd>] ; 程序结束
还有一个简单的方法,不用理文件时间效验这块,因为作者把名字写死了 只获取卡刀.exe的时间 ..
所以只要放一个没修改过的卡刀.exe在目录下,然后把破解后的程序改一下名 Crack.exe 即可完成破解了l_l .
软件写的有点鸡肋,全程几乎JMP过就可以了,功能能不能用就不知道了, 小菜只是演示如何破解注册和校验机制 。谢谢观看。
小结: 跟着程序走,按症状,举一反三。多积累,多上机调试^_^
简单破文 , 高手飘过 ~
试练品 : http://pan.baidu.com/s/1jG9Nep4
