![]() |
谈谈VB程序的破解(续)(2千字) |
上次写了VB程序的破解一文,这次因为发现那个方法不是通用的,所以特别写一篇续.其实我这2篇文章并不是专门用于破解在启动时检测的程序的,我只是想说一个方法,利用VB中的事件,于是轻松找到程序的关键,各位要是有兴趣可以跟一下,很简单.废话少说,运行VB6,新建一个工程,然后添加一个模块,双击模块,删除Form,再输入: Sub Main MsgBox ("test!") End End Sub 然后编译成本机代码,在这种情况下,我以前说的办法就没有用了,大家还是跟我来吧. 还是TRW载入,然后慢慢跟就到了这里. ...... 0187:6600DE5B FF1518110066 CALL `KERNEL32!GetStartupInfoA` 0187:6600DE61 0FB745D0 MOVZX EAX,WORD [EBP-30] 0187:6600DE65 A3D8F71066 MOV [6610F7D8],EAX 0187:6600DE6A FF35CCF61066 PUSH DWORD [6610F6CC] 0187:6600DE70 56 PUSH ESI 0187:6600DE71 BE70F41066 MOV ESI,6610F470 0187:6600DE76 8BCE MOV ECX,ESI 0187:6600DE78 E860000000 CALL 6600DEDD //进去 ...... (省略过程) ...... 0187:******** FF9694000000 CALL NEAR [ESI+94] //这里F8进去就返回程序领空了,我们又成功的停在了VB代码开始的地方. 0187:******** 8D45D4 LEA EAX,[EBP-2C] 0187:******** 50 PUSH EAX 0187:******** E807030000 CALL 66014710 0187:******** 6A01 PUSH BYTE +01 0187:******** 58 POP EAX 0187:******** 5F POP EDI 0187:******** 5E POP ESI 0187:******** C9 LEAVE 0187:******** C20400 RET 04 ...... 0187:00401628 6A00 PUSH BYTE +00 0187:0040162A 50 PUSH EAX 0187:0040162B FF151C104000 CALL `MSVBVM60!rtcMsgBox` //这里就是MsgBox了 0187:00401631 8D4DB0 LEA ECX,[EBP-50] 0187:00401634 8D55C0 LEA EDX,[EBP-40] 0187:00401637 51 PUSH ECX 0187:00401638 8D45D0 LEA EAX,[EBP-30] 0187:0040163B 52 PUSH EDX 0187:0040163C 8D4DE0 LEA ECX,[EBP-20] 0187:0040163F 50 PUSH EAX 0187:00401640 51 PUSH ECX 0187:00401641 6A04 PUSH BYTE +04 0187:00401643 FF1508104000 CALL `MSVBVM60!__vbaFreeVarList` 0187:00401649 83C414 ADD ESP,BYTE +14 0187:0040164C FF150C104000 CALL `MSVBVM60!__vbaEnd` //然后程序End 0187:00401652 6876164000 PUSH DWORD 00401676 0187:00401657 EB1C JMP SHORT 00401675 后记: 还有一种情况,是某个Crackme,是用VB6编写的,我用了2种办法都不能断下来(其实是作者不按常理出牌).自己新建一个工程,然后编译为本机代码,试试看,还能不能用上面的办法断下来?也就是说,在程序启动时(或检验注册码前)没有任何的事件,真的是很搞笑的一件事,这样的程序,跟踪只会在Msvbvm60.dll中,然后用ShowWindow显示窗口,也就是说程序根本不是在启动时进行检测的(或者说检测时没有产生任何事件?可能吗?). 我以为按我的方法,只要在VB程序中使用了事件或模块,无论是程序刚启动或已运行,只要用TRW在这2处下了断点,都能轻易的找到程序的关键处.如果各位有什么意见和看法,还请指正 |